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 パラメーターを表示および設定するには、以下を行います。

  1. 仮想マシンの現在の <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>
    Copy to Clipboard Toggle word wrap
  2. 指定したデバイスの I/O ウェイトを編集します。

    # virsh blkiotune VM-name --device-weights device, I/O-weight
    Copy to Clipboard Toggle word wrap

    たとえば、次の例では、testguest1 仮想マシンの /dev/sda デバイスの重みを 500 に変更します。

    # virsh blkiotune testguest1 --device-weights /dev/sda, 500
    Copy to Clipboard Toggle word wrap

検証

  • 仮想マシンのブロック I/O パラメーターが正しく設定されていることを確認します。

    # virsh blkiotune testguest1
    
    Block I/O tuning parameters for domain testguest1:
    
        weight                        : 800
        device_weight                  : [
                                          {"sda": 500},
                                         ]
    ...
    Copy to Clipboard Toggle word wrap
    重要

    一部のカーネルは、特定のデバイスの I/O 重み設定をサポートしていません。前の手順で期待どおりに重みが表示されない場合は、この機能がホストカーネルと互換性がない可能性があります。

14.5.2. 仮想マシンのディスク I/O スロットリング

複数の仮想マシンが同時に実行する場合は、過剰なディスク I/O により、システムパフォーマンスに影響が及ぶ可能性があります。KVM 仮想化のディスク I/O スロットリングでは、仮想マシンからホストマシンに送られるディスク I/O 要求に制限を設定する機能を利用できます。これにより、仮想マシンが共有リソースを過剰に使用し、その他の仮想マシンのパフォーマンスに影響を及ぼすことを防ぐことができます。

ディスク I/O スロットリングを有効にするには、仮想マシンに割り当てられた各ブロックデバイスからホストマシンに送られるディスク I/O 要求に制限を設定します。

手順

  1. virsh domblklist コマンドを使用して、指定された仮想マシン上のすべてのディスクデバイスの名前をリスト表示します。

    # virsh domblklist rollin-coal
    Target     Source
    ------------------------------------------------
    vda        /var/lib/libvirt/images/rollin-coal.qcow2
    sda        -
    sdb        /home/horridly-demanding-processes.iso
    Copy to Clipboard Toggle word wrap
  2. スロットルする仮想ディスクがマウントされているホストブロックデバイスを見つけます。

    たとえば、前の手順の 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
    Copy to Clipboard Toggle word wrap
  3. virsh blkiotune コマンドを使用して、ブロックデバイスの I/O 制限を設定します。

    # virsh blkiotune VM-name --parameter device,limit
    Copy to Clipboard Toggle word wrap

    以下の例は、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
    Copy to Clipboard Toggle word wrap

関連情報

  • ディスク 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 マシンタイプでは手動で有効にする必要があります。キューの数をワークロードに最適になるように調整できます。ただし、最適な数はワークロードの種類ごとに異なるため、どのキュー数が最適かをテストする必要があります。

手順

  1. ストレージデバイスで multi-queue を有効にするために、仮想マシンの XML 設定を編集します。

    # virsh edit <example_vm>
    Copy to Clipboard Toggle word wrap
  2. XML 設定で、目的のストレージデバイスを見つけて、複数の I/O キューを使用するように queues パラメーターを変更します。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>
      Copy to Clipboard Toggle word wrap
    • virtio-scsi の例:

      <controller type='scsi' index='0' model='virtio-scsi'>
         <driver queues='N' />
      </controller>
      Copy to Clipboard Toggle word wrap
  3. 仮想マシンを再起動して変更を有効にします。

14.5.4. 専用の IOThreads の設定

仮想マシン (VM) 上のディスクの入出力 (IO) パフォーマンスを向上させるために、仮想マシンのディスクの IO 操作を管理するために使用される専用の IOThread を設定できます。

通常、ディスクの IO 操作はメインの QEMU スレッドの一部です。そのため、集中的な IO ワークロードの実行時に、仮想マシン全体の応答性が低下する可能性があります。IO 操作を専用の IOThread に分離することで、仮想マシンの応答性とパフォーマンスを大幅に向上させることができます。

手順

  1. 選択した仮想マシンが実行中の場合はシャットダウンします。
  2. ホストで、仮想マシンの XML 設定に <iothreads> タグを追加または編集します。たとえば、testguest1 仮想マシンに 1 つの IOThread を作成するには、次のようにします。

    # virsh edit <testguest1>
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <vcpu placement='static'>8</vcpu>
      <iothreads>1</iothreads>
      ...
    </domain>
    Copy to Clipboard Toggle word wrap
    注記

    最適な結果を得るには、ホスト上の CPU ごとに 1 - 2 個の IOThread のみを使用してください。

  3. 仮想マシンディスクに専用の IOThread を割り当てます。たとえば、ID が 1IOThreadtestguest1 仮想マシン上のディスクに割り当てるには、次のように指定します。

    # 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>
    Copy to Clipboard Toggle word wrap
    注記

    IOThread の ID は 1 から始まります。ディスクごとに 1 つの IOThread のみを割り当てる必要があります。

    通常、最適なパフォーマンスを得るには、仮想マシンごとに 1 つの専用 IOThread で十分です。

  4. virtio-scsi ストレージデバイスを使用する場合は、virtio-scsi コントローラーに専用の IOThread を割り当てます。たとえば、ID が 1IOThreadtestguest1 仮想マシン上のコントローラーに割り当てるには、次のように指定します。

    # 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>
    Copy to Clipboard Toggle word wrap

検証

14.5.5. 仮想ディスクキャッシュの設定

KVM にはいくつかの仮想ディスクキャッシュモードがあります。集中的な入出力 (IO) ワークロードがある場合は、最適なキャッシュモードを選択すると、仮想マシン (VM) のパフォーマンスが大幅に向上します。

+

仮想ディスクキャッシュモードの概要

writethrough
ホストのページキャッシュが読み取り専用として使用されます。データがストレージデバイスにコミットされた場合にのみ、書き込みが完了したと報告されます。このモードでは、持続的な IO パフォーマンスは低下しますが、書き込みが十分に保証されます。
writeback
ホストのページキャッシュが読み取りと書き込みの両方に使用されます。データが物理ストレージではなくホストのメモリーキャッシュに到達したときに、書き込みが完了したと報告されます。このモードは writethrough よりも IO パフォーマンスが高速ですが、ホスト障害時にデータが失われる可能性があります。
none
ホストのページキャッシュが完全に回避されます。このモードは物理ディスクの書き込みキューに直接依存します。そのため、予測可能な持続的な IO パフォーマンスが得られ、安定したゲスト上で書き込みが十分に保証されます。これは、仮想マシンライブマイグレーションのための安全なキャッシュモードでもあります。

手順

  1. 選択した仮想マシンが実行中の場合はシャットダウンします。
  2. 選択した仮想マシンの XML 設定を編集します。

    # virsh edit <vm_name>
    Copy to Clipboard Toggle word wrap
  3. ディスクデバイスを見つけて、driver タグの cache オプションを編集します。

    <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>
    Copy to Clipboard Toggle word wrap
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る