ad1

2020年6月15日月曜日

ESXi 6.x 以降でシステムリソースの予約値を変更する方法

vSphere 5.5 (ESXi 5.5) までは vSphere Client で値の変更が出来たシステムリソース(ESXi Kernel のリソース)の予約値ですが、vSphere 6.0 以降では変更が出来なくなってしまいました。
あえて修正しなくてもベストな値が自動で反映されているので通常は修正する必要はありませんが、各 ESXi 毎に予めシステムリソースの予約値を多めに確保しておきたい場合や、ホームラボ用途で予約値を減らしたいという場合もあるので、本記事では PowerCLI を利用して変更する方法を記します。

※ 正式な手順ではないので設定する場合は必ず事前検証、場合によっては各メーカーサポートへの確認を行ってください。変更すると公式サポートが受けられない可能性があります。
※ あと、だいぶ前に見た KB で今見つからなかったのですが、vSphere のバージョンアップ時などに設定がリセットされる事象があったのでもしかしたら今のバージョンでも元に戻る仕様かもしれません。

本記事は LucD さんの VMTN での助言をベースにしています。

システムリソースの予約値とは?

システムリソースの予約とは、ESXi が動作するために最低限確保している CPU とメモリのリソース予約値で vSphere Client からホストを選択し、設定 > システム > システムリソースの予約 を開く事で確認できます。


このシステムリソースの予約、vSphere 5.5 までは vSphere Client の画面上にて編集する事が可能でしたが、vSphere 6.0 以降では vSphere Client では編集が出来ません(上記画面上で編集ボタンがそもそもない)。
※ これは設定に応じて適切な値が自動で予約されており、意図的にリソースを減らされて ESXi Kernel が不安定になる事を防止するために変更されたものと思われます。

今回はこの値を PowerCLI を利用して変更する方法をご紹介します。

システムリソースの予約値の変更以外で対応可能な制御方法

現バージョンでは標準 UI から変更不可となってしまったシステムリソースの予約値を変更する以外に、予めシステムリソースをある程度確保しておく方法として vSphere HA のアドミッションコントロールで全体の余剰リソースを多めに確保する方法や、VM を格納するリソースプールの制限設定でシステムリソース分を確保しておく方法があり、むしろクラスタ全体で柔軟なリソース管理をする意味でこちらが現在の推奨設定です。

これらの方法はクラスタ単位での設定であり、リソースプールの設定は格納された VM にのみ適用される制御方法となるため、単一ホストに負荷が集中して ESXi のシステムリソースが不足しないようにするためには DRS で VM の自動負荷分散配置できるようにします。

アドミッションコントロールについての公式 Docs

リソース プールの管理の公式 Docs

PowerCLI を利用したシステムリソースの予約値変更

まず、手元の環境の vSAN クラスタのうち 1台のシステムリソースの予約値を確認します。

画面を見るとメモリが 25.16GB、CPU が 239 MHz システムリソースとして予約されています。
但し、GUI でみる場合と、CLI での設定では単位の違いや微妙な数値の違いがあるので 正確な設定値を CLI で事前確認する事が必須です。
これを PowerCLI で確認する際には一発で取得するコマンドは用意されていないので、Get-VMHost で取得した ESXi の情報の中から探し出します。
今回求める情報は ExtensionData > SystemResources > "host/system" Key > Config と求めていきます。

# CPU 予約値の確認
PS C:\> $esx1 = (Get-VMHost)[0]   # ホスト1号機を指定
PS C:\> ($esx1.ExtensionData.SystemResources.Child | where {$_.key -eq "host/system"}).Config.CpuAllocation
Reservation           : 239    ← 239MHz 予約されている事が分かる
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1

# メモリ予約値の確認
PS C:\> ($esx1.ExtensionData.SystemResources.Child | where {$_.key -eq "host/system"}).Config.MemoryAllocation
Reservation           : 24869  ← GUIの数値とは若干異なる事が分かる、ここでは 24869MB で予約されている
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1
 

念のため、全体の CPU のリソースも確認しておきます。
以下から 28,728 MHz という事が分かります。

PS C:\> Get-VMHost

Name                 ConnectionState PowerState NumCpu CpuUsageMhz CpuTotalMhz   MemoryUsageGB   MemoryTotalGB Version
----                 --------------- ---------- ------ ----------- -----------   -------------   ------------- -------
vxesx01.vx.local     Connected       PoweredOn      12       18523       28728         197.555         255.889   6.7.0
vxesx02.vx.local     Connected       PoweredOn      12        9587       28728         217.086         255.889   6.7.0
vxesx04.vx.local     Connected       PoweredOn      12       13355       28728         124.164         255.889   6.7.0
vxesx03.vx.local     Connected       PoweredOn      12       11707       28728         109.574         255.889   6.7.0
 

