AHV環境においては、長らく仮想マシンのメモリー割り当ては、ハードウェアからの予約となり、他の仮想マシンとのメモリーの空き容量を相互に使うメモリーオーバーコミット機能が利用できませんでした。AHV 20201105.30007 以降を備えたハイパーバイザーとAOS 6.0.2以降であれば、メモリーオーバーコミットが利用可能となります。
今回は、このメモリーオーバーコミットの紹介をします。
そもそもメモリーオーバーコミットとは、なにかをおさらいしておきましょう。
メモリーオーバーコミットは、仮想マシンに割り当てられたメモリーのうち、仮想マシンのOSレイヤー以上で利用されていないメモリーを、Balloonドライバーで回収し、ハイパーバイザーに戻すことで、本来のホストの持つ物理メモリーサイズを超えて、仮想マシンにメモリーを割り与えることです。即ち、空いている容量を他の仮想マシンに転用するだけであって、物理的に利用できるメモリー容量が増えるわけでは、ありません。また、メモリーは、1台のホスト内でメモリーのやりくりを行うので、ホストを超えてのメモリーのオーバーコミットはできません。
単純にわかりやすく考えると、月極駐車場で、100台の駐車スペースを法人契約していた場合、平日の10時から16時までは、平均80台の車が営業車として利用されており駐車スペースが空いているため、10時から16時までの間に別の利用者に貸し出すような考え方です。(オーバーブッキングビジネスの考え方)
要は、枠としては、既に押えられているが、実質使われていない空いているキャパシティーを、さらに利用するような考え方となります。
では、メモリーオーバーコミットの利用方法を具体的にご紹介します。
メモリーオーバーコミットは、仮想マシン単位で設定します。
Prism Centralで仮想マシンを作成する際、もしくは作成済みの仮想マシンに対して、Enable Memory Overcommitメニューで、メモリーオーバーコミット機能を有効化します。
Prism Centralでの有効/無効以外に、acliを利用して、メモリーオーバーコミットの有効/無効の設定が可能です。
acli vm.update 仮想マシン名 memory_overcommit=true/false
環境としては、以上で設定は終わりです。仮想マシンには、VirtIO Driverの最新版(Ver 1.2.1)を利用して、バルーンドライバーのインストールが必須となります。
Windowsの場合は、Nutanixが提供する、VirtIO Driverからインストールを行います。
Linuxの場合は、カーネルにバルーンドライバーが入っているかを確認します。
lsmod | grep baloon
で、以下のように結果が表示されれば、バルーンドライバー(カーネルモジュール)が入っています。
virtio_balloon 24576 0
もし入っていない場合は、カーネルモジュールの設定変更する必要があります。
Ballon Driverは、カーネルビルド時に利用する"make menuconfig"の「Device Drivers -> Virtio Drivers」の中にあります。
メモリーオーバーコミットの仕様も確認しておきましょう。
- AOS6.0.2以降/AHV 20201105.30007以降でサポート
- 最新のVirtIO Driverを仮想マシンインストールします
- メモリーオーバーコミットの有効/無効は、仮想マシン単位で、仮想マシンがパワーオフの状態で設定します。
- PrismCentral 2022.4以降であれば、GUIで仮想マシン単位でメモリーオーバーコミットの設定が可能です。
- ホストを超えたメモリーオーバーコミットはできませんん。
- GPUパススルーやvGPUを設定した仮想マシン、vNMUA設定をした仮想マシンは、メモリーオーバーコミットできません。
- メモリーオーバーコミットを有効にした仮想マシンは、仮想マシンのメモリーホットアドは、できません。
- ライブマイグレーションを行う場合、通常に比べ移動の速度が遅くなる可能性があります。
- 物理メモリーの枯渇に備え、スワップファイルが内部的にNutanixManagementShareストレージコンテナ内に作成されます。
- デフォルトで、各仮想マシンは、割り当て容量の25%が物理メモリーに割り当てが保証(予約)されます。残りの75%は、他の仮想マシンのメモリーオーバーコミット領域として利用されることがあります。(すなわち、4倍までオーバーコミット可能)
仮想マシン側も準備ができれば、あとは、動きを見てみましょう。
メモリーオーバーコミットは、ホストを超えてメモリーをオーバーコミットすることができませんので、今回は、わかりやすいように1台のNutanixホストで試してみたいと思います。
物理搭載メモリー192GBから、CVMが消費するメモリー32GBとハイパーバイザーが利用するメモリーが4GB程度ありますから、実際には、160GB程度しか仮想マシンは利用できないと思います。この環境で、メモリーを160GB割り当てた仮想マシンを作成します。
この場合、160GBのメモリーをこの仮想マシン専用に確保することができないため、仮想マシンを起動することができません。
しかし、メモリーオーバーコミット機能をONにすると仮想マシンを起動することができます。実際に利用されているメモリー容量は、この場合、160GBのメモリー割り当てに対して、20.67%しか利用していないことがわかります。メモリーオーバーコミットが有効化された仮想マシンは、割り当てられたメモリーサイズの75%がメモリーのオーバーコミットとして他の仮想マシンで起動する際に利用される領域となります。
しかし、CVMは、オーバーコミットができないはずですが、なぜかハイパーバイザーの容量を考えても物理メモリーとして利用できる範囲を超えていると思われます。
では、物理メモリーを超えた容量を割り当てた場合はどうなるのでしょうか?最初に256GBで割り当てたところ、仮想マシンは起動しませんでした。200GBでも起動しませんでしたが、199GBにすると仮想マシンは起動します。はっきりした仕様がわかりませんが、おそらく物理メモリー容量に、8GB未満までであれば仮想マシンに物理容量を超えるメモリーサイズが利用できる可能性があります。
ここからさらに、28GBのメモリーを割り当てた仮想マシンを起動すると、きちんと起動します。最大4倍までがオーバーコミットできるので、トータルで物理メモリー容量を超えた形で仮想マシンを起動することができます。
次回は、より詳細にメモリーオーバーコミットの動きを見ていきたいと思います。