なぜゲストの時刻はずれるのか? - Active Directory 仮想化 (2)
(1) Active Directory ドメインコントローラ (AD) の仮想化は NG?
(2) なぜゲストの時刻はずれるのか?
(3) AD 仮想化に正式対応する Windows Server “8”
(4) Windows Server 2012 AD 仮想化対応のまとめ
このブログにカウンタを設置してちょうど1年が経ちました。1年間で約30万ものアクセスをいただき大変感謝です。
今回は、その中でもアクセスの多い「Active Directory (AD) の仮想化」について、私の専門であるハードウェアの視点から技術論を綴ってみたいと思います。
Active Directory ドメインコントローラの仮想化の現状
一年前の記事 Active Directory ドメインコントローラ (AD) の仮想化は NG? で
「冗長化した AD 群のうち "親" となる一台は必ず物理で」と結論づけたのですが、ここは現在においても Microsoft 社のサポート見解も含めて変更ありません。
ただ、当該記事では「二台目以降の AD の仮想化」については触れませんでした。
二台目の移行の DC の仮想化については下記記事・ドキュメントが良く纏まっていますのでガイドラインにされると良いと思います。
Microsoft Tech Fielders - Active Directoryドメインサービスを仮想環境で使おう
http://www.microsoft.com/japan/powerpro/TF/column/sk_03_1.mspx
VMware - Virtualizing a Windows Active Directory Domain Infrastructure
http://www.vmware.com/resources/techresources/10029
なお、Windows Server 8 からは、ある技術に対応するハイパーバイザーであれば AD の仮想化がサポート されるそうです。*1
そもそも、仮想化するとなぜ時間がずれてしまうのか?
どの資料も NG の理由として「仮想化すると時刻がずれるから」とは書いてあるのですが、ズレる理由について触れている文献はなかなか無いようです。自分も 以前の記事 で「タイムスライスが」と端折ってしまいましたが、ここはどうも注目を浴びているようですので、理由の1つを分かりやすく書き残しておきたいと思います。
プロセッサコアが4つ搭載しているサーバー上で、
vCPU を1個ずつアサインした仮想マシンをイメージしてみてください。
仮想マシンを4個動かす場合、各々がプロセッサコアを占有することができます。
(ハイパーバイザーのCPU消費はひとまず無視してください)
次に、vCPU がオーバーコミット状態*2 の場合について考えてみます。
vSphere も Hyper-V も vCPU はオーバーコミット設定できますが、あるクロックの瞬間コアは1つの処理しかこなせません。全ての仮想マシンを同時処理できないため、ハイパーバイザーは仮想マシンを強制的にフリーズ(プチフリ)させます。
フリーズしすぎると問題があるため、一定時間が経つとフリーズ対象を切り替えます。開発経験のある方は「コンテキストスイッチ」をイメージすると分かりやすいはず。
これをタイムラインに表すと、次のようになります。
図を拡大してみます。仮想マシンは自分が気づかないうちに強制フリーズさせられていたので、ゲストの時刻が実時刻から遅れてしまいました。
実際のタイムスライスはコンマ msec 以下ですが、延々と繰り返されるために、
ゲストの時刻は「塵も積もれば...」的にどんどんずれていってしまうのです。
「vCPU をオーバーコミットさせなければ良い」と感じるかもしれません。
しかし、実際にはハイパーバイザーの CPU 消費や、特権モード (ring0) の割込要求も発生するため、vCPU をオーバーコミットしていなくても時間はずれていきます。
逆に、vCPU をオーバーコミットさせすぎると、時刻がズレ易くなるうえ、処理コアがコロコロ変わるためにプロセッサ・キャッシュが使われづらくなります。非効率なので要注意です。