VMware ESXにおけるメモリ管理(6) - Dynamic Memory on Hyper-V 実装編

VMware ESXにおけるメモリ管理』シリーズ
(1) - 序:他のリソースとの違いはなに?
(2) - 仮想化インフラにおけるメモリ管理って?
(3) - メモリに関する仮想化支援機能(Intel EPT/VPID, AMD RVI/Tagged TLB)
(4) - メモリを割り当てるのは簡単だが、回収するのは難しい
(5) - 透過的ページ共有
…の続きです。

VMware ESXにおける…といいつつ、今回は主にMicrosoft Hyper-VにおけるDynamic Memoryの話でございます(^_^;)。
VMware ESXは透過的ページ共有によりメモリの効率的な利用を実装していますが、Hyper-Vではこれまでメモリに対してHypervisorレベルで実装された効率化技術はありませんでした。よって、10GBのメモリを実装したホスト上では、その範囲内でしか仮想マシンに対してメモリを割り当てることはできませんでした。しかし、Windows Server 2008 R2 SP1からはDynamic Memoryという名称でメモリ管理技術がついに実装されることになりました。元々はHyper-Vリリース時から実装が予定されていた機能でしたが、やっとというかたちでの登場ということになります(正式版のリリースは来年ですが…)。
Microsoftはメモリ管理機能として、VMware ESXにおける透過的ページ共有に該当する機能は実装しないことを選択しました*1。理由としては前回のエントリーで書いたとおり、「今後ラージページが標準となれば透過的ページ共有に効果はほとんどなくなる」とMicrosoftも考えたためだと思われます。

Hyper-VはESXと比較すると、サポートするゲストOSとして、特にレガシーOSに対するサポートがほとんどない点が課題としてありましたが、Dynamic Memoryはその点をよく言えば逆手にとって、「比較的新しいOSだけをサポートする」からこそ実装することができるやり方といえるかもしれません。
Dynamic Memoryはその名の通り、ダイナミックにゲストOSに対してメモリの追加と回収を行うことによりメモリ資源を効率的に使用する技術です。追加については要はHot-addなのですが、回収をバルーンドライバと連携して実装している点が特徴といえます。

このように、Dynamic MemoryはゲストOSが認識する形でメモリの制御が行われます。
これにはメリットとデメリットがあり、メリットとしては「ゲストOSがメモリの状態を把握できる」ことが挙げられます。あえて透過的に実装されている透過的ページ共有に対して、まったく逆の発想と言えるかもしれません。メモリが割り当てられたことや回収されたことを常にゲストOSが認識していますので、ゲストOSがメモリに対してアクセスした際に、「実はそのページは物理メモリに割り当てられていない」というような事態が発生することは起こり得ないわけです。
対するデメリットは「ゲストOS側がDynamic Memoryによるメモリ量の動的な増減に対応する必要がある」ことが挙げられます。現時点でDynamic MemoryはゲストOSとしてWindows Server 2003/2008/2008 R2およびWindows Vista/7が実行されており、かつHyper-V R2 SP1の統合サービスがインストールされていないと機能しないということになっています。Microsoft自身が開発したOSとドライバ群がないと使えないわけで、この点はゲストOSの種別やVMware Toolsが入っていなくても使える透過的ページ共有とは大きく異なる点と言えます。

Linux混在環境の仮想化統合には使えませんので、Hyper-VはますますWindows向けの仮想化ハイパーバイザとしての色合いを強めているといえるかもしれません。
あれ?Hyper-V R2 SP1ってWindows Server 2008 R2 SP1がペアレントパーティションとして動作しているから、そっちでメモリページがスワップアウトしちゃったら元も子もなくない?と考えたあなた、鋭い。そこで、Hyper-Vでは仮想マシンが使用しているメモリページがスワップアウトされてしまわないようにロックする専用のデバイスドライバwinhv.sysが用意されています。この点は汎用OSであるWindowsをペアレントパーティションを必要とするが故の問題ともいえるわけですが、Dynamic Memoryはメモリのオーバーコミットを実現する機能というよりもゲストOSにおけるメモリ使用効率を高める機能だと割り切るのであればよいのではないかと思います。
個人的に気になるのは、Dynamic Memoryの機能というよりも実装面です。

Dynamic Memoryは統合サービスに含まれる専用のメモリマネージャをゲストOS側に導入することで、事実上メモリ管理をペアレントパーティションと統合して機能するようにすることで実装されています。ゲストOS側に導入されたVSCはメモリの追加(Hot-add)と回収(バルーニング)の管理を、対になって機能するペアレントパーティション側のVSPは仮想マシンごとに構成され、VSCと連携してメモリ割り当ての調整を行う仕組みとなっています。そしてVSCから伝えられる各仮想マシンのメモリ状況を元に配分を調整するメモリバランサについてもペアレントパーティション上で実装されています。メモリバランサはVSPを通じてVSCによるメモリの追加と回収を制御し調整します。ESXおにけるバルーンドライバは基本的に仮想マシンまかせでのメモリ回収となりますが、Hyper-Vにおけるバルーンドライバはどのメモリページが回収されたのか確実に把握する必要性があるため、ペアレントパーティションにはVSPごとにメモリマネージャ(GPOメモリマネージャ)が構成されます。

長くなってしまいましたので、今回はHyper-V Dynamic Memoryの実装面についての説明までで終わりにします。次回はDynamic Memoryを使うために必要な設定面について見ていきたいと思います。
ダラダラと続いてすみません。

*1:実装できなかったと言えるのかもしれませんが…