VMwareにおけるCPU、RAM、Disk I/O管理:「Noisy Neighbor」によるシステムダウンを防ぐ

VMware tutorial - IT technology blog
VMware tutorial - IT technology blog

仮想マシン同士のリソースの「奪い合い」を防ぐには?

ESXiホストのCPU使用率に40%の余裕があるのに、中の仮想マシン(VM)がカクついたり遅延したりした経験はありませんか?仮想化管理者の最大の恐怖は、サーバーのダウンではなく、原因不明の「激重」状態でシステムが動作することです。多くの場合、問題はハードウェア不足ではなく、リソースの割り当て方が不適切であることに起因します。

個人のラボ環境から企業のvSphereクラスタ管理に転向したばかりの頃、私は「オーバープロビジョニング(Over-provisioning)」という典型的なミスを犯しました。vCPUを大量に割り当てればVMが強力になると勘違いしていたのです。その結果、CPU Ready Timeが15%を超えて急上昇し、VM同士でリソースの激しい奪い合いが発生、システム全体が停滞してしまいました。この記事では、同じ轍を踏まないよう、Shares、Reservations、Limitsの使い分けを徹底解説します。

背景:なぜデフォルト設定だけでは不十分なのか?

デフォルトでは、vSphereは「早い者勝ち」に近い形で、比較的公平にリソースを分配します。しかし、現実にはすべてのVMが同じ重要度であるわけではありません。数千人のユーザーを抱えるデータベースサーバーは、プリントサーバーやテスト用Webサーバーよりも優先されるべきです。

設定を疎かにすると、すぐに「Noisy Neighbor(うるさい隣人)」問題に直面します。CPUループに陥ったVMやDDoS攻撃を受けているVMが1つあるだけで、同じホスト上で稼働するすべてのVMのパフォーマンスを道連れにしてしまうのです。

強力な武器を有効化する:vSphere DRS

リソースを効率的に管理するには、vCenter ServerとESXiホストをクラスターにまとめる必要があります。特に、vSphere DRS (Distributed Resource Scheduler) を有効にしましょう。この機能により、vCenterは負荷の高いホストから余裕のあるホストへVMを自動的に移行(vMotion)してくれます。

  1. vSphere Clientにアクセスし、対象のクラスターを選択します。
  2. [設定] タブから [**vSphere DRS**] を選択します。
  3. [編集] をクリックし、ステータスを [**オン**] に切り替えます。

補足:無料版のESXiを使用している場合、個々のVMに対してSharesやLimitsを設定することは可能ですが、リソースプールによる自動負荷分散機能は利用できません。

3つの重要パラメーター:Shares、Reservations、Limitsを徹底解剖

これら3つのパラメーターの本質を理解することが、システムパフォーマンスをマスターする鍵となります。

1. Reservations(予約:最小保証リソース)

これは、ESXiがそのVMのために確保を約束するリソース量です。ホストにReservationで設定した分の空きメモリ(例:2GB RAM)がない場合、そのVMは起動すらできません。

アドバイス: SQL ServerやOracleなどの極めて繊細なアプリケーションにのみ設定してください。すべてのVMに設定すると、仮想化の最大の利点である「オーバーコミット」ができなくなります。

2. Limits(制限:最大リミット)

Limitsはハードリミットです。ホストが90%空いていても、VMはこの数値を超えてリソースを使うことは許可されません。

警告: RAMに対してLimitを設定することは極力避けてください。VMが RAMの上限に達すると、ESXiは強制的にディスクへのスワップを開始します。アクセス速度がナノ秒(RAM)からミリ秒(ディスク)へと低下し、VMはほぼフリーズ状態に陥ります。

3. Shares(シェア:相対的な優先度)

Sharesは、リソースの競合(Contention)が発生したときにのみ機能します。ホストが混雑している際、Sharesの値が高いVMが優先的に処理されます。

例えば、データベースVMを「高(High)」、Web VMを「通常(Normal)」に設定した場合、CPUが過負荷になるとデータベースにはWebの2倍のリソースが割り当てられます。システムが空いているときには無駄が発生しないため、最もスマートな調整方法です。

Storage I/O Control (SIOC) によるディスクI/Oの最適化

CPUやRAMだけに目を向けてはいけません。ディスクI/Oこそが、システム遅延の最も一般的なボトルネックです。1つのVMでウイルススキャンが走ると、ディスク帯域を独占し、レイテンシ(遅延)が50msを超え、他のVMがフリーズすることがあります。

この問題を解決するには、データストアで **Storage I/O Control (SIOC)** を有効にします:

  1. [データストア] 一覧から対象のデータストアを選択します。
  2. [設定] -> [**全般**] 開きます。
  3. [データストア機能] で、[**Storage I/O Control**] を有効にします。

有効化後、各VMのディスクSharesを調整します。DBサーバーには2000、サブサーバーには500や1000を設定するのが一般的です。

esxtopで「語る」指標を読み解く

設定が有効かどうかを確認するには、実際の数値を見る必要があります。ホストにSSHで接続し、`esxtop` コマンドを入力してください。

  • **’c’** を押してCPUを表示:**%RDY** 列に注目してください。この数値が **10%** を超えている場合、VMは「順番待ち」が長すぎます。他のVMのvCPUを減らすか、そのVMのSharesを上げてください。
  • **%MLMTD > 0** の場合:設定した *Limit* 自体によってVMが制限されています。VMが遅い場合は制限を緩和してください。
  • **’m’** を押してRAMを表示:**SWCUR** 列を確認します。この数値が0より大きい場合、VMはディスクへのスワップを行っています。すぐにメモリを追加割り当てする必要があります。

PowerCLIによるクイックチェック

何百台ものVMを管理している場合、一つずつ手動でチェックするのは不可能です。このPowerCLIによるスクリプトを使えば、ハードリミットが設定されているVMを素早くリストアップできます:


Get-VM | Get-VMResourceConfiguration | Where-Object {$_.CPULimitMhz -ne -1 -or $_.MemLimitMB -ne -1} |
Select-Object VM, CPULimitMhz, MemLimitMB | Format-Table -AutoSize

実務経験から得た黄金律

長年の運用を経て、私はいくつかの重要な原則を導き出しました:

  • vCPUは少ないほど良い: 負荷80%で動作する2つのvCPUを持つVMの方が、負荷10%で動作する8つのvCPUを持つVMよりもスムーズに動作することが多いです。これにより、CPUスケジューラーへの負荷を軽減できます。
  • LimitsよりもSharesを優先: 固定の数値でシステムを縛り付けるのではなく、システムが柔軟に自己調整できるようにしましょう。
  • ホストに「遊び」を持たせる: ホストのRAMを90%以上使い切らないようにしてください。少なくとも10%はESXiのシステムプロセス用に残しておきましょう。

これらの知見が、仮想化環境の最適化に役立つことを願っています。もし異常に高い %RDY 指標に遭遇し、対処法がわからない場合は、ぜひ下のコメント欄で質問してください!

Share: