逆説:リソースに余裕があるのに仮想マシンがカクつく
「ユーザーからアプリケーションのレスポンスが遅いと苦情が来ているのに、vCenterを確認するとCPU使用率はわずか15〜20%」という状況に頭を抱えたことはありませんか?さらに、vCPUを追加すればするほど、仮想マシンの動作が以前よりも遅くなってしまうことさえあります。
以前、製造チーム向けにSQL Serverを稼働させている8台のESXiホストクラスターを対応したことがあります。このVMには24コアの物理CPUに対して16 vCPUが割り当てられました。一見リソースは十分にあるように見えましたが、クエリの実行時間が突然200msから5秒にまで跳ね上がりました。詳しく調査した結果、主な原因はCPU Ready Time (%RDY)であることが判明しました。これは、VMwareシステム担当者が不当な苦労を避けるために必ず理解しておくべき指標です。
CPU Ready Timeとは何か?
簡単に言うと、CPU Ready Timeとは「仮想マシンが処理を行う準備はできているが、空いている物理CPU(pCPU)がないために待機列に並んでいる時間」のことです。
ESXiホストを8つのテーブルがあるレストランに例えてみましょう。4人のグループ(4 vCPUを持つVM)が入店します。VMwareのスケジューリングメカニズムでは、このグループがサービスを受けるには4つのテーブルが同時に空く必要があります。もし3つしか空いていなければ、4人のグループは入り口で待たなければなりません。この待ち時間こそがReady Timeです。
vCPUを過剰に割り当てると(オーバーサブスクリプション)、CPUスケジューラ(CPU Scheduler)の負荷が高まります。vCPUが多い仮想マシンほど、必要な数の物理コアを同時に確保するのが難しくなります。その結果、Ready Timeが急増し、システム全体の負荷が低くてもラグが発生する現象が起こります。
esxtopを使用したCPU Ready Timeの診断方法
vCenterにはパフォーマンスグラフがありますが、私は常にesxtopを信頼しています。このツールはミリ秒単位で正確なリアルタイムデータを提供してくれます。
ステップ1:ESXiホストへのログイン
ホストでSSHを有効にし、Puttyやターミナルを使用してログインします。
ステップ2:診断コマンドの実行
esxtop
キーボードの ‘c’ を押して、CPU監視画面であることを確認します。
ステップ3:%RDY指標の読み解き
%RDY列に注目してください。これはVMの健全性を測る最も重要な指標です:
- 5%未満: システムは非常に安定しています。
- 5% – 10%: リソース競合の兆候が出始めています。操作時にわずかな遅延を感じるでしょう。
- 10%以上: 警告状態です。アプリケーションのタイムアウトやフリーズが頻発します。
計算のヒント: vCenterで数値(ms単位)を確認する場合は、以下の式を使用してパーセンテージに変換してください(デフォルトの20,000ms周期の場合):
(%RDY) = (CPU Ready Value / 20000) * 100
CPU Ready Timeを解消するための実践的な経験
システムを「快適な状態」に戻すために私がよく使う4つの手法を紹介します。
1. 「ライトサイジング」の原則:少ない方が良い場合が多い
念のためにと、vCPUを多めに割り当てる習慣を持つ人が多いですが、実際にはほとんどのWebサーバーやアプリサーバーは2 vCPUで十分です。
%RDYが高い場合は、迷わずvCPUの数を減らしてください。以前、あるVMを8 vCPUから4 vCPUに減らしたところ、驚くべきことに処理速度が2倍になりました。理由は、そのVMが8つの物理コアを同時に占有するために長時間待機する必要がなくなったからです。
2. CPU制限(Limit)の解除
誤ってCPU Limitを設定してしまうことがあります。VMがこの制限に達すると、ESXiは強制的に待機させるため、%RDYが擬似的に上昇します。制限は常にUnlimited(無制限)に設定してください。リソースの優先順位を付けたい場合は、LimitではなくSharesを使用しましょう。
3. 電源管理を「高パフォーマンス」に変更する
デフォルトでは、DellやHPのサーバーはBIOSで省電力モードに設定されていることが多いです。これはCPUコアの「ウェイクアップ」プロセスを遅らせる原因になります。
BIOSとESXiの両方の構成で、電源管理をHigh Performance(高パフォーマンス)に変更することをお勧めします。ESXiでの操作は簡単です:ホスト -> 設定 -> ハードウェア -> 電源管理 -> 編集。
4. PowerCLIによるシステムクイックスキャン
数百台のVMを管理している場合、一台ずつ手動でチェックすることは不可能です。過去5分間にCPUが「枯渇」している仮想マシンを抽出するには、以下のスクリプトを使用してください。
$vms = Get-VM
foreach ($vm in $vms) {
$stat = Get-Stat -Entity $vm -Stat cpu.ready.summation -Realtime -MaxSamples 1
$readyPercent = ($stat.Value / 20000) * 100
if ($readyPercent -gt 5) {
# 警告: VM [名前] の %RDY = [パーセンテージ]%
Write-Host "警告: VM $($vm.Name) の %RDY = $($readyPercent)%" -ForegroundColor Red
}
}
おわりに
CPU Ready Timeは、仮想化システムにおける「静かなる殺し屋」のようなものです。このエラーを避けるために、1つのソケットの物理コア数を超えるvCPUを割り当てないようにしてください(NUMAノードの競合を避けるため)。
まずは最小限の構成から始め、実際のCPU使用率が80%に達したときにのみ追加するようにしましょう。%RDY指標を定期的に監視することで、無駄なトラブルシューティングの時間を大幅に削減できます。もし仮想マシンが重いと感じたら、すぐにesxtopを開いてみてください!

