VMware ESXにおけるメモリ管理(10) - メモリ圧縮 (1)

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) - スワッピング
…の続きです。

VMware ESXは透過的ページ共有、バルーニング、そしてスワッピングに加えて、vSphere4.1からさらにメモリ圧縮という機能を実装してきました。メモリ圧縮はスワッピングに優先して機能し、「なんとかしてスワップを防止する」最後の砦として機能します。

メモリ圧縮はアイデアとしては非常にシンプルで、スワップアウトさせてしまうぐらいなら、メモリページの内容を圧縮してでもオンメモリの状態をキープしようという仕組みです。当然ながら、メモリページへのアクセスがあった場合には、そのままではメモリページのデータを扱うことはできませんので、解凍処理をした上でメモリページへのアクセスを行わせる必要があります。そういう意味では、パフォーマンスに与える影響がないわけではないのですが、それでもDisk I/Oを必要とするスワップアウトした状態からの読み込みよりは断然速い(状況によっては数百倍から千倍程度)わけです。

メモリ圧縮を使用すると、使用しなかった場合と比較してスワップアウトを発生させてしまう数を減らすことができます。つまりは将来発生するスワップインの処理数を減らすこととなり、その分Disk I/Oを減らすことができることになり、結果としてメモリ使用率が非常に高いESXホストにおけるパフォーマンスがその分改善することになります。

ESX4.1では、メモリ圧縮を使用しなかった場合はスワップアウトされてしまっていたメモリページだけを対象としてメモリ圧縮の処理を試みます。つまり先読み的にメモリ圧縮をすることはありません。そのため、余計にメモリ圧縮処理をしてしまうことによりパフォーマンスに影響を与えるようなことはないようになっています。

メモリ圧縮は必ず効果を発揮するわけではありません。下図の例では、2つの4KBのメモリページ(AおよびB)についてスワッピング対象となった場合を図示しています(a)。

メモリ圧縮を使用しない場合、これら2つのメモリページはスワップアウトされ、物理メモリ上からデータストア内に用意されているスワップファイルに書き出されます(b)。しかしメモリページを使用する場合には、スワップアウトさせてしまう前に対象となったメモリページの圧縮を試みてそれぞれが半分以下(2KB以下)のサイズとなるかどうかの確認を行います。圧縮率が50%以下の場合はメモリ圧縮によるメモリページの確保には繋がらないため、これらのメモリページは圧縮されるのではなくスワップアウトされます。しかし圧縮率が50%以上となる場合には、これらのメモリページ2つを圧縮して1つの4KBのメモリページに格納し、元々それぞれが使用していた4KBのメモリページ2つを解放します(c)。このように、メモリ圧縮によるメモリページの回収はそれほど効率的というわけではありませんが、それでもスワップアウトしてしまうよりは圧倒的にパフォーマンスインパクトを減らすことができます。

メモリ圧縮を使用した場合、ゲストOSにおけるメモリアクセスが失敗するとまず対象メモリページが圧縮されているかどうかを確認します。もし対象のメモリページが圧縮されていた場合には解凍処理がされ、元のメモリページに戻されてアクセスが行われます。そしてメモリ圧縮されていないことが確認された場合には、スワップファイルから対象ページを読み込みます。

このようにメモリ圧縮によるメモリページの回収はそれほど効率的ではないため、ESXホストではあくまでも最後の砦として使用されているわけです。

次回は仮想マシン毎のメモリ圧縮に関する構成について書きたいと思います。