スワッピング...の続きです。ESXは透過的ページ共有、バルーニング、そしてスワッピングに加えて、vSphere4.1からさらにメモリ圧縮という機能を実装してきました。メモリ圧縮はスワッピングに優先して機能し、「なんとかしてスワップを防止する」最後の砦として機能します。メモリ圧縮はアイデアとしては非常にシンプルで、スワップアウトさせてしまうぐらいなら、メモリページの内容を圧縮してでもオンメモリの状態をキープしようという仕組みです。当然ながら、メモリページへのアクセスがあった場合には、そのままではメモリページのデータを扱うことはできませんので、解凍処理をした上でメモリページへのアクセスを行わせる必要があります。I/Oを必要とするスワップアウトした状態からの読み込みよりは断然速い(状況によっては数百倍から千倍程度)わけです。メモリ圧縮を使用すると、使用しなかった場合と比較してスワップアウトを発生させてしまう数を減らすことができます。I/Oを減らすことができることになり、結果としてメモリ使用率が非常に高いESXホストにおけるパフォーマンスがその分改善することになります。ESX4.1では、メモリ圧縮を使用しなかった場合はスワップアウトされてしまっていたメモリページだけを対象としてメモリ圧縮の処理を試みます。先読み的にメモリ圧縮をすることはありません。そのため、余計にメモリ圧縮処理をしてしまうことによりパフォーマンスに影響を与えるようなことはないようになっています。メモリ圧縮は必ず効果を発揮するわけではありません。下図の例では、2つの4KBのメモリページ(AおよびB)についてスワッピング対象となった場合を図示しています(a)。メモリ圧縮を使用しない場合、これら2つのメモリページはスワップアウトされ、物理メモリ上からデータストア内に用意されているスワップファイルに書き出されます(b)。メモリページを使用する場合には、スワップアウトさせてしまう前に対象となったメモリページの圧縮を試みてそれぞれが半分以下(2KB以下)のサイズとなるかどうかの確認を行います。圧縮率が50%以下の場合はメモリ圧縮によるメモリページの確保には繋がらないため、これらのメモリページは圧縮されるのではなくスワップアウトされます。圧縮率が50%以上となる場合には、これらのメモリページ2つを圧縮して1つの4KBのメモリページに格納し、元々それぞれが使用していた4KBのメモリページ2つを解放します(c)。このように、メモリ圧縮によるメモリページの回収はそれほど効率的というわけではありませんが、それでもスワップアウトしてしまうよりは圧倒的にパフォーマンスインパクトを減らすことができます。メモリ圧縮を使用した場合、ゲストOSにおけるメモリアクセスが失敗するとまず対象メモリページが圧縮されているかどうかを確認します。対象のメモリページが圧縮されていた場合には解凍処理がされ、元のメモリページに戻されてアクセスが行われます。メモリ圧縮されていないことが確認された場合には、スワップファイルから対象ページを読み込みます。このようにメモリ圧縮によるメモリページの回収はそれほど効率的ではないため、ESXホストではあくまでも最後の砦として使用されているわけです。次回は仮想マシン毎のメモリ圧縮に関する構成について書きたいと思います。月別アーカイブはてなブログをはじめよう!takaochanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。