VMware ESXにおけるメモリ管理(4) - メモリを割り当てるのは簡単だが、回収するのは難しい

VMware ESXにおけるメモリ管理』シリーズ
(1) - 序:他のリソースとの違いはなに?
(2) - 仮想化インフラにおけるメモリ管理って?
(3) - メモリに関する仮想化支援機能(Intel EPT/VPID, AMD RVI/Tagged TLB)
…の続きです。

物理マシンにOSが直接インストールされている場合、OSは全ての物理メモリを管理します。OSによってその管理方法は異なりますが、基本的には「割り当てた」メモリページを管理するか、「割り当てていない」(フリーの)メモリページを管理するかのいずれかの方法でメモリ管理を行います。いずれにしろ、OSはOS自身とOS上で実行される複数のアプリケーションのプロセスそれぞれに対してどの物理メモリページを割り当てているか把握していますし、プロセスは必要なメモリをOSに依頼して割り当ててもらい、そして「基本的には」不要となったメモリページはOSに返却します(返すように作ることが求められています)。
OSの場合と同様にHypervisorが仮想マシンに対するメモリ割り当てのタイミングを知ることは比較的簡単です。なぜなら、仮想マシンが始めてそのメモリページにアクセスしようとした際にまだ実際に割り当てが行われていなければページフォルトするからです。対して、不要となったタイミングを知ることは簡単ではありません。仮想化環境では複数の仮想マシンを並列で実行するわけですが、仮想マシン上に導入されるゲストOSはメモリページを仮想化レイヤーに対して返すようには作られていません。そもそも仮想化環境におけるゲストOSは「自分は物理メモリを管理している」と思って「仮想化環境によって割り当てられたメモリ空間」を管理していますので、「返す必要すらない」と思っているわけです。故に、仮想化環境では「OS側から返してもらう」ことはできませんので、「Hypervisor側から回収する」仕組みを用意する必要があります。ここが仮想化環境ならではのメモリ管理の難しさです*1
Hypervisorが管理する物理メモリ空間が潤沢にある場合は、別に「メモリの回収」が問題となることはありません。MicrosoftHyper-VやCitrixのXenServerといった各社のHypervisorが最近までメモリのオーバーコミットを仕様としてできないようにしていた?*2理由はこの問題の難しさを示しているような気もします。

ではVMware ESXはどのような手法を用いてメモリの回収を行っているのでしょうか。ESXがメモリに関して持つ機能としては以下の4つがあります。

    1. 透過的ページ共有 (Transparent page sharing / TPS)
    2. バルーニング (Ballooning)
    3. ハイパーバイザースワッピング (Hypervisor swapping)
    4. メモリ圧縮 (Memory compression)

メモリ資源をいかに有効に活用していくか。そのためにはアクティブメモリを識別することによる「高いメモリ使用率」と、ホストが管理する物理メモリを必要としている仮想マシンに正確に割り当てることによる「高いVM統合率」を実現する必要があります。
次回は上述のESXが持つ4つのメモリ関連機能と、Dynamic Memoryという名称でWindows Server 2008 R2 SP1のHyper-Vから実装されるメモリ関連機能などについて、具体的な実装レベルを見ていきたいと思います。

*1:他にも仮想化環境ならではのメモリ管理の課題はあります。たとえばメモリを通じた仮想マシン間でのデータ漏洩はあってはならないことです。そのため、ESXでは仮想マシンに対してメモリページを割り当てる前に一度ゼロを書き込んでから割り当てを行います。

*2:Microsoft Hyper-VのDynamic Memoryがメモリオーバーコミットなのかどうかはさておき