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

  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>
  2. 指定したデバイスの 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 要求に制限を設定します。

手順

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

    # virsh domblklist rollin-coal
    Target     Source
    ------------------------------------------------
    vda        /var/lib/libvirt/images/rollin-coal.qcow2
    sda        -
    sdb        /home/horridly-demanding-processes.iso
  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
  3. 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 マシンタイプでは手動で有効にする必要があります。キューの数をワークロードに最適になるように調整できますが、最適な数はワークロードの種類ごとに異なるため、どの数のキューが最適かをテストする必要があります。

手順

  1. ストレージデバイスで マルチキュー を有効にするには、仮想マシンの XML 設定を編集します。

    # virsh edit <example_vm>
  2. 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>
  3. 変更を有効にするには、仮想マシンを再起動します。

17.5.4. 専用 IOThreads の設定

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

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

手順

  1. 選択した仮想マシンが実行中の場合はシャットダウンします。
  2. ホストで、仮想マシンの 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 のみを使用します。

  3. 仮想マシンディスクに専用の IOThread を割り当てます。たとえば、ID 1IOThread を 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 で十分です。

  4. virtio-scsi ストレージデバイスを使用する場合は、virtio-scsi コントローラーに専用の IOThread を 割り当てます。たとえば、ID 1IOThread を 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 パフォーマンスが得られ、安定したゲスト上で良好な書き込み保証が提供されます。これは、仮想マシンライブマイグレーションのための安全なキャッシュモードでもあります。

手順

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

    # virsh edit <vm_name>
  3. ディスクデバイスを見つけて、ドライバー タグの キャッシュ オプションを編集します。

    <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>
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

© 2024 Red Hat, Inc.