17.5. 仮想マシンの I/O パフォーマンスの最適化
仮想マシンの入出力 (I/O) 機能は、仮想マシンの全体的な効率を大幅に制限する可能性があります。これに対処するために、ブロック I/O パラメーターを設定して、仮想マシンの I/O を最適化できます。
17.5.1. 仮想マシンにおけるブロック I/O のチューニング
複数のブロックデバイスが、複数の仮想マシンで使用されている場合は、I/O ウェイト を変更して特定の仮想デバイスの I/O の優先度を調整することが重要になる場合があります。
デバイスの I/O ウェイトを上げると、I/O 帯域幅の優先度が高まるため、より多くのホストリソースが提供されます。同様に、デバイスのウェイトを下げると、ホストのリソースが少なくなります。
各デバイスの ウェイト
の値は 100
から 1000
の範囲内でなければなりません。もしくは、値を 0
にすると、各デバイスのリストからそのデバイスを削除できます。
手順
仮想マシンのブロック I/O パラメーターを表示および設定するには、以下を行います。
仮想マシンの現在の
<blkio>
パラメーターを表示します。# virsh dumpxml VM-name
<domain> [...] <blkiotune> <weight>800</weight> <device> <path>/dev/sda</path> <weight>1000</weight> </device> <device> <path>/dev/sdb</path> <weight>500</weight> </device> </blkiotune> [...] </domain>
指定したデバイスの I/O ウェイトを編集します。
# virsh blkiotune VM-name --device-weights device, I/O-weight
たとえば、次の例では、testguest1 仮想マシンの /dev/sda デバイスの重みを 500 に変更します。
# virsh blkiotune testguest1 --device-weights /dev/sda, 500
検証
仮想マシンのブロック I/O パラメーターが正しく設定されていることを確認します。
# virsh blkiotune testguest1 Block I/O tuning parameters for domain testguest1: weight : 800 device_weight : [ {"sda": 500}, ] ...
重要一部のカーネルは、特定のデバイスの I/O 重み設定をサポートしていません。前の手順で期待どおりに重みが表示されない場合は、この機能がホストカーネルと互換性がない可能性があります。
17.5.2. 仮想マシンのディスク I/O スロットリング
複数の仮想マシンが同時に実行する場合は、過剰なディスク I/O により、システムパフォーマンスに影響が及ぶ可能性があります。KVM 仮想化のディスク I/O スロットリングでは、仮想マシンからホストマシンに送られるディスク I/O 要求に制限を設定する機能を利用できます。これにより、仮想マシンが共有リソースを過剰に使用し、その他の仮想マシンのパフォーマンスに影響を及ぼすことを防ぐことができます。
ディスク I/O スロットリングを有効にするには、仮想マシンに割り当てられた各ブロックデバイスからホストマシンに送られるディスク I/O 要求に制限を設定します。
手順
virsh domblklist
コマンドを使用して、指定された仮想マシン上のすべてのディスクデバイスの名前をリスト表示します。# virsh domblklist rollin-coal Target Source ------------------------------------------------ vda /var/lib/libvirt/images/rollin-coal.qcow2 sda - sdb /home/horridly-demanding-processes.iso
スロットルする仮想ディスクがマウントされているホストブロックデバイスを見つけます。
たとえば、前の手順の
sdb
仮想ディスクをスロットリングする場合は、以下の出力では、ディスクが/dev/nvme0n1p3
パーティションにマウントされていることを示しています。$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT zram0 252:0 0 4G 0 disk [SWAP] nvme0n1 259:0 0 238.5G 0 disk ├─nvme0n1p1 259:1 0 600M 0 part /boot/efi ├─nvme0n1p2 259:2 0 1G 0 part /boot └─nvme0n1p3 259:3 0 236.9G 0 part └─luks-a1123911-6f37-463c-b4eb-fxzy1ac12fea 253:0 0 236.9G 0 crypt /home
virsh blkiotune
コマンドを使用して、ブロックデバイスの I/O 制限を設定します。# virsh blkiotune VM-name --parameter device,limit
以下の例は、
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
関連情報
- ディスク I/O スロットリングは、異なる顧客に属する仮想マシンが同じホストで実行されている場合や、異なる仮想マシンに QoS 保証が提供されている場合など、さまざまな状況で役立ちます。ディスク I/O スロットリングは、低速なディスクをシミュレートするために使用することもできます。
- I/O スロットリングは、仮想マシンに割り当てられた各ブロックデバイスに個別に適用でき、スループットおよび I/O 操作の制限に対応します。
-
Red Hat は、
virsh blkdeviotune
コマンドを使用した仮想マシンでの I/O スロットリングの設定はサポートしていません。RHEL 8 を仮想マシンホストとして使用する場合にサポートされていない機能の詳細は、RHEL 8 仮想化でサポートされていない機能 を参照してください。
17.5.3. ストレージデバイスでマルチキューを有効にする
仮想マシン (VM) で virtio-blk
または virtio-scsi
ストレージデバイスを使用する場合、マルチキュー 機能によりストレージパフォーマンスとスケーラビリティーが向上します。このため、各仮想 CPU (vCPU) に別のキューを持たせることが可能になります。また仮想 CPU は、その他の vCPU に影響を及ぼすことなく使用するために、割り込みできるようになります。
マルチキュー 機能は Q35
マシンタイプではデフォルトで有効になっていますが、i440FX
マシンタイプでは手動で有効にする必要があります。キューの数をワークロードに最適になるように調整できますが、最適な数はワークロードの種類ごとに異なるため、どの数のキューが最適かをテストする必要があります。
手順
ストレージデバイスで
マルチキュー
を有効にするには、仮想マシンの XML 設定を編集します。# virsh edit <example_vm>
XML 設定で、目的のストレージデバイスを見つけて、複数の I/O キューを使用するように
キュー
パラメーターを変更します。N を 仮想マシン内の仮想 CPU の数 (最大 16 個) に置き換えます。virtio-blk の
例:<disk type='block' device='disk'> <driver name='qemu' type='raw' queues='N'/> <source dev='/dev/sda'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </disk>
virtio-scsi の
例:<controller type='scsi' index='0' model='virtio-scsi'> <driver queues='N' /> </controller>
- 変更を有効にするには、仮想マシンを再起動します。
17.5.4. 専用 IOThreads の設定
仮想マシン (VM) 上のディスクの入出力 (IO) パフォーマンスを向上させるには、仮想マシンのディスクの IO 操作を管理するために使用される専用の IOThread
を設定できます。
通常、ディスクの IO 操作はメインの QEMU スレッドの一部であるため、集中的な IO ワークロード中に仮想マシン全体の応答性が低下する可能性があります。IO 操作を専用の IOThread
に分離することで、仮想マシンの応答性とパフォーマンスを大幅に向上させることができます。
手順
- 選択した仮想マシンが実行中の場合はシャットダウンします。
ホストで、仮想マシンの XML 設定に
<iothreads>
タグを追加または編集します。たとえば、testguest1
仮想マシンに単一のIOThread を
作成するには、次のようにします。# virsh edit <testguest1> <domain type='kvm'> <name>testguest1</name> ... <vcpu placement='static'>8</vcpu> <iothreads>1</iothreads> ... </domain>
注記最適な結果を得るには、ホスト上の CPU ごとに 1 - 2 個の
IOThread
のみを使用します。仮想マシンディスクに専用の
IOThread
を割り当てます。たとえば、ID1
のIOThread を
testguest1
仮想マシン上のディスクに割り当てるには、次のようにします。# virsh edit <testguest1> <domain type='kvm'> <name>testguest1</name> ... <devices> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' io='native' iothread='1'/> <source file='/var/lib/libvirt/images/test-disk.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </disk> ... </devices> ... </domain>
注記IOThread
ID は 1 から始まり、ディスクごとに 1 つのIOThread
のみを割り当てる必要があります。通常、最適なパフォーマンスを得るには、仮想マシンごとに 1 つの専用
IOThread
で十分です。virtio-scsi
ストレージデバイスを使用する場合は、virtio-scsi
コントローラーに専用のIOThread を
割り当てます。たとえば、ID1
のIOThread を
testguest1
仮想マシン上のコントローラーに割り当てるには、次のようにします。# virsh edit <testguest1> <domain type='kvm'> <name>testguest1</name> ... <devices> <controller type='scsi' index='0' model='virtio-scsi'> <driver iothread='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x0b' function='0x0'/> </controller> ... </devices> ... </domain>
検証
- 変更が仮想マシンパフォーマンスに与える影響を評価します。詳細は、仮想マシンのパフォーマンス監視ツールを 参照してください。
17.5.5. 仮想ディスクキャッシュの設定
KVM はいくつかの仮想ディスクキャッシュモードを提供します。集中的な入出力 (IO) ワークロードの場合、最適なキャッシュモードを選択すると、仮想マシン (VM) のパフォーマンスが大幅に向上します。
仮想ディスクキャッシュモードの概要
ライトスルー
- ホストページキャッシュは読み取り専用に使用されます。書き込みは、データがストレージデバイスにコミットされた場合にのみ完了として報告されます。持続的な IO パフォーマンスは低下しますが、このモードでは書き込みが確実に保証されます。
writeback
-
ホストページキャッシュは読み取りと書き込みの両方に使用されます。データが物理ストレージではなくホストのメモリーキャッシュに到達したときに、書き込みが完了したと報告されます。このモードでは
ライトスルー
よりも IO パフォーマンスが高速ですが、ホスト障害時にデータが失われる可能性があります。 none
- ホストページキャッシュは完全にバイパスされます。このモードは物理ディスクの書き込みキューに直接依存するため、予測可能な持続的な IO パフォーマンスが得られ、安定したゲスト上で良好な書き込み保証が提供されます。これは、仮想マシンライブマイグレーションのための安全なキャッシュモードでもあります。
手順
- 選択した仮想マシンが実行中の場合はシャットダウンします。
選択した仮想マシンの XML 設定を編集します。
# virsh edit <vm_name>
ディスクデバイスを見つけて、
ドライバー
タグのキャッシュ
オプションを編集します。<domain type='kvm'> <name>testguest1</name> ... <devices> <disk type='file' device='disk'> <driver name='qemu' type='raw' cache='none' io='native' iothread='1'/> <source file='/var/lib/libvirt/images/test-disk.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/> </disk> ... </devices> ... </domain>