あえて修正しなくてもベストな値が自動で反映されているので通常は修正する必要はありませんが、各 ESXi 毎に予めシステムリソースの予約値を多めに確保しておきたい場合や、ホームラボ用途で予約値を減らしたいという場合もあるので、本記事では PowerCLI を利用して変更する方法を記します。
※ 正式な手順ではないので設定する場合は必ず事前検証、場合によっては各メーカーサポートへの確認を行ってください。変更すると公式サポートが受けられない可能性があります。
※ あと、だいぶ前に見た KB で今見つからなかったのですが、vSphere のバージョンアップ時などに設定がリセットされる事象があったのでもしかしたら今のバージョンでも元に戻る仕様かもしれません。
本記事は LucD さんの VMTN での助言をベースにしています。
- Host System Resource Allocation / Reservation via PowerCLI
https://communities.vmware.com/thread/326950
システムリソースの予約値とは?
システムリソースの予約とは、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 での回答を例に設定してみます。
まずは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 件のコメント:
コメントを投稿