EVCモードの不一致でvMotionが失敗する
先日、こんなトラブルに遭遇しました。
Issue
【構成および前提】
・1-4号機の4台によるvSAN構成
・4台ともEnhanced vMotion Compatibility(EVC)はL6(Haswell世代)にて有効
・ESXiバージョンは6.7U3
※ただし、1号機のみ別問題対応にて、6.7U3クリーンインストール
【現象】
1号機をメンテナンスモードにしようとした際、複数のVMが2-4号機にvMotionできず失敗となった。なお、一部のVMは、1号機から2-4号機へvMotionできていたことを確認した。
【切り分け】
・手動で1号機から2号機へvMotion実施(メンテナンスモード移行時に失敗したVM)
→EVCの不一致エラーで失敗
・2号機から1号機へvMotion実施(メンテナンスモード移行時に成功したVM)
→vMotion成功
・テストVMを1号機で起動し、2号機へvMotion実施
→vMotion失敗(同じエラー)
・テストVMを2号機で起動し、1号機へvMotion実施(その後3、4号機へvMotion)
→vMotion成功
ここまでで、どうやら1号機で起動したVMは、2-4号機へvMotionできないことが分かった。1号機だけクリーンインストールを実施したことで、何かしら差異があるのだと仮定して、ホストプロファイルの見直し、EVC含むその他設定なども見直したが、あたりがつかず・・・。
・仮想マシン単位のEVCをテストVMでwestmere世代まで落として1号機で起動
→1号機で起動し、2-4号機へvMotion成功
んー・・ますますわからん・・・^^;
本番環境なので、安易に再起動などできない上に、、そもそもメンテナンスモードに移行できないし・・・。
というわけで、いったん主なログやconfigを取得し、調査開始。
Resolution
1号機と2-4号機で、CPUに関する差異があることはなんとなくわかった。
そこで、configの見直しを実施。
結論から言うと・・
--/etc/vmware/config
featMask.evc.cpuid.MDCLEAR = "Val:1"
こいつだった。
この「MDCLEAR」というのは、Intel CPUのマイクロコードに関する脆弱性に関連しており、その緩和策としてこの値が「無効」になっていたということになる。
1号機のみESXi6.7u3をクリーンインストールしたことで、この値の差異が生まれてしまったということが原因だった。
はっきりとしたことはわからないが、脆弱性に対応したバージョンにアップデートした後、なんらかの原因でこの値が正しく有効にならないケースがあるようだ。
2-4号機では、MDCLEAR機能が有効になっていなかった状況が確認できた。(そのためにvMotion時に行われるMDCLEARのチェックがエラーとなっていた)
本来であれば、6.7P01へアップデートした際に、有効となっていなければならなかったようだ。おそらくは、BIOSレベルの設定であるため、ハードリセットが必要であったと考えられる。(物理サーバを完全にパワーオフ→パワーオンの動作)
今回は、2-4号機についてもすでに6.7U3へアップデート済みのため、下記対応を実施。
2-4号機について、1台ずつ
1.メンテナンスモードへ移行
2.ESXiをシャットダウン
3.サーバをパワーオフ
4.サーバをパワーオン
5.ESXi起動後、メンテナンスモード解除
下記、コマンドでMDCLEARが有効になったことを確認
# vim-cmd hostsvc/hostconfig|grep -A 2 MDCLEAR
これが
key = "cpuid.MDCLEAR",
featureName = "cpuid.MDCLEAR",
value = "0"
こうなっていればOK
key = "cpuid.MDCLEAR",
featureName = "cpuid.MDCLEAR",
value = "1"
2-4号機すべて完了した後、手動でvMotionを実施
→成功
1号機をメンテナンスモード移行
→成功
というわけで、トラブルシューティングを完了できました。