はじめに
前回の記事で、自宅ラボ環境の完成報告を行いました。次に行う検証のために操作感を確認していたのですが、早速とある問題にいきあたりました。
その問題ですが、今回3ノードでクラスターを構成しているのですが、不定期にCVMがダウンする、というものです。このままではノード障害試験などを行うことができないため、その原因について調べてみました。
発生した事象
クラスターのVirtual IPからPrism Elementにログインし、GUI上で操作を行っていたところ、たまにリロードが走る場面がありました。「メモリオーバーコミット環境だからそんなものかな」と思っていたのですが、右上のヘルスウィジェットに目をやると、" Controller VM [CVMのIPアドレス] disconnected from network "とメッセージが出ていました。

Prism Elementから仮想マシンの状態を確認したところ、確かにダウンしています。

対象のCVMが稼働していたAHVにログインし、" virsh list --all "コマンドを実行したところ、" shut off "状態になっていました。完全にCVMがダウンしています。
[root@NTNX-xxxxxxxx-A ~]# virsh list --all
Id Name State
--------------------------------------
- NTNX-xxxxxxxx-A-CVM shut off
この事象は特定ノード上のCVMだけではなく、3ノードすべてのCVMで発生しています。発生頻度は不定期のため、CVMが不安定のようです。
ただし、この情報だけでは、ゲストOSが正常に停止しただけなのか、何かしらの操作(ハイパーバイザー側など)によって強制停止したのか、までは判別できません。ここからは複数の箇所から原因調査を行いました。
原因調査①:Prism Element
Prism Elementのヘルスウィジェットに表示されたアラートをクリックすると、そのアラートの考えられる原因や関連するKBの案内を表示してくれます。まずはここをクリックしてみました。考えられる原因が複数表示されていましたが、今回はCVM自身がダウンしているため、" Possible Cause 1 "が近そうですね。

