仮想化でプリセールスしてるSEの一日

VMware から Azure まで、インフラや仮想化の最新情報をベンダー色をできるだけ抑えて綴っていきます

なぜゲストの時刻はずれるのか? - Active Directory 仮想化 (2)

f:id:ogawad:20190203195637p:plain:right

(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 をオーバーコミットさせすぎると、時刻がズレ易くなるうえ、処理コアがコロコロ変わるためにプロセッサ・キャッシュが使われづらくなります。非効率なので要注意です。


Hyper-V と vSphere の CPU スケジューリングの違い

CPU スケジューリングについては、Hyper-V と vSphere で動作が異なります。
Hyper-V は意外にも処理コアの切替が非常に高速です。普段から積極的に切り替える動きを取るくらいで、オーバーコミット状態でもロスが少ない特性があります。
vSphere は切替処理についてはあまり得意ではないようで、
できる限り切替を避けてプロセッサ・キャッシュを活かす動きを取ります。
性能を追求する場合、オーバーコミット状態はできれば避けたほうが良いです。
(ハードウェアの専門家として個人見解)

*1:2012.04.06 追記

*2:実際のコア搭載数より vCPU アサイン総数が多い状態