Windows 7 の Windows XP Mode、Windows Virtual PC または Virtual PC 2007 上のゲスト OS では、対話的な操作全般が遅延する場合がある
http://support.microsoft.com/kb/978209/ja
というKBがマイクロソフトから出ています。これは、ゲストOSの操作が遅延することがあるというものですが、実は時刻同期にも影響を及ぼすことがわかりました。
さて、この原因は何かを考察していきます。
そもそもゲストOSの時刻はハードウェアよりTSC(ITSC)、LAPIC-Timerを通じてハイパーバイザにわたり、ハイパーバイザがTimer Emulation を行いゲストに時刻を渡します。
この関係で、ゲストの時刻がずれる場合があります。そこで統合サービスを入れると次のことを行います。
- ハイパーバイザ 形式の仮想環境で想定されるゲストOSの時刻遅れを補正
- ゲストOSの時刻が遅れた場合、ホストOSの時刻と同期
次に考えなくてはならないのが、省電力状態からゲストの時刻に対して影響を受ける場合があるのです。
C-Stateは各コアのアクティブなプロセスがなくなりアイドル状態になったときにその状態を遷移させて(C0~C6)、アイドル時の消費電力を0Wに限りなく近づけることにより消費電力を削減する機能になります。
ハイパーバイザではC-StateがC0~C3までの遷移を制御します。その際、その情報がBIOSに渡されます。しかし、CPUではC0~C6まで存在するものもあるのでBIOSでリマッピングを行います。
このように、BIOSからの制御でCPUにC-Stateが伝わることになります。
この例ではハイパーバイザではC3ですが、実際のCPUではC6に遷移しているのがわかります。
LPPIC TimerやTSCはC3よりもDeepな状態ではClockは停止されます。ITSCはR2からサポートしており、ITSCが使えればClockは止まりません。
Time-Stamp Counter(TSC)
- Constant TSCはプロセッサのコアが周波数を変えても一定の時刻で TSC を刻む。Pentium4 以降に導入される。
- Invariant TSCは Constant TSC の一定性に加え、 各種節電モードに対しても一定の時刻で TSC を刻む。 そのため実時間タイマーとして使用することも可能。 主に Core i7 以降に導入。
Blog:[CPU] Core i7 の Turbo Boost 機能から抜粋しましたhttp://www.nminoru.jp/~nminoru/diary/2010/04.html#2010-04-02
ですので、時刻同期は問題なく行われます。ハイパーバイザ は C2-State を利用する限り、Clock は停止しないと考えています。
しかし、BIOSでのリマッピングがC2=C3だと、ハイパーバイザはC2なのでClock は停止しないと考えていまが、CPUはC3となりClockは停止する現象が発生します。
この現象はハイパーバイザ上でC2/C3-Stateを利用しないよう設定を行うことにより一時的には回避可能になります。
ホストに対して C3/C2-State を無効化する設定
HKLM¥System¥CurrentControlSet¥Control¥Processor
名: Capabilities
型: DWORD
値: 0x0007e666 (Hyper-V 1.0)
値: 0x0007e066 (Hyper-V 2.0)
しかし、この設定を行うことにより消費電力効果が劣化する可能性があるのでBIOSでの変更ができるのであれば、それを行うことが望ましいことになります。
サーバーなどは常に動いていることが多いので、なかなかこのような現象に合うことはないと思われますが、VDI環境で使用しているゲストOSなどは、使用していないときは、省電力機能が働きC-StateのDeepなステータスに変化する可能性が十分あります。そうなると復帰に多少の時間がかかり、KBのような現象が起こります。さらに、時刻が遅れるという現象も大いに考えられますね。
コメント
わかりやすい。
自分なりに噛み砕いて整理してみました。間違いなどがありましたらご指摘お願いしますね