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])

 

#define HZ 100

 

もしくは、CONFIG_HZ_1000=yをCONFIG_HZ_100=yに変更して再コンパイルする。

 

タイマー割り込みの回数を確認する

 

さて、3の設定が効いているかどうかを確認する方法。dividerの設定は起動後に/proc/cmdlineでも確認できるが、割り込みの回数自体も/proc/interruptsで表示される累積の割り込み回数を何度か表示して、差分と経過時間から計算することができる。(SLES10SP2のように、ディストリビューションによっては最初から/proc/sys/kernel/HZに示されているケースもある。)

 

例えば、下記はdivider=10を指定したRHEL5.1で、10秒毎に/proc/interruptsの結果を表示した例。割り込みレベル0もしくはLOCの差を10で割ると、約100回の割り込みが発生したことがわかる。つまり、割り込み回数がデフォルトの1000から100になっていることがわかる。

 

 

root@localhost ~# /sbin/hwclock

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

 

 

 

なお、Windowsではperfmonでinterrupts/secという項目があるので、こちらで同様の計算ができるが、タイマー割り込みの回数だけを抜き出す方法は不明。