VMware ESXにおけるメモリ管理(12) - いつ、どのタイミングで、どの機能が使用されるのか

VMware ESXにおけるメモリ管理』シリーズ
(1) - 序:他のリソースとの違いはなに?
(2) - 仮想化インフラにおけるメモリ管理って?
(3) - メモリに関する仮想化支援機能(Intel EPT/VPID, AMD RVI/Tagged TLB)
(4) - メモリを割り当てるのは簡単だが、回収するのは難しい
(5) - 透過的ページ共有
(6) - Dynamic Memory on Hyper-V 実装編
(7) - Dynamic Memory on Hyper-V 設定編 +α
(8) - バルーニング
(9) - スワッピング
(10) - メモリ圧縮 (1)
(11) - 仮想TLB方式ってどういうこと?
…の続きです。メモリ圧縮(2)じゃないのはご愛敬!

仮想マシン毎でメモリ圧縮がどれだけ使われるかは、ゲストOSのメモリ使用率に基づいて決定されます。ESXは圧縮されたメモリページを保存するために、仮想マシンに対して追加的な物理メモリの割り当ては行いません。メモリ圧縮はゲストOSに対しては透過的に機能しており、物理メモリが不足して仮想マシンに割り当てたメモリがスワップアウトしてしまう状況となるまでは使用されません。

もし圧縮されたメモリページの使用率が限度に達していた場合において、新規のメモリ圧縮が必要となった場合には、既存の圧縮されたメモリページを解凍した上でスワップアウトさせ、新規のメモリページを圧縮して格納します。スワップアウトされる「圧縮されたメモリページ」は時系列基準で判断され、最も古くメモリ圧縮されたページが対象となります*1。ESXはかならず圧縮されたメモリページは解凍した上でページアウトする仕組みとなっており、圧縮されたメモリページをスワップアウトさせてしまうことはありません。

仮想マシン毎に構成可能な最大メモリ圧縮サイズの調整は、仮想マシンのパフォーマンスを考慮する上で重要です。もし最大メモリ圧縮サイズが小さく設定されていた場合、メモリ圧縮機能は頻繁に圧縮されたメモリページを置き換えるために解凍とスワップアウトの処理を頻繁に行わなければならないこととなります。多発されるスワップアウトは仮想マシンのパフォーマンスに大きな影響を及ぼします。
しかし、メモリ圧縮の使用率はゲストOSのメモリ使用率に基づいているため、逆に最大メモリ圧縮サイズを大きくしてしまうと不要なメモリページ(将来においてあまり使われないメモリページ)まで圧縮処理を行うこととなり、メモリの効率的な使用を妨げしまう要因にもなりかねません。

ESX4.1では、仮想マシン毎のメモリ圧縮使用率のデフォルト構成として、比較的保守的な値である10%と設定されています。この設定値は、ESXホストの[構成] - [ソフトウェア] - [詳細設定]におけるMem.MemZipMaxPctパラメータの値により構成することができます。また、メモリ圧縮を使用するかどうかについても、Mem.MemZipEnableパラメータの値により有効/無効を構成することができます。

その他、いくつかのパラメータ値がメモリ圧縮については構成することができます。

パラメータ 概要
Mem.MemZipEnable 0/1 メモリ圧縮の有効/無効を指定。0で無効、1で有効
Mem.MemZipMaxPct 0-100 仮想マシンに構成されたメモリサイズに対するメモリ圧縮の最大使用割合を指定。デフォルトでは10(%)
Mem.MemZipMaxAllocPct 0-100 仮想マシンに割り当てられたメモリサイズに対するメモリ圧縮の最大使用割合を指定。デフォルトでは50(%)
Mem.MemZipLowMemMaxSwapOut 0-200 メモリ不足状況においてメモリ圧縮ページからスワップアウトさせるページの最大数を指定。デフォルトでは25
Mem.MemZipBalloonXferPct 0-100 High-Softステータスにおけるバルーニング対象メモリをスワップアウトさせる割合を指定。デフォルトでは0(%)
Mem.MemZipMaxRejectionPct 0-100 バルーニングを無効化してメモリ圧縮から解放されるメモリ割合の指定。デフォルトでは10(%)

ESXはメモリ割り当てステータスをHigh、Soft、Hard、Lowの4種類で管理しており、それぞれの閾値として6%、4%、2%、1%が割り当てられています。これらのステータスは、esxtop / resxtop により確認することができます。

デフォルトでは、ESXは透過的ページ共有により小さなオーバーヘッドでの物理メモリの節約を行いますが、メモリの確保が必要となった場合には、バルーニングとスワッピング(およびそれに伴い機能するメモリ圧縮)を使用します。

ステータスがHighの場合、ゲストOSが必要としているメモリサイズはESXホストが割り当て可能なメモリサイズよりも小さいため、メモリのオーバーコミットは発生しておらず、Hypervisor (ESXホストのVMkernel)はバルーニングやスワッピングによるメモリの確保を行う必要はありません(※ただし、仮想マシンにおいてメモリリソースの制限が構成されていた場合を除く)。

ステータスがHighの閾値を下回った(=Softステータスとなった)場合、ESXホストはバルーニングを利用したメモリの回収を開始します。バルーニングによるメモリの回収は、実際にバルーンドライバがゲストOS上でメモリページを確保してピン留めする(回収してよい対象としてESXホストに通知する)までにある程度の時間を要するため、メモリステータスの閾値がSoftに達する前に発動されます。多くの場合、バルーンドライバによるメモリ回収が有効に機能するため、メモリステータスはSoftの範囲に留まります。

さらにバルーニングによるメモリ回収によってもメモリの確保を十分に行うことができずにステータスがSoftを下回った(=Hardステータスとなった)場合、Hypervisorはバルーニングに加えてスワッピングの実行を開始します。スワッピング実行時にはメモリ圧縮が機能します。これらの機能によりメモリが確保された場合には、ESXホストはSoftステータスに戻るはずです。

まれなケースとしてメモリステータスがLowにまで達した場合、ESXホストはスワッピングやメモリ圧縮によるメモリの割り当てを行いますが、仮想マシンの要求に対して物理メモリの割り当てが間に合っていない状況となるために、仮想マシンのパフォーマンスには大きな影響が発生することとなります。

このように、ESXホストは物理メモリの使用率に基づいて適切な機能を用いてメモリの割り当てを行います。

メモリステータス 閾値 使用されるメモリ確保機能
High 6% 透過的ページ共有
Soft 4% バルーニング
Hard 2% スワップアウト/メモリ圧縮
Low 1%

*1:メモリページは圧縮されたままではメモリページとして使用することはできないため、当該メモリページへのアクセスが必要となった場合には、解凍されて元の「圧縮されていない」メモリページにした上でアクセスが行われます。よって、「最も古くメモリ圧縮されたページ」は、圧縮されたまま最も長期間使用されていないメモリページとなるため、時系列基準での選択が最適となります