14.5. 仮想マシンの I/O パフォーマンスの最適化
仮想マシンの入出力 (I/O) 機能は、仮想マシンの全体的な効率を大幅に制限する可能性があります。これに対処するために、ブロック I/O パラメーターを設定して、仮想マシンの I/O を最適化できます。
14.5.1. 仮想マシンにおけるブロック I/O のチューニング リンクのコピーリンクがクリップボードにコピーされました!
複数のブロックデバイスが、複数の仮想マシンで使用されている場合は、I/O ウェイト を変更して特定の仮想デバイスの I/O の優先度を調整することが重要になる場合があります。
デバイスの I/O ウェイトを上げると、I/O 帯域幅の優先度が高まるため、より多くのホストリソースが提供されます。同様に、デバイスのウェイトを下げると、ホストのリソースが少なくなります。
各デバイスの ウェイト の値は 100 から 1000 の範囲内でなければなりません。もしくは、値を 0 にすると、各デバイスのリストからそのデバイスを削除できます。
手順
仮想マシンのブロック I/O パラメーターを表示および設定するには、以下を行います。
仮想マシンの現在の
<blkio>パラメーターを表示します。# virsh dumpxml VM-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 指定したデバイスの I/O ウェイトを編集します。
virsh blkiotune VM-name --device-weights device, I/O-weight
# virsh blkiotune VM-name --device-weights device, I/O-weightCopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、次の例では、testguest1 仮想マシンの /dev/sda デバイスの重みを 500 に変更します。
virsh blkiotune testguest1 --device-weights /dev/sda, 500
# virsh blkiotune testguest1 --device-weights /dev/sda, 500Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
仮想マシンのブロック I/O パラメーターが正しく設定されていることを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要一部のカーネルは、特定のデバイスの I/O 重み設定をサポートしていません。前の手順で期待どおりに重みが表示されない場合は、この機能がホストカーネルと互換性がない可能性があります。
14.5.2. 仮想マシンのディスク I/O スロットリング リンクのコピーリンクがクリップボードにコピーされました!
複数の仮想マシンが同時に実行する場合は、過剰なディスク I/O により、システムパフォーマンスに影響が及ぶ可能性があります。KVM 仮想化のディスク I/O スロットリングでは、仮想マシンからホストマシンに送られるディスク I/O 要求に制限を設定する機能を利用できます。これにより、仮想マシンが共有リソースを過剰に使用し、その他の仮想マシンのパフォーマンスに影響を及ぼすことを防ぐことができます。
ディスク I/O スロットリングを有効にするには、仮想マシンに割り当てられた各ブロックデバイスからホストマシンに送られるディスク I/O 要求に制限を設定します。
手順
virsh domblklistコマンドを使用して、指定された仮想マシン上のすべてのディスクデバイスの名前をリスト表示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow スロットルする仮想ディスクがマウントされているホストブロックデバイスを見つけます。
たとえば、前の手順の
sdb仮想ディスクをスロットリングする場合は、以下の出力では、ディスクが/dev/nvme0n1p3パーティションにマウントされていることを示しています。Copy to Clipboard Copied! Toggle word wrap Toggle overflow virsh blkiotuneコマンドを使用して、ブロックデバイスの I/O 制限を設定します。virsh blkiotune VM-name --parameter device,limit
# virsh blkiotune VM-name --parameter device,limitCopy to Clipboard Copied! Toggle word wrap Toggle overflow 以下の例は、
rollin-coal仮想マシン上のsdbディスクを毎秒 1000 の読み書き操作にスロットリングし、毎秒 50 MB の読み書きスループットにスロットリングします。virsh blkiotune rollin-coal --device-read-iops-sec /dev/nvme0n1p3,1000 --device-write-iops-sec /dev/nvme0n1p3,1000 --device-write-bytes-sec /dev/nvme0n1p3,52428800 --device-read-bytes-sec /dev/nvme0n1p3,52428800
# virsh blkiotune rollin-coal --device-read-iops-sec /dev/nvme0n1p3,1000 --device-write-iops-sec /dev/nvme0n1p3,1000 --device-write-bytes-sec /dev/nvme0n1p3,52428800 --device-read-bytes-sec /dev/nvme0n1p3,52428800Copy to Clipboard Copied! Toggle word wrap Toggle overflow
関連情報
- ディスク I/O スロットリングは、異なる顧客に属する仮想マシンが同じホストで実行されている場合や、異なる仮想マシンに QoS 保証が提供されている場合など、さまざまな状況で役立ちます。ディスク I/O スロットリングは、低速なディスクをシミュレートするために使用することもできます。
- I/O スロットリングは、仮想マシンに割り当てられた各ブロックデバイスに個別に適用でき、スループットおよび I/O 操作の制限に対応します。
-
Red Hat は、
virsh blkdeviotuneコマンドを使用した仮想マシンでの I/O スロットリングの設定はサポートしていません。RHEL 8 を仮想マシンホストとして使用する場合にサポートされていない機能の詳細は、RHEL 8 仮想化でサポートされていない機能 を参照してください。
14.5.3. ストレージデバイスでの multi-queue の有効化 リンクのコピーリンクがクリップボードにコピーされました!
仮想マシン (VM) で virtio-blk または virtio-scsi ストレージデバイスを使用する場合、multi-queue 機能によりストレージパフォーマンスとスケーラビリティーが向上します。このため、各仮想 CPU (vCPU) に別のキューを持たせることが可能になります。また仮想 CPU は、その他の vCPU に影響を及ぼすことなく使用するために、割り込みできるようになります。
multi-queue 機能は Q35 マシンタイプではデフォルトで有効になっていますが、i440FX マシンタイプでは手動で有効にする必要があります。キューの数をワークロードに最適になるように調整できます。ただし、最適な数はワークロードの種類ごとに異なるため、どのキュー数が最適かをテストする必要があります。
手順
ストレージデバイスで
multi-queueを有効にするために、仮想マシンの XML 設定を編集します。virsh edit <example_vm>
# virsh edit <example_vm>Copy to Clipboard Copied! Toggle word wrap Toggle overflow XML 設定で、目的のストレージデバイスを見つけて、複数の I/O キューを使用するように
queuesパラメーターを変更します。N を仮想マシン内の仮想 CPU の数 (最大 16 個) に置き換えます。virtio-blkの例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow virtio-scsiの例:<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
- 仮想マシンを再起動して変更を有効にします。
14.5.4. 専用の IOThreads の設定 リンクのコピーリンクがクリップボードにコピーされました!
仮想マシン (VM) 上のディスクの入出力 (IO) パフォーマンスを向上させるために、仮想マシンのディスクの IO 操作を管理するために使用される専用の IOThread を設定できます。
通常、ディスクの IO 操作はメインの QEMU スレッドの一部です。そのため、集中的な IO ワークロードの実行時に、仮想マシン全体の応答性が低下する可能性があります。IO 操作を専用の IOThread に分離することで、仮想マシンの応答性とパフォーマンスを大幅に向上させることができます。
手順
- 選択した仮想マシンが実行中の場合はシャットダウンします。
ホストで、仮想マシンの XML 設定に
<iothreads>タグを追加または編集します。たとえば、testguest1仮想マシンに 1 つのIOThreadを作成するには、次のようにします。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記最適な結果を得るには、ホスト上の CPU ごとに 1 - 2 個の
IOThreadのみを使用してください。仮想マシンディスクに専用の
IOThreadを割り当てます。たとえば、ID が1のIOThreadをtestguest1仮想マシン上のディスクに割り当てるには、次のように指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注記IOThreadの ID は 1 から始まります。ディスクごとに 1 つのIOThreadのみを割り当てる必要があります。通常、最適なパフォーマンスを得るには、仮想マシンごとに 1 つの専用
IOThreadで十分です。virtio-scsiストレージデバイスを使用する場合は、virtio-scsiコントローラーに専用のIOThreadを割り当てます。たとえば、ID が1のIOThreadをtestguest1仮想マシン上のコントローラーに割り当てるには、次のように指定します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
- 仮想マシンのパフォーマンスに対する変更の効果を評価します。詳細は、仮想マシンのパフォーマンス監視ツール を参照してください。
14.5.5. 仮想ディスクキャッシュの設定 リンクのコピーリンクがクリップボードにコピーされました!
KVM にはいくつかの仮想ディスクキャッシュモードがあります。集中的な入出力 (IO) ワークロードがある場合は、最適なキャッシュモードを選択すると、仮想マシン (VM) のパフォーマンスが大幅に向上します。
+
仮想ディスクキャッシュモードの概要
writethrough- ホストのページキャッシュが読み取り専用として使用されます。データがストレージデバイスにコミットされた場合にのみ、書き込みが完了したと報告されます。このモードでは、持続的な IO パフォーマンスは低下しますが、書き込みが十分に保証されます。
writeback-
ホストのページキャッシュが読み取りと書き込みの両方に使用されます。データが物理ストレージではなくホストのメモリーキャッシュに到達したときに、書き込みが完了したと報告されます。このモードは
writethroughよりも IO パフォーマンスが高速ですが、ホスト障害時にデータが失われる可能性があります。 none- ホストのページキャッシュが完全に回避されます。このモードは物理ディスクの書き込みキューに直接依存します。そのため、予測可能な持続的な IO パフォーマンスが得られ、安定したゲスト上で書き込みが十分に保証されます。これは、仮想マシンライブマイグレーションのための安全なキャッシュモードでもあります。
手順
- 選択した仮想マシンが実行中の場合はシャットダウンします。
選択した仮想マシンの XML 設定を編集します。
virsh edit <vm_name>
# virsh edit <vm_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow ディスクデバイスを見つけて、
driverタグのcacheオプションを編集します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow