vine-users ML アーカイブ



[vine-users:078702] Re: VMwareServer での時刻

  • From: Shunta Susuki <shunta@xxxxxxxxxxxxxxxx>
  • Subject: [vine-users:078702] Re: VMwareServer での時刻
  • Date: Mon, 25 Aug 2008 22:56:30 +0900
下記内容の情報がこの問題に該当すると思います。参考になれば良いのですが、、。

***以下引用***

Core2 Quad で VMware Server の時刻が進む件は解決したCommentsAdd
Startsakakoemum_kazoo
http://d.hatena.ne.jp/dayflower/20071207/1197004405


VMware Server 1.0.4 on Core2Quad で guest の時刻が進みまくり - daily
dayflowerという現象があったのですが,なんとか解決にこぎつけることができ
ました。

原因

* NEC Express 5800 / 110Gd の BIOS が(EIST をきちんとサポートしていない
ためか)おかしな CPU frequency を返す
* EIST 無効時は Core2 Quad Q6600 は 2.4GHz で動いている
* ホスト側は(自力でキャリブレーションしているのか)2.4GHz であると認識
している(∴ホストの時刻は狂わない)
* VMware Server は ACPI 経由で CPU frequency を取得している
* 先に上げたように ACPI 経由の CPU frequency 取得がおかしいので(フルパ
ワー時)900MHz であると認識される
* VMware Server は guest も host も 900MHz で動いているとみなす
* 実際には 2.4GHz をベースとして割り込みが発生しているので 2.4GHz /
900MHz(≒2.67倍)の割り込みが guest に伝達する
* このため clocksource を何にしたところで,最悪 2.67 倍のスピードで時刻
が進んでいく(実際には割り込みのとりこぼし lost ticks が発生するのでそこ
まで早くはならない)

対策

* host のクロック変動を避けるため host の cpuspeed サービスを停止しておく
* Host Power Management Causes Problems with Guest Timekeeping on Linux
Hosts に従って /etc/vmware/config に正しい host CPU frequency を設定しておく
* guest のカーネルパラメータに notsc clocksource=pit を追加し,guest の
kernel サイドのアグレッシブな時刻補正を無効にしておく*1
* guest に VMware Tools をインストールして syncTime を有効にする

以下調査経過が長々と続きます。
調査結果

まずは /proc/cpuinfo を見てみます。

# cat /proc/cpuinfo

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
stepping : 11
cpu MHz : 600.000
cache size : 4096 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm
constant_tsc
pni monitor ds_cpl vmx est tm2 cx16 xtpr lahf_lm
bogomips : 4803.45
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

CPU が EIST をサポートしていること,また現在のクロックが 600MHz である
(と認識されている)ことがわかります。

ひょっとすると cpuspeed サービスが自動的にクロックを落としているのでしょ
うか。

# service cpuspeed status

Frequency scaling enabled using ondemand governor

ondemand という governor によってクロック周波数が決まっていることがわか
ります。どのような governor があり,どのような意味をもつかについては
cpufreq-selectorのメモ (blog@xxxxxxxxxxxx)が詳しいです。

さて,この環境ではどのような周波数レンジがサポートされているのでしょう
か。 /sys/devices/system/cpu/cpu0/cpufreq を覗くといろいろわかります。

# cd /sys/devices/system/cpu/cpu0/cpufreq

# ls -F

affected_cpus ondemand/ scaling_driver
cpuinfo_cur_freq scaling_available_frequencies scaling_governor
cpuinfo_max_freq scaling_available_governors scaling_max_freq
cpuinfo_min_freq scaling_cur_freq scaling_min_freq

# for f (*); [ -f $f ] && ( echo -n "$f: "; cat $f )

affected_cpus: 0 1 2 3
cpuinfo_cur_freq: 600000
cpuinfo_max_freq: 900000
cpuinfo_min_freq: 600000
scaling_available_frequencies: 900000 600000
scaling_available_governors: ondemand userspace performance
scaling_cur_freq: 600000
scaling_driver: centrino
scaling_governor: ondemand
scaling_max_freq: 900000
scaling_min_freq: 600000

これだけでもある程度の情報はわかりますが,これらの情報を見やすく整形して
くれるのが cpufreq-info というコマンドです(標準ではインストールされてい
ません)。

# yum install cpufreq-utils

# cpufreq-info

cpufrequtils 002: cpufreq-info (C) Dominik Brodowski 2004-2006
Report errors and bugs to linux@xxxxxxxx, please.
analyzing CPU 0:
driver: centrino
CPUs which need to switch frequency at the same time: 0 1 2 3
hardware limits: 600 MHz - 900 MHz
available frequency steps: 900 MHz, 600 MHz
available cpufreq governors: ondemand, userspace, performance
current policy: frequency should be within 600 MHz and 900 MHz.
The governor "ondemand" may decide which speed to use
within this range.
current CPU frequency is 600 MHz (asserted by call to hardware).

...... snip ......

現状で ondemand, userspace, performance の3種類の governor があり,CPU
clock は 600MHz と 9000MHz の2種類が設定されうる,ということがわかります。

えっ?最高で 900MHz なの?

念のために dmesg で確認してみると……

# dmesg

...... snip ......
time.c: Using 14.318180 MHz WALL HPET GTOD HPET timer.
time.c: Detected 2400.089 MHz processor.
...... snip ......

