VMware ESXにおけるメモリ管理(9) - スワッピング

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) - バルーニング
…の続きです。

い、一ヶ月半ぶりでございます(^_^;)。まさか年をまたぐことになるとは思ってもいませんでした…。あと3回ぐらいで終わりにできるのではないかと思っているのですが…どうなることやら。

透過的ページ共有(TPS)やバルーニングでもメモリの確保が難しいとVMkernelが判断した場合に、「最後の手段として」実行される手段がスワッピングです。スワッピングはMicrosoftが資料の中で、「VMwareも『最後の手段』と書いている手法であり、事実上は使えないよー(=実装しても仕方がないよー)」と開き直りのネタ?m(_ _)m として使っているぐらい、メモリ管理において禁断の手法ではあります。

スワッピングなのかページングなのか微妙なところではありますが、ページ単位でのスワップアウトであるところはページングっぽい気もしますが、使用状況などを考慮しないで強制的にスワップアウトしてしまう側面から見るとスワッピングのような気もします。まぁVMwareスワップファイルとしていますから、スワップなのでしょう。

仮想マシンのパフォーマンスに与える影響を考慮すれば、透過的ページ共有<バルーニング<スワッピングという順で影響度合いは小さいといえますが、メモリを即時に確保する手法としての容易さは逆にスワッピング<バルーニング<透過的ページ共有という順になります。

透過的ページ共有の場合は、メモリページに対するハッシュ値の生成と比較、さらにハッシュ値が合致した場合のメモリページ内容の突き合わせなど、実際にメモリを空けられるまである程度時間がかかることになります。バルーニングについても、ゲストOSに対して不要メモリの回収を働きかけるわけですが、希望するだけのメモリ量が回収できるかどうかはやってみないとわかりません。対して、スワッピングの場合は問答無用で仮想マシンに割り当て済みのメモリページのうちの一定量スワップファイルに移動させてしまうことにより回収するわけですから、複雑な手続きを踏むことなく即時に物理メモリページを確保できるというメリットがあります。

しかしスワッピングが「最後の手段」として扱われることの理由は、メリットを大きく上回るデメリットが存在しているためです。そのいずれもが、パフォーマンスに与えるインパクトが大きすぎる、という点に帰着します。

大きく分けて、スワッピングのデメリットは次の3点です。

  1. どのメモリページをスワッピングの対象とするのか
  2. 二重ページング問題
  3. スワップイン処理時の大きな遅延

ESXにおけるスワッピングは、仮想マシンに対して割り当てているメモリページの実体を物理メモリ上から、仮想マシン毎に用意するスワップファイルにページアウトしてしまうことにより実現されています。バルーニングの場合と異なり、ゲストOS側が認識しないレイヤーにおいてスワップアウトさせてしまうことになりますので、「ゲストOSは物理メモリに配置していると認識している」メモリページの実体が実はスワップアウトさえている、ということが発生する可能性があります。特定のアプリケーションプロセスがキャッシュなどの用途として使用していたメモリページならともかく、OSが頻繁に使用するためにゲストOSとしては常に物理メモリページ上に配置しておきたかったメモリページの実体の部分などがスワップアウトされてしまうと、ゲストOSのパフォーマンスに大きなインパクトを与えることになります。

HypervisorとゲストOSが連携せずに個別にスワップ処理を行うことのデメリットはさらにあります。もしゲストOSにとってスワップアウト可能であったメモリページを、Hypervisor側の機能によってスワップアウトさせてしまった場合、そのページがゲストOS側でスワップアウトされると当然ながらディスク上にある仮想ディスクファイル内に書き込まれることとなるため、結果として二重ページングのできあがり。このメモリページをスワップインさせるためには、2回のディスクI/Oが必要となるという、非効率極まりない状況が発生します。

このように、ゲストOSからは把握できない仕組みによって物理メモリの融通を行うスワッピングは非常に大きな対価を支払ってメモリの確保を行う仕組みであるため、可能な限り「スワッピングしなければならない」ようなリソース状況で仮想マシンを実行するべきではないでしょう。ESXはスワップさせるメモリページをランダムに選択する仕組みとなっているため、スワッピングが発生した場合にどのゲストOSがどの程度のパフォーマンス的なインパクトを受けることになるのか、予測することは難しいといえます。