「Noisy Neighbor」を防ぐ:Proxmox & KVMでディスクI/O制限を効果的に設定する方法

Virtualization tutorial - IT technology blog
Virtualization tutorial - IT technology blog

30秒で解決:Proxmox GUIからディスクI/Oを制限する

バックアップを実行中のVMが原因で、システム全体が「フリーズ」したことはありませんか?Proxmoxでは、追加のツールをインストールすることなく、Web UIから直接この問題を処理できます(大量のVMを管理する場合は、PythonでProxmox VEを自動化して一括設定するのも有効です)。

  1. Proxmox’のWeb UIにアクセスし、対象のVMを選択します。
  2. Hardwareタブに移動し、対象のディスク(Hard Disk)を選択してEditをクリックします。
  3. 下部にあるAdvancedボタンをクリックして、詳細オプションを展開します。
  4. Read limit (MB/s)Write limit (MB/s) に数値を入力します。
  5. OKをクリックして適用します。

変更は即座に反映されます。VMを再起動する必要はありません。突然のI/Oボトルネックが発生したサーバーを「救急処置」する際や、LXCテンプレートから展開した環境の調整にも非常に便利です。

Noisy Neighbor現象:隣人が「うるさすぎる」場合

以前、1台のSATA SSD上で約12台のVMを動かしてホームラボを運用していた際(コンシューマーSSDを守るProxmox VE最適化ガイドも参照)、典型的なNoisy Neighbor問題に遭遇しました。1つのVMでデータクロールスクリプトを継続的に実行したところ、ディスク帯域を使い果たしてしまったのです。

その結果、データベースやWebサーバーを実行している他のVMに深刻な遅延が発生しました。CPUやRAMには余裕があるにもかかわらず、システムのレスポンスが極端に悪化したのです。Disk I/O Throttling(ディスクI/Oスロットリング)は、データの流れを調整し、すべてのサービスの公平性を確保する「交通整理」のような役割を果たします。また、パフォーマンス維持のためにTRIM/UNMAPを設定してディスク容量を管理することも併せて検討してください。

IOPSと帯域幅(Bandwidth)の違い:どちらを制限すべきか?

設定を行う際、リソースを適切に制限するためにこれら2つのパラメータを理解しておく必要があります:

  • Bandwidth (MB/s): 転送されるデータの総量です。大容量ファイルのコピー、ストリーミング、または定期的なバックアップなどのタスクに対してこの項目を制限します。
  • IOPS: 1秒あたりの読み取り/書き込み操作の回数です。これはデータベース(MySQL、PostgreSQL)や、1秒間に数千件の小さなトランザクションを処理するアプリケーションにとって極めて重要な指標です。

私の経験では、従来のHDDの場合はIOPSを厳しく制限し(通常100〜150未満)、NVMe SSDの場合はもう少し緩和しても良いですが、1つのVMがコントローラーのキュー(Queue)を使い果たさないように制限をかけ、仮想マシンのパフォーマンスを最適化すべきです。

コマンドラインによる高度な設定 (KVM/Libvirt)

もしvirshを使用して純粋なKVM環境を管理しているなら、blkdeviotuneツールが強力な味方になります。このコマンドを使用すると、GUIよりもはるかに詳細な制御が可能です。

現在の設定を確認するには、以下を実行します:

virsh blkdeviotune <vm名> <ディスクデバイス>

例えば、VM「ubuntu-srv」(ディスク vda)を1000 IOPSおよび50MB/sの帯域幅に制限したい場合は、次のコマンドを使用します:

virsh blkdeviotune ubuntu-srv vda --total-iops-sec 1000 --total-bytes-sec 52428800 --live

注意:52428800バイトはちょうど50MBに相当します。--liveパラメータを指定することで、仮想マシンを停止することなく即座に設定を反映できます。

バースト(Burst)メカニズム:賢い一時的な高速化

帯域幅を厳しく制限しすぎると、VMの起動が非常に遅くなることがあります。幸いなことに、KVMはBurst機能をサポートしています。これにより、VMは最初の数秒間だけ高速で動作し、その後安全な制限値まで速度を落とすことができます。

Webサーバーに最適な設定例:

  • Limit: 30 MB/s (安定して維持される速度)。
  • Burst: 150 MB/s (重いファイルの読み込みやOS起動時に一時的な速度向上を許可)。

この設定により、ユーザーエクスペリエンスを滑らかに保ちつつ、システム全体を長時間の高I/O負荷から保護できます。

システム最適化のための実戦経験

ディスク待機(iowait)指数の急上昇に何度も悩まされた結果、4つの黄金律を導き出しました:

  1. バックアップVMを「拘束」する: rsyncやバックアップを実行するVMは、常にディスク性能の30%程度に制限してください。1つのバックアップ処理が本番システム全体をダウンさせないようにしましょう。
  2. VirtIOを優先する: 常にVirtIO BlockまたはVirtIO SCSIを使用してください。これらは最高のパフォーマンスを発揮し、現在最も正確なスロットリングをサポートしているドライバーです。
  3. iostatで監視する: ホストマシンにsysstatをインストールしましょう。iostat -x 1コマンドを実行し、%util列を確認します。この数値が継続的に100%に達している場合は、すぐにI/O制限を強化する必要があります。
  4. コンテナ(LXC)を無視しない: LXCはホストとカーネルを共有していますが、ProxmoxではResourcesセクションでI/O制限を設定できます。動作はVMと全く同じです。

ディスクI/Oスロットリングの目的は、パフォーマンスを抑制することではなく、QoS(Quality of Service)を賢く実装することです。システムの管理をマスターできることを願っています!

Share: