実際の問題:本番VMにRAMを追加したいがシャットダウンできない
これは思っている以上によくある状況です。本番データベースを動かしているVMがあり、RAMの不足からクエリが徐々に遅くなっている。DBAから8GBを16GBに急いで増やしてほしいと要求がくる。しかし、設定変更のためにVMをシャットダウン?それはできません――メンテナンスウィンドウは2週間前に申請が必要で、今日中に対応しなければならないのに。
私自身、あるプロジェクトでESXi 7.0クラスターを管理していたときに、まさにこの状況に直面しました。PostgreSQLを動かすVMに急いでRAMを追加する必要がありましたが、最初からHot Addを有効にしていませんでした。結果:アプリケーションが遅いまま、翌週のメンテナンスウィンドウまで待つしかありませんでした。その経験以来、すべてのVMテンプレートにはデプロイ前からHot Addを有効にするようにしています。
こんなときに役立つのが、VMware vSphereのHot Add CPUとHot Add Memory機能です。事前に有効化しておけば、VMを再起動せずに稼働中の仮想マシンにCPUコアやRAMを追加できます――ゲストOSは新しいリソースをすぐに認識します。
vSphereが対応しているのにHot Addが機能しない理由
多くの人がHot Addは自動で使えると思い込んでいます。実際には、同時に満たすべき3つの条件があります:
- ライセンスの要件:ESXi StandardはHot Add Memoryのみ対応。Hot Add CPUはEnterprise Plusが必要
- VM停止中にのみ有効化可能:VMの電源が入っているときにこのオプションを変更することはできません――これが最もよくある落とし穴です
- ゲストOSのサポート:Linuxカーネル2.6.25以降およびWindows Server 2008以降は問題ありませんが、一部の古いディストロではモジュールを手動でロードする必要があります
最大の落とし穴は、このオプションはVMが完全にシャットダウンされている状態でのみ有効化できるという点です。VMが稼働中は、すべての設定がグレーアウトされています――シャットダウンして機能を有効にし、VMを再起動する必要があります。そのため、VMの作成時またはテンプレートから設定することがベストプラクティスです。
Hot Addを有効化する方法
方法1:vSphere Client(GUI)から設定
VMを1台ずつ手動で設定する場合に適しています:
- VMをシャットダウン(Power Off)
- VMを右クリック → 設定の編集(Edit Settings)
- VM Optionsタブを選択 → Advancedを展開
- Memoryセクションを探す → Enable Hot Plugにチェックを入れる
- Virtual Hardwareタブに戻る → CPUをクリック
- Enable CPU Hot Addにチェックを入れる
- OKをクリック → VMを起動
VMが起動したら、稼働中にEdit Settingsにアクセスして、CPUコア数やRAMを増やすことができます――再起動は不要です。
方法2:PowerCLI(一括処理)
複数のVMに一度に有効化する必要がある場合、PowerCLIははるかに効率的な選択肢です。まずvCenterに接続します:
# vCenterに接続
Connect-VIServer -Server vcenter.lab.local -User [email protected] -Password "P@ssw0rd"
# 特定のVMのHot Addを有効化(VMはシャットダウン済みであること)
$vm = Get-VM -Name "db-postgres-01"
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.memoryHotAddEnabled = $true
$spec.cpuHotAddEnabled = $true
$vm.ExtensionData.ReconfigVM($spec)
Write-Host "Hot Addが有効化されました:$($vm.Name)"
VM名のパターンで一括有効化:
# シャットダウン済みのVMのみ処理――一括実行時に安全
Get-VM -Name "db-*" | Where-Object {$_.PowerState -eq "PoweredOff"} | ForEach-Object {
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.memoryHotAddEnabled = $true
$spec.cpuHotAddEnabled = $true
$_.ExtensionData.ReconfigVM($spec)
Write-Host "Hot Addを有効化しました:$($_.Name)"
}
方法3:ESXiホスト上で.vmxファイルを直接編集
低レベルの操作が必要な場合やvSphere Clientへのアクセス権がない場合に使用します。ESXiホストにSSH接続します:
# VMIDを取得
vim-cmd vmsvc/getallvms | grep "db-postgres-01"
# VMをシャットダウン(42を実際のVMIDに置き換え)
vim-cmd vmsvc/power.off 42
# .vmxファイルを検索して編集
find /vmfs/volumes/ -name "db-postgres-01.vmx"
vi /vmfs/volumes/datastore1/db-postgres-01/db-postgres-01.vmx
.vmxファイルに以下の2行を追加します:
mem.hotadd = "TRUE"
vcpu.hotadd = "TRUE"
# 設定をリロードしてVMを再起動
vim-cmd vmsvc/reload 42
vim-cmd vmsvc/power.on 42
ベストな方法:VMテンプレートでHot Addを事前に有効化
新しいVMへの有効化を何度か忘れた後、本当の解決策はテンプレートでHot Addを有効化することだと気づきました――クローンされたすべてのVMに最初から設定が入っているため、忘れる心配がありません。
# 編集のためにテンプレートをVMに変換
$template = Get-Template -Name "ubuntu-22.04-base"
Set-Template -Template $template -ToVM
$vm = Get-VM -Name "ubuntu-22.04-base"
# Hot Addを有効化
$spec = New-Object VMware.Vim.VirtualMachineConfigSpec
$spec.memoryHotAddEnabled = $true
$spec.cpuHotAddEnabled = $true
$vm.ExtensionData.ReconfigVM($spec)
# テンプレートに戻す
Set-VM -VM $vm -ToTemplate -Confirm:$false
Write-Host "Hot Add有効化済みのテンプレートが更新されました"
これ以降、このテンプレートからデプロイされるすべてのVMには自動的にHot Addが設定されます――デプロイパイプラインに手動設定のステップを追加する必要はありません。
ゲストOSが新しいリソースを認識しているか確認する
稼働中にvSphereでCPU/RAMを増やした後、ゲストOSが認識していることを確認します:
Linuxの場合:
# 現在のRAMを確認
free -h
# ホットアド成功時のイベントをdmesgで確認
dmesg | grep -i "memory\|acpi\|hot"
# CPU数を確認
nproc
lscpu | grep "^CPU(s):"
一部の古いLinuxカーネルでは、CPUホットアドを認識するためにacpiphpモジュールのロードが必要です:
# モジュールをすぐにロード
modprobe acpiphp
# 起動時に自動ロード
echo "acpiphp" >> /etc/modules
Windows Serverの場合、タスクマネージャー → パフォーマンスを開くと、再起動なしでRAMとCPUがすぐに更新されているのを確認できます。
一括有効化前に知っておくべきこと
個人のラボ環境でVMwareからProxmoxへ移行したとき、ProxmoxのHot Plugの扱い方がまったく異なることに気づきました――事前設定なしで、VMの電源が入っていても切れていてもリソースを変更できるのです。「事前にVMをシャットダウンしなければならない」というvSphereのワークフローに慣れていたので、これは驚きでした。各プラットフォームには独自の設計思想があり、その違いを理解することで多くの不必要なトラブルを回避できます。
vSphereに話を戻すと、Hot Addを有効化する際に注意すべき点がいくつかあります:
- Hot Add CPUはNUMAオーバーヘッドを増加させます:物理NUMAノードを超えてCPUを追加すると、パフォーマンスが低下する可能性があります。データベースなどレイテンシに敏感なVMには注意が必要です
- Memory Hot Addはリムーブできません:RAMの追加はできますが、削減には再起動が必要です。これはVMwareではなくOSの制限です
- VMハードウェアバージョン7以上が必要:ESX 3.x以前に作成されたVMはHot Addを有効化する前にハードウェアバージョンをアップグレードする必要があります
- CPU追加後はNUMAを監視する:
esxtop(mキーでメモリ統計表示)を使ってホットアド後のNUMAの不均衡を確認してください
# PowerCLIでクラスター内の全VMのHot Addステータスを確認
Get-VM | Select-Object Name,
@{N="MemHotAdd";E={$_.ExtensionData.Config.MemoryHotAddEnabled}},
@{N="CPUHotAdd";E={$_.ExtensionData.Config.CpuHotAddEnabled}},
@{N="PowerState";E={$_.PowerState}} | Format-Table -AutoSize
このスクリプトはクラスター全体の一覧を表示します――問題が発生する前にHot Addが有効化されていないVMを素早く特定できます。
まとめ
ダウンタイムが最小限に抑えられる本番環境で非常に実用的な機能です。最初からテンプレートで有効化しておけば、忘れる心配も手間もかかりません。PowerCLIと組み合わせた監査や一括更新により、クラスター内のすべてのVMがHot Addに対応していることを数分で確認できます。
vSphere環境を管理していてHot Addのポリシーがまだない場合、今がそれを整備する良い機会です――急いで必要になってから慌てないために。

