【Nutanix AHV 】メモリオーバーコミットを理解する！

みなさん、こんにちは！
Nutanix AHVにおけるメモリオーバーコミットについて説明します。

今まで掲載したNutanixに関する技術ブログを以下にまとめていますので、是非ご覧ください！
■Nutanix 関連記事
・[Nutanix AHVとは](https://qiita.com/ReQ_HY/items/a797b201e9c349fbf106)
・[Nutanix AHVの機能について](https://qiita.com/ReQ_HY/items/4a9d34cfd8ab97ae6d4a)
・[Nutanix AHVの機能(ストレージ関連)について](https://qiita.com/ReQ_HY/items/36e48336eba584cdff33)
・[Nutanix AHVへの移行について](https://qiita.com/ReQ_HY/items/71d2228878605174c96a)
・[【Nutanix AHV】Nutanix AHV構築してみた！](https://qiita.com/ReQ_HY/items/42bbdff45ab8e521c093)
・[【Nutanix AHV】Prism Elementとは？Prism Centralとは？](https://qiita.com/ReQ_HY/items/2aca82f4971d089bb800)
・[【Nutanix AHV】PrismCentral導入してみた](https://qiita.com/ReQ_HY/items/f8f771b9eb2209d47256)
・[【Nutanix AHV】Nutanix Moveデプロイ](https://qiita.com/ReQ_HY/items/3d1263273d8873911125)
・[【Nutanix AHV】VMware ESXiからNutanix AHVへの仮想マシン移行【Nutanix Move】](https://qiita.com/ReQ_HY/items/e742921f866d9947f9f4)
・[【Nutanix AHV】仮想マシン構築（Linux/Windows Server）](https://qiita.com/ReQ_HY/items/2b9fa7413bbee5de602b)
・[【Nutanix AHV】AHV/CVM/クラスターの起動停止](https://qiita.com/ReQ_HY/items/0a374d1e761db5c6a8e1)
・[【Nutanix AHV】Nutanix AHVにおけるストレージの理解](https://qiita.com/ReQ_HY/items/0e39a9b2300fdbda233d)

## メモリオーバーコミットって何？
Nutanix AHVでのメモリオーバーコミットは、バルーニングとホストスワップの2つのメカニズムによって実現されています。

バルーニングは、ゲストOSが必要としないメモリを解放し、他の仮想マシンへ割り当てます。
ホストスワップは、バルーニングが不可能な場合（例えば、ゲストOSがすべてのメモリを使用している場合）においては、仮想マシンのメモリをホストのディスクにスワップアウト（一時的に退避）することで、メモリを解放して他の仮想マシンへ割り当てます。

バルーニングによるメモリオーバーコミットの具体的な例を以下に記載します。

まず、ハイパーバイザーに搭載されているメモリが100GBとします。
次にVM1・VM2・VM3にはそれぞれメモリ30GBを割り当てており、実際に各VMが使用しているメモリは20GBだけです。

この状況で、メモリオーバーコミットを無効にしている場合、新たにVM4へメモリ30GBを割り当てて起動しようとすると、現状で利用可能なメモリが10GBしか残っていないため、起動することはできません。
| 機器 | メモリ容量 | メモリ使用量 |
|:-|:-|:-|
| VM#1  | 30GB	  | 20GB  |
| VM#2  | 30GB	  | 20GB  |
| VM#3  | 30GB	  |  20GB |
| VM#4  |  30GB	 |  - |
| ハイパーバイザー  |  100GB	 |  - |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7c9df21a-bfb9-4ed1-b1dd-162392e91b15.png)

次にメモリオーバーコミットを有効にしている場合、バルーニングの機能により
各VMで使用していないメモリ10GB（合計30GB）をVM#4へ割り当てることができます。

これにより、VM#4には必要な30GBのメモリを割り当て、VM1・VM2・VM3・VM4という4つの仮想マシンが合計120GBのメモリを使って同時に稼働することが可能となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/4d96603d-99a8-4e3a-bb21-fac688c35263.png)

## Nutanix AHVでのメモリオーバーコミット
Nutanixにおけるメモリオーバーコミットについての詳細は公式ドキュメントをご確認ください。
 **・[AHV Administration Guide-Memory Overcommit](https://portal.nutanix.com/page/documents/details?targetId=AHV-Admin-Guide-v6_8:ahv-vm-overview-memory-overcommit-c.html)**
 **・[Nutanix AHV-Memory Overcommit](https://portal.nutanix.com/page/documents/solutions/details?targetId=BP-2029-AHV:memory-overcommit.html)**

### 要件
| 製品 | バージョン | 備考 |
|:-|:-|:-|
| Nutanix AOS  |  6.0.2以降 | -  |
| Nutanix AHV  | 20201105.30007以降  |   |
| Nutani VirtIO Driver  |  - | Windows VMで使用  |
| Prism Central  | pc.2022.4  | Prism Centralで設定時に使用  |

### ゲストOSのメモリオーバーコミット使用条件(Linux/Windows)
LinuxにはVirtIO-balloon Driverがデフォルトでインストールされています。
しかし、Windows OSにはこのドライバーが含まれていません。
そのため、Windows OS上でVirtIO-balloon Driverを利用するには、Nutanix社が提供しているVirtIO driverからインストールする必要があります。

### 推奨事項
Nutanixではメモリオーバーコミットを有効化する場合、仮想マシンのパフォーマンスを最適化するために以下のことを推奨しています。
Nutanixではメモリオーバーコミットを有効化する場合、仮想マシンのパフォーマンスを最適化するために以下のことを推奨しています。

 * Guest OSのSwapにRAM以上を割り当てること
 * Balloon Driverをインストールしていること
 * Balloon Driver用にvCPUを1個以上割り当てが可能であること
※Guest VMに対して割り当てられているvCPUが1個だけの場合、
メモリオーバーコミット機能が影響を受ける可能性があります。

### 制限事項
メモリオーバーコミットの制限事項について、ドキュメントよりピックアップして以下に記載します。
全ての制限事項や詳細については、本記事内で紹介しているNutanix公式ドキュメントをご確認ください。

 * メモリオーバーコミットの設定変更は仮想マシンが起動していると設定変更不可
Prism Centralの場合、仮想マシンが起動していると項目がグレーアウトします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/f053d3b1-c40e-4135-be29-92e6095a8648.png)

acliコマンドの場合はInvalidVMStateが結果として返されます。
```ruby:qiita.rb
<acropolis> vm.update OL89 memory_overcommit=False
OL89: InvalidVmState: Cannot complete request in state On.
```

 * メモリオーバーコミット有効化時はMemoryのホットプラグが不可
仮想マシンの稼働状態(電源ON)の場合、Prism Centralで仮想マシンの設定編集から
メモリ追加を行おうとするとメモリ項目がグレーアウトされて追加が不可となっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/f931fe6a-657d-4586-8b7c-0fd3978738b4.png)

 * メモリ オーバーコミットを頻繁に使用すると、クラスター内のディスク領域の使用率が急上昇する可能性があります。
 * 予約済みホストを使用するように高可用性が構成されている場合、メモリ オーバーコミットはサポートされません

### Nutanix AHV-VMware ESXiの比較
現在多く使用されている仮想基盤・VMware ESXiとNutanixでは適用先が以下の様に違いがあります。
　・適用先
　　VMware：ESXiに対してメモリオーバーコミットの設定を行います。
　　Nutanix：仮想マシンごとにメモリオーバーコミットを有効化

## メモリオーバーコミット有効化・無効化手順
メモリオーバーコミットはacliコマンドまたはPrism Central(GUI)から行うことが出来ます。
制限・考慮事項でも記載していますが、設定変更は仮想マシンの電源が停止している状態のみで実施可能です。

**acliコマンドでの有効化・無効化**
1.Nutanix CVMへSSH接続
2.acliプロンプト切り替え
acliプロンプトへ切り替えなくてもacliコマンドを実行することは可能ですが、分かりやすくするために切り替えを行います。
```ruby:qiita.rb
$ acli

<acropolis>
```

3.メモリオーバーコミット有効化・無効化

有効化コマンド
```ruby:qiita.rb
<acropolis> vm.update <VM Name> memory_overcommit=True
```

無効化コマンド
```ruby:qiita.rb
<acropolis> vm.update <VM Name> memory_overcommit=False
```
4.有効化・無効化確認

"vm.get"コマンドを使用することで仮想マシンの設定情報を取得することが可能です。

 * 有効化の場合
```ruby:qiita.rb
<acropolis> vm.get <VM Name>

config {
...
memory_overcommit: True
}
```

 * 無効化の場合
```ruby:qiita.rb
<acropolis> vm.get <VM Name>

config {
...
memory_overcommit: False
}
```

### Prism Centralでの有効化・無効化
1.Prism Central(GUI)へログインします。
2.[仮想インフラ]→[仮想マシン]をクリックして、仮想マシン一覧を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/c3323d04-20d8-448f-8930-40456b079710.png)

3.仮想マシンを右クリックして、[Enable Memory Overcommit](有効化)/[Disable Memory Overcommit](無効化)をクリックします。
 * 有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/f623cb84-217b-4935-be58-36cf9ebf2ca3.png)

 * 無効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7f36563f-0ca4-4b2f-8249-b9336166b917.png)

4.仮想マシンをクリック後、[サマリー]→[プロパティ]より"Memory Overcommit"項目を確認します。
 * 有効化の場合(設定値：enabled)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/d31988a3-0642-4fc4-9a53-6f821c022899.png)

 * 無効化の場合(設定値：Disabled)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3956386/7404e887-4375-442c-8f9e-ab4238ecd9fa.png)

## 最後に
Nutanix AHVにおいてもメモリオーバーコミット機能を使用することは可能となっています。
Nutanix CVMやPrism Centralを稼働させる分リソースの消費を行うため、必要に応じて有効化することも選択肢としては出てくるかと思います。
有効化することで、搭載物理メモリ以上に仮想マシンを稼働させることが可能とはなります。
ただし、OSでスワップイン・スワップアウトを繰り返してしまうと、OS上で稼働しているサービスやソフトウェアが不安定になってしまいます。
そのため、有効化する際は十分に設計を行ったうえで有効化する必要があります。