Prism Elementおよび案内されていたKB情報を確認しましたが、直接的な原因特定に至りませんでした。そのため、次にハイパーバイザー(AHV)側での停止イベント有無を確認することにしました。
原因調査②:AHV
CVMは、AHV上の仮想マシンとして稼働しています。そのためAHV側の何かしらの手掛かりがないかと考えました。類似の事象がないかインターネットで調べてみると、特にネスト環境においては「プロセスの強制終了によってCVMがダウンする」といった記述を見つけました。そのため、該当CVMが稼働するAHVにログインし、" dmesg "コマンドを実行したところ、原因が分かりました。
[root@NTNX-xxxxxxxx-A ~]# dmesg | grep -E "Out of memory|Killed process"
[ 1154.037126] Out of memory: Killed process 3359 (python3) total-vm:385952kB, anon-rss:36512kB, file-rss:9072kB, shmem-rss:0kB, UID:0 pgtables:636kB oom_score_adj:0
[ 1156.400513] Out of memory: Killed process 38523 (python3) total-vm:383812kB, anon-rss:34124kB, file-rss:10212kB, shmem-rss:0kB, UID:0 pgtables:624kB oom_score_adj:0
[ 1179.484715] Out of memory: Killed process 38649 (python3) total-vm:385464kB, anon-rss:35840kB, file-rss:10292kB, shmem-rss:0kB, UID:0 pgtables:624kB oom_score_adj:0
[ 1180.676428] Out of memory: Killed process 40810 (python3) total-vm:250588kB, anon-rss:27624kB, file-rss:9336kB, shmem-rss:0kB, UID:0 pgtables:500kB oom_score_adj:0
[ 1181.345107] Out of memory: Killed process 2134 (ovs-vswitchd) total-vm:89052kB, anon-rss:17528kB, file-rss:16876kB, shmem-rss:0kB, UID:0 pgtables:212kB oom_score_adj:0
[ 1182.351652] Out of memory: Killed process 40901 (python3) total-vm:203424kB, anon-rss:27708kB, file-rss:6208kB, shmem-rss:0kB, UID:0 pgtables:428kB oom_score_adj:0
[ 1184.345463] Out of memory: Killed process 3489 (qemu-kvm) total-vm:17571760kB, anon-rss:22140kB, file-rss:672kB, shmem-rss:0kB, UID:107 pgtables:532kB oom_score_adj:0
[root@NTNX-xxxxxxxx-A ~]#
一番下のログに着目していただきたいのですが、" Out of memory "によって、" qemu-kvm "プロセスが強制終了させられています。
ここでそれぞれの用語について補足します。まず「Out of memory」ですが、これはOSが利用可能なメモリを使い切り、これ以上プロセスを維持できない状態を意味しています。この状態では、カーネルがメモリ確保のために不要と判断したプロセスを強制終了(OOM Killer)します。
次に「qemu-kvm」ですが、これは仮想マシン(CVM)を実行しているハイパーバイザー上のプロセスです。このプロセスが停止するということは、仮想マシンそのものの稼働が終了することを意味します。
つまり今回の事象は、AHV上で発生したメモリ枯渇によりプロセスの強制終了(OOM Killer)が発動し、その結果としてCVMを実行していたqemu-kvmプロセスが強制終了され、仮想マシン自体が停止状態になったものと考えられます。
なぜ起きたのか?
理由は明らかです。NutanixのKB情報を確認すると、ネスト環境でNutanixを利用する場合は「すべてのゲスト メモリを予約 (すべてロック)」を有効化が必須になっています。今回は、ESXi上の仮想マシン(ネスト構成)としてNutanix CEを動作させていますが、ESXi上ではメモリオーバーコミットを許容しており、メモリの予約ができていない状態でした。
その結果、AHVに割り当てられるメモリが不安定となり、qemu-kvmを含むプロセスの強制終了が発生し、CVMのダウンにつながったと考えられます。
どう対策するか?
本番環境であれば十分なメモリを確保するのが正しい対応になります。ただし今回の対象はあくまでも検証用途の自宅ラボになります。そのためベストプラクティスからは外れますが、今の環境内でできる対策を行ってみます。
※以下の方法はあくまでも私の自宅ラボで、3ノードクラスターを安定稼働させるために実施したものです。根本原因の排除ではなく、リソース競合を回避するための調整として実施したものであるため、本番環境では非推奨です。
海外のブログ等を見てみると、以下の対応を行っている記事を見つけました。こちらを対応してみます。
- " virsh setmem / setmaxmem "コマンドでCVMが利用するメモリを削減する
- Nutanix CEの仮想マシンに割り当てているメモリを削減する
- Nutanix CEの仮想マシンの「すべてのゲスト メモリを予約」を有効にする
CVMの利用メモリの削減
" virsh setmem / setmaxmem "コマンドでCVMが利用するメモリを確認したところ、どちらも16GBに設定されていました。これより下げると今度は別の問題が発生しそうなので、今回はここは手を加えずにおいておきます。
[root@NTNX-xxxxxxxx-A ~]# virsh dominfo NTNX-xxxxxxxx-A-CVM
Id: -
Name: NTNX-xxxxxxxx-A-CVM
UUID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
OS Type: hvm
State: shut off
CPU(s): 2
Max memory: 16777216 KiB
Used memory: 16777216 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
[root@NTNX-xxxxxxxx-A ~]#
Nutanix CEの仮想マシン割り当てメモリの削減
Nutanix CEの仮想マシン割り当てメモリの削減ですが、以前の記事で、Nutanix CEの最小リソーステストを行った際の結果を参考にしました。この時は「メモリ24GBあれば動く」との結論にしていましたが、その後のSNSのやりとりで「20GBまでいけるかも…」というコメントもありましたので、今回は32GB→20GBに減らしてみることにします。
Nutanix CEの仮想マシンの「すべてのゲスト メモリを予約」を有効化
物理メモリ64GBに対して、20GB×3台=60GBになるので、要件通り「すべてのゲスト メモリを予約」を有効化しました。しかし、ESXiのオーバーヘッド等を踏まえると、実際にはメモリが不足していたのようで、3ノード目のNutanix CEが起動できませんでした。そのため、「すべてのゲスト メモリを予約」を無効状態のまま稼働させてみます。
[追記]構成変更後の結果
本記事公開後、さらに検証を行った結果、当初の構成では安定稼働しないケースがあったため、設定の見直しを実施しました。本章では、その検証結果および最終的に安定した構成について整理します。
確認結果
| 構成 |
メモリ予約 |
起動 結果 |
備考 |
| 20GB×3 |
on |
起動不可 |
メモリ確保不可のため3ノード目が起動しない |
| 20GB×3 |
off |
起動可 |
CVM含めて起動したがクラスタのメモリ使用率が100%張り付き (キャプチャの通り) |
| 18GB×3 |
on |
起動不可 |
Nutanix CEは起動するが中のCVMが起動しない |
| 18GB×3 |
off |
起動不可 |
Nutanix CEは起動するが中のCVMが起動しない |