今回は例として、ミッションクリティカルなシステムなのでシステムリソースの予約値として CPU 全体の MHz 合計値の 10% = 2,872MHz を予約値として LucD さんの VMTN での回答を例に設定してみます。
※ 必ず設定変更する前に ESXi のコンフィグバックアップを取得したり(KB)、現在の設定値をエクスポート(VMTNのサンプル)しておいて元に戻せるようにしてください。

まずは1台目のホストを指定して設定反映させてみます。

PS C:\> $esx1 = (Get-VMHost)[0]                             # ← まずはホスト1号機に設定
PS C:\> $spec = New-Object VMware.Vim.HostSystemResourceInfo
PS C:\> $spec.key = "host/system"
PS C:\> $spec.Config = New-Object VMware.Vim.ResourceConfigSpec
PS C:\> $spec.Config.cpuAllocation = New-Object VMware.Vim.ResourceAllocationInfo
PS C:\> $spec.Config.cpuAllocation.reservation = 2872       # ← 合計 CPU の 10% を指定
PS C:\> $spec.Config.memoryAllocation = New-Object VMware.Vim.ResourceAllocationInfo
PS C:\> $spec.Config.memoryAllocation.reservation = 24869   # ← メモリの予約値は初期値をそのまま反映
PS C:\> $spec.Config.ChangeVersion = $esx1.ExtensionData.SystemResources.Config.ChangeVersion
PS C:\> $esx1.ExtensionData.UpdateSystemResources($spec)    # ← 変更値の反映
 
変更後の値を確認します
# CPU 予約値の変更確認

PS C:\> ($esx1.ExtensionData.SystemResources.Child | where {$_.key -eq "host/system"}).Config.CpuAllocation
Reservation           : 2872    # ← 2,872MHz に予約値が変更されている事が分かる
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1
 

vSphere Client 上での変更値を確認すると CPU のリソース予約が 2.87GHz (=2,872MHz) に変更された事が確認できます。 


問題なければ、クラスタ内の他のホストにも変更を掛けます。
※ 以下の例では Get-VMHost で取得したすべてのホストが同一構成で同じ CPU 予約値を設定する前提でパイプで渡して一括設定しています。

# 同一構成の4台でクラスタが組まれている前提で一括適用(1台目に設定した際の $spec が生きている状態で)
PS C:\> Get-VMHost | %{$spec.Config.ChangeVersion = $_.ExtensionData.SystemResources.Config.ChangeVersion; $_.ExtensionData.UpdateSystemResources($spec)}

# 4台とも変更されたことを確認
PS C:\> ((Get-VMHost).ExtensionData.SystemResources.Child | where {$_.key -eq "host/system"}).Config.CpuAllocation


Reservation           : 2872
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1

Reservation           : 2872
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1

Reservation           : 2872
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1

Reservation           : 2872
ExpandableReservation : True
Limit                 : -1
Shares                : VMware.Vim.SharesInfo
OverheadLimit         : -1
 

設定を一括で元に戻したい場合は以下で戻すことが可能です。

PS C:\> $spec = New-Object VMware.Vim.HostSystemResourceInfo
PS C:\> $spec.key = "host/system"
PS C:\> $spec.Config = New-Object VMware.Vim.ResourceConfigSpec
PS C:\> $spec.Config.cpuAllocation = New-Object VMware.Vim.ResourceAllocationInfo
PS C:\> $spec.Config.cpuAllocation.reservation = 239       # ← 初期値の CPU リソース予約値を入力
PS C:\> $spec.Config.memoryAllocation = New-Object VMware.Vim.ResourceAllocationInfo
PS C:\> $spec.Config.memoryAllocation.reservation = 24869   # ← メモリの予約値は初期値をそのまま反映
PS C:\> Get-VMHost | %{$spec.Config.ChangeVersion = $_.ExtensionData.SystemResources.Config.ChangeVersion; $_.ExtensionData.UpdateSystemResources($spec)}
 

以上が変更手順、確認手順となります。

何らかの検証でシステムリソースを多めに確保しておきたい場合や、逆にリソースの限られるホームラボ環境でシステムリソースの予約を減らしたい場合に活用できる手法ですが、システムリソースを減らすことは安定性を失うことになりかねないので十分にご注意ください。

0 件のコメント:

コメントを投稿

過去30日でアクセスの多い投稿