一応 2.4GHz のプロセッサであることが認識されています。これで host の時刻
が狂うことはないはずです。

ですがなぜ 600MHz, 900MHz なのでしょう。実力をフルに発揮できていないので
しょうか。

と思って調べたところ,まったく同じような現象に遭遇している例を発見しました。

なぜ表示されるクロックが900MHz、600MHzという奇妙な値なのか、ということに
関して、Intel社に在籍しているacpi-cpufreqの開発者の方にメールで質問を
送ってみたところ、BIOSがエクスポートしている値がおかしいのではないか、と
の回答を得ました。

このマザーボードで使用しているBIOSではEISTで指定可能な周波数の値を設定す
ることは出来ないことと、周波数とベンチマークの比率に整合性がとれていると
いうことを考えると、BIOSに問題があると推測されます。現時点ではそれ以上の
ことは分かっていません。
Linux、クラスタ、1Uサーバのクラスターコンピューティング(株) - Xeon 3060
サーバcpufreqの設定について

うーむ BIOS が怪しいのですか。たしかに Q6600 は 110Gd で正式にサポートさ
れている CPU ではありませんし,EIST の項目もないので怪しい。ただ引用元の
情報を見ていただければわかると思いますが,表示上おかしいだけで,実際には
900MHz のときに 2.4GHz で動いているようです。

引用元によると acpi-cpufreq を disable すると OK になるそうですが,手元
の環境で cpuspeed を disable してリブートをかけてみても,900MHz にはなる
ものの 2.4GHz にはなりませんでした。

この誤認識がどのような弊害をもたらしているかですが。

VMware Server の vmware.log から抜粋します。

Dec 06 18:04:09: vmx| KHZEstimate 900000
Dec 06 18:04:09: vmx| MHZEstimate 900

このように 900MHz だと推定されています。それで guest の dmesg の結果ですが,

time.c: Using 3.579545 MHz WALL PM GTOD PM timer.
time.c: Detected 899.923 MHz processor.

やはり,guest も 900MHz のクロックで動作しているとみなされているようで
す。このせいで時刻がどんどん先にすすんでいるようです。

では,対策は,というと VMware の Knowledge Base にありました。

To prevent guest clocks from running too quickly, specify the correct
maximum host CPU speed in your global configuration file,
/etc/vmware/config. If this file exists, edit it with a text editor,
adding the lines described below. The file may not exist. If it does not
exist, create it as a plain text file.

The example presented here assumes that the host computer has a maximum
speed of 1700MHz. The first line is the most important one. It should be
your host computer's maximum speed in kHz -- that is, its speed in MHz
times 1000, or its speed in GHz times 1000000. Add the following lines
to your global configuration file:

host.cpukHz = 1700000
host.noTSC = TRUE
ptsc.noTSC = TRUE

Host Power Management Causes Problems with Guest Timekeeping on Linux Hosts

本来は SpeedStep(や EIST や PowerNow や Cool'n'Quiet)で host CPU のク
ロックが変動する際に用いるものですが,今回のように誤認識されている場合に
もこのクロック数強制設定が使えそうです。

そこで上記設定を /etc/vmware/config に書き足し,念のために guest の
kernel options で notsc と clocksource=pit を追加,そして VMware Tools
の時刻同期機能を使ってみました。

その結果。

まず vmware.log ですが,

...... snip ......

Dec 07 10:23:19: vmx| DICT --- CONFIGURATION

...... snip ......

Dec 07 10:23:19: vmx| DICT --- USER PREFERENCES
Dec 07 10:23:19: vmx| DICT --- USER DEFAULTS
Dec 07 10:23:19: vmx| DICT --- HOST DEFAULTS

...... snip ......

Dec 07 10:23:19: vmx| DICT host.cpukHz = 2400000
Dec 07 10:23:19: vmx| DICT host.noTSC = TRUE
Dec 07 10:23:19: vmx| DICT ptsc.noTSC = TRUE
Dec 07 10:23:19: vmx| DICT --- SITE DEFAULTS

...... snip ......

Dec 07 10:23:19: vmx| KHZEstimate 2400000
Dec 07 10:23:19: vmx| MHZEstimate 2400

...... snip ......

Dec 07 10:23:19: vmx| TimeTracker host to guest rate conversion
3949280226459 @
2400000000Hz -> 3949280226459 @ 2400000000Hz

...... snip ......

見事に 2.4GHz と認識されています。

さて,guest の dmesg です。

time.c: Using 3.579545 MHz WALL PM GTOD PM timer.
time.c: Detected 2399.846 MHz processor.

おお,こちらでも無事 2.4GHz として認識されたことがわかります。

念のために guest で一度 ntpdate しておいて,しばらくしてから時刻を調べて
みます。

% /sbin/hwclock && date
2007年12月07日 10時38分44秒 -0.981510 秒
2007年 12月 7日 金曜日 10:38:44 JST

hwclock というのは RTC の時刻を調べるもので実質 host 側の時刻を調べるも
のだと思って下さい*2。後者の date については文字通り local time source
の時刻を調べるものです。

結果をみると,ほぼ同じ時刻を刻んでいることがわかります。無事きちんと時刻
を同期させることができるようになりました。

-- 
須々木俊太