LinuxゲストOSでの時刻同期
LinuxゲストOSでは、Kernelのバージョンによって時刻のずれを避けるための考慮が必要だったりする。最も一般的な設定としては、下記の3つ。
1.VMware Toolsの時刻同期機能を有効にする
これはESX3.5であれば、VI Clientで仮想マシンの設定項目に存在する「ホストとゲスト時間を同期」にチェックを入れるか、VMware Toolsの設定画面で有効にする。
2.grub.confでタイマーデバイス選択を制御する
かつては何を書くかで議論が絶えなかったが、今は下記の表であてはまるものをとりあえず盲目的に書いておく。
http://kb.vmware.com/kb/1006427
3.タイマー割り込みの回数を少なくする (kernel2.6系のみ)
これが一番厄介だが効果は劇的だったりする。kernel2.6系では、カーネルコンパイル時のオプションに1秒間の割り込み回数が100,250,1000の3種類が選べる。Novel SLES10SP2では250になっているが、RHEL4やRHEL5は1000になっている。特にVirtual SMP構成の場合は、CPUの分だけLOCの割り込みが倍増するため影響が大きい。
REHL4.7、5.1以降(CentOSもOK)であれば、2のKBにも記載されているようにgrubのdivider=10だけでよい。
だが、それ以外についてはkernelのヘッダファイルを修正して再コンパイルする必要がある。
具体的には、/usr/src/linux-2.6/include/asm-i386/param.hのHZの定義を下記のように修正する。(詳細はhttp://kb.vmware.com/kb/1420)
タイマー割り込みの回数を確認する
さて、3の設定が効いているかどうかを確認する方法。dividerの設定は起動後に/proc/cmdlineでも確認できるが、割り込みの回数自体も/proc/interruptsで表示される累積の割り込み回数を何度か表示して、差分と経過時間から計算することができる。(SLES10SP2のように、ディストリビューションによっては最初から/proc/sys/kernel/HZに示されているケースもある。)
例えば、下記はdivider=10を指定したRHEL5.1で、10秒毎に/proc/interruptsの結果を表示した例。割り込みレベル0もしくはLOCの差を10で割ると、約100回の割り込みが発生したことがわかる。つまり、割り込み回数がデフォルトの1000から100になっていることがわかる。
Sat 03 Jan 2009 05:57:12 PM JST -0.686850 seconds
--root@localhost ~--# date
Sat Jan 3 17:57:12 JST 2009
--root@localhost ~--# cat /proc/interrupts
CPU0
0: 262551 IO-APIC-edge timer
1: 475 IO-APIC-edge i8042
6: 5 IO-APIC-edge floppy
7: 0 IO-APIC-edge parport0
8: 6 IO-APIC-edge rtc
9: 0 IO-APIC-level acpi
12: 7455 IO-APIC-edge i8042
14: 24515 IO-APIC-edge ide0
169: 9294 IO-APIC-level ioc0
177: 1891 IO-APIC-level vmxnet ether
NMI: 0
LOC: 262605
ERR: 0
MIS: 0
--root@localhost ~--# sleep 10
--root@localhost ~--# cat /proc/interrupts
CPU0
0: 263557 IO-APIC-edge timer
1: 475 IO-APIC-edge i8042
6: 5 IO-APIC-edge floppy
7: 0 IO-APIC-edge parport0
8: 6 IO-APIC-edge rtc
9: 0 IO-APIC-level acpi
12: 7455 IO-APIC-edge i8042
14: 24610 IO-APIC-edge ide0
169: 9306 IO-APIC-level ioc0
177: 1957 IO-APIC-level vmxnet ether
NMI: 0
LOC: 263609
ERR: 0
MIS: 0
--root@localhost ~--# date
Sat Jan 3 17:57:22 JST 2009
--root@localhost ~--# /sbin/hwclock
Sat 03 Jan 2009 05:57:23 PM JST -0.913159 seconds