この結果から、ESXi上で表示される空きメモリと、実際に仮想マシンに割り当て可能なメモリには乖離があることが分かりました。特にネスト環境では、ESXiのオーバーヘッドやメモリの断片化などの要因により、理論値通りにメモリを割り当てられないケースがあるようです。
また唯一起動に成功したパターンでも、クラスタの空きメモリがないため、検証用の仮想マシンも起動できない状態になっていました。
CVMメモリをさらに削減してみる(16GB→12GB)
当初は、CVMのメモリはデフォルトの16GBから変更しない方針としていました。 これは、CVMはクラスタのコアコンポーネントであり、過度なリソース削減は別の不具合を引き起こす可能性があると考えたためです。
しかし、前述の検証結果の通り、仮想マシン側のメモリを削減してもCVMが起動しないケースが発生し、CVM自身のメモリに手を加えないと意図した挙動にならない可能性があると思いました。
そのため、海外の検証事例を参考にしつつ、あくまで検証用途に限定した上で、CVMのメモリ削減(16GB → 12GB)を試すことにしました。手順は以下の通りです。
①CVMにログインしシャットダウン。
nutanix@NTNX-xxxxxxxx-A-CVM:[IPアドレス]:~$ cvm_shutdown -P now
②AHV上でCMがシャットダウンしたことを確認。
[root@NTNX-xxxxxxxx-A ~]# virsh list --all
Id Name State
--------------------------------------
- NTNX-xxxxxxxx-A-CVM shut off
③CVMの設定ファイルを編集。
[root@NTNX-xxxxxxxx-A ~]# virsh edit NTNX-xxxxxxxx-A-CVM
★編集前
<memory unit='KiB'>16777216</memory>
<currentMemory unit='KiB'>16777216</currentMemory>
<numa>
<cell id='0' cpus='0-1' memory='16777216' unit='KiB' memAccess='shared'/>
</numa>
★編集後
<memory unit='KiB'>12582912</memory>
<currentMemory unit='KiB'>12582912</currentMemory>
<numa>
<cell id='0' cpus='0-1' memory='12582912' unit='KiB' memAccess='shared'/>
</numa>
④設定が変わったことを確認。
[root@NTNX-xxxxxxxx-A ~]# virsh dominfo NTNX-xxxxxxxx-A-CVM
Id: -
Name: NTNX-xxxxxxxx-A-CVM
UUID: (省略)
OS Type: hvm
State: shut off
CPU(s): 2
Max memory: 12582912 KiB
Used memory: 12582912 KiB
Persistent: yes
Autostart: disable
Managed save: no
Security model: selinux
Security DOI: 0
⑤CVMを起動。
[root@NTNX-xxxxxxxx-A ~]# virsh start NTNX-xxxxxxxx-A-CVM
⑥CVMのメンテナンスモードを解除。 ※今回はクラスタ内の別CVMから実施しました。
nutanix@NTNX-xxxxxxxx-A-CVM:[IPアドレス]:~$ acli host.list ※対象CVMのHost UUIDを確認
nutanix@NTNX-xxxxxxxx-A-CVM:[IPアドレス]:~$ acli host.exit_maintenance_mode [対象CVMのHost UUID]
⑦クラスター状態を確認。 ※対象CVMのステータスが「maintenance」から「up」になっていればOK。
nutanix@NTNX-xxxxxxxx-A-CVM:[IPアドレス]:~$ cluster status
CVMメモリ削減後の結果
CVMのメモリを12GBに変更した結果、以下のような挙動となりました。
- 3ノードすべてでCVMが正常起動
- クラスタ全体が安定稼働し、CVMダウンは発生もなくなった
- メモリ使用率は依然として高い(キャプチャの通り)が、qemu-kvmの強制終了は発生しなくなった

今回の構成では、ESXi上でメモリオーバーコミットが発生しており、AHVに割り当てられるメモリが状況によって変動しています。そのため、AHV上のqemu-kvmプロセスがOOM Killerの対象となり、CVMの強制停止が発生していたと考えられます。
CVMのメモリを16GBから12GBへ削減したことで、Nutanix CE自体のメモリ使用量に余裕が生まれ、OOM発生条件が緩和された結果、qemu-kvmが強制終了されにくくなり、CVMの安定稼働につながったと推測されます。
最終構成
本検証環境では、以下の構成で安定稼働を確認しました。
- Nutanix CE VM:20GB × 3ノード
- メモリ予約:OFF
- CVMメモリ:12GB
※改めてですが、本構成はあくまでネスト環境かつ検証用途での暫定的なチューニングです。本番環境では推奨されません。
おわりに
今回は自宅ラボのCVMが不安定であるということからスタートしました。最初は焦りましたが、原因にたどり着いて安心しています。
今回の事象から、「ハイパーバイザー層のリソース競合」が、ネスト構成では顕著に現れることを再認識しました。シングルノードシングルクラスター環境では絶対に意識することのない内容だと思うので、自宅ラボ環境を整備してよかったな、と前向きにとらえています。
設定調整後の再発有無の確認として、今後もPrism Elementのアラート履歴やdmesgログは継続的に見ていきたいと思います。安定していることが分かれば、次の検証に進みたいです。