vmwareでゲストのLinuxの時計がやたらとくるう

ゲストLinuxの時計がやたらにくるうので調べてみました。

Vineの場合はカーネルパラメーターに
nosmp noapic nolapic
を追加したら直りました。

(例)/etc/grub.conf
kernel /vmlinuz ro root=LABEL=/ resume2=swap:/dev/hda3 nosmp noapic nolapic

(注)Fedora8でnosmpをつけるとブートできなくなる

これをつける前の/proc/interrupts
CPU0
0: 1643398 IO-APIC-edge timer
1: 2573 IO-APIC-edge i8042
7: 0 IO-APIC-edge parport0
8: 2 IO-APIC-edge rtc
9: 0 IO-APIC-level acpi
12: 240437 IO-APIC-edge i8042
14: 22592 IO-APIC-edge ide0
15: 61737 IO-APIC-edge ide1
16: 21 IO-APIC-level BusLogic BT-958
17: 36950 IO-APIC-level eth0
18: 185967 IO-APIC-level Ensoniq AudioPCI
NMI: 0
LOC: 1643457
ERR: 0
MIS: 0

つけた後
CPU0
0: 44155 XT-PIC timer
1: 146 XT-PIC i8042
2: 0 XT-PIC cascade
7: 0 XT-PIC parport0
8: 1 XT-PIC rtc
9: 112 XT-PIC acpi, Ensoniq AudioPCI
10: 56 XT-PIC eth0
11: 21 XT-PIC BusLogic BT-958
12: 4049 XT-PIC i8042
14: 5567 XT-PIC ide0
15: 1152 XT-PIC ide1
NMI: 0
LOC: 0
ERR: 0
MIS: 0

タイマー割り込みがやたら多かったのが減りました。

以下覚書

まずvmwareのことはされおいて、OSがどうやって時刻を管理しているか。

・OS起動時には、BIOSやNTPDで時刻を設定する。

・その後は定期的にやってくる割り込みによって、 時刻を増やす。

つまり1秒に100回の割り込みがくることになっていれば、割り込み処理において、時刻を1/100秒増やせばよい。しかしOSが忙しいと、この処理に1/100秒以上かかってしまい次の割り込みが無視される。その結果時刻が遅れることになる。

VMは本来ならこの割り込みを発生させなければならないが、そんなことしてると大変らしいので、うまくごまかしているらしい。そのごまかし方の1つがホストのタイマー割り込みが来るまで、VMから割り込みを発生させない方法のようです。 しかしそれだと当然ゲストOSの時刻が遅れるので、そのときにこれまで溜まっていたはずの割り込み(backlog)を一気に発生させるようです。しかしホストが重かったりして、充分に割り込みをさせることができない場合、それが60秒を超えると、ホストの時刻と動機を実行する(vmware toolsの機能が有効な場合)ようです。

ちなみにWindowsの場合1秒に1000回、Linux2.6の場合も同じ、ただしLinuxでSMPが有効だともっと増えるらしいです。

http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1420

そしてこれを直すには、ゲストのレートを減らすか、ホストのレートを増やすかだそうです。

自分の環境だとくるうのは、システムクロックだけで、ハードウェアクロックは正常でした(ゲストOSのハードウェアクロックはホストマシンの時刻を見ているからかも)

Leave a Reply

Your email address will not be published. Required fields are marked *

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)