18.7. 仮想マシンの CPU パフォーマンスの最適化


vCPU は、ホストマシンの物理 CPU と同様、仮想マシンのパフォーマンスにおいて極めて重要です。したがって、vCPU を最適化すると、仮想マシンのリソース効率に大きな影響を及ぼす可能性があります。vCPU を最適化するには、以下を実行します。

  1. 仮想マシンに割り当てられているホスト CPU の数を調整します。これは、CLI または Web コンソール を使用して実行できます。
  2. vCPU モデルが、ホストの CPU モデルに調整されていることを確認します。たとえば、仮想マシン testguest1 を、ホストの CPU モデルを使用するように設定するには、次のコマンドを実行します。

    # virt-xml testguest1 --edit --cpu host-model
    Copy to Clipboard Toggle word wrap

    ARM 64 システムでは、--cpu host-passthrough を使用します。

  3. Kernel Same-Page Merging (KSM) を管理します
  4. ホストマシンが Non-Uniform Memory Access (NUMA) を使用する場合は、その仮想マシンに対して NUMA を設定 することもできます。これにより、ホストの CPU およびメモリープロセスが、仮想マシンの CPU およびメモリープロセスにできるだけ近くにマッピングされます。事実上、NUMA チューニングにより、仮想マシンに割り当てられたシステムメモリーへのより効率的なアクセスが可能になります。これにより、vCPU 処理の効果が改善されます。

    詳細は Configuring NUMA in a virtual machine and Virtual machine performance optimization for specific workloads を参照してください。

18.7.1. vCPU のオーバーコミットメント

vCPU のオーバーコミットを使用すると、ホスト上で実行されている仮想マシン(VM)のすべての vCPU の合計が、ホスト上の物理 CPU の数を超えるセットアップを作成できます。ただし、仮想マシンで物理的に使用可能なコアよりも多くのコアを同時に実行すると、パフォーマンスの低下が発生する可能性があります。

最適なパフォーマンスを得るには、各仮想マシンで目的のワークロードを実行するために必要な数の vCPU しかない仮想マシンを割り当てます。

vCPU のオーバーコミットの推奨事項:

  • 最適なパフォーマンスを得るには、仮想マシンのワークロードに必要な最小限の vCPU を割り当てます。
  • 広範なテストを行わずに、本番環境で vCPU をオーバーコミットしないでください。
  • vCPU を上書きする場合、安全な比率は、100% 未満の負荷のために 5 つの vCPU から 1 つの物理 CPU です。
  • 物理プロセッサーコアごとに、割り当てた仮想 CPU の合計が 10 を超えることは推奨されません。
  • CPU 使用率を監視して、負荷が大きい場合のパフォーマンスの低下を防ぎます。
重要

オーバーコミットされた環境では、メモリーを 100% 使用するアプリケーションや処理リソースが不安定になる可能性があります。CPU のオーバーコミット率はワークロードに依存するため、詳細なテストを行わずに実稼働環境でメモリーまたは CPU をオーバーコミットしないでください。

18.7.2. コマンドラインを使用した仮想 CPU の追加と削除

仮想マシンの CPU パフォーマンスを増減するには、仮想マシンに割り当てられた仮想 CPU (vCPU) を追加または削除します。

実行中の仮想マシンで実行する場合、これは vCPU ホットプラグおよびホットアンプラグとも呼ばれます。ただし、RHEL 9 では vCPU のホットアンプラグに対応しておらず、Red Hat ではその使用を強く推奨していません。

前提条件

  • オプション: ターゲット仮想マシン内の vCPU の現在の状態を表示します。たとえば、仮想マシン testguest 上の vCPU の数を表示するには、以下を実行します。

    # virsh vcpucount testguest
    maximum      config         4
    maximum      live           2
    current      config         2
    current      live           1
    Copy to Clipboard Toggle word wrap

    この出力は、testguest が現在 1 vCPU を使用していることを示し、1 つ以上の vCPU をホットプラグして仮想マシンのパフォーマンスを向上できることを示しています。ただし、再起動後に使用される vCPU の testguest 数は 2 に変更され、2 以上の vCPU のホットプラグが可能になります。

手順

  1. 仮想マシンに割り当てることができる vCPU の最大数を調整します。これは、仮想マシンの次回起動時に有効になります。

    たとえば、仮想マシン testguest の vCPU の最大数を 8 に増やすには、次のコマンドを実行します。

    # virsh setvcpus testguest 8 --maximum --config
    Copy to Clipboard Toggle word wrap

    最大値は、CPU トポロジー、ホストハードウェア、ハイパーバイザー、およびその他の要素によって制限される可能性があることに注意してください。

  2. 仮想マシンに割り当てられている現在の vCPU の数を、前の手順で設定した最大値まで調整します。以下に例を示します。

    • 実行中の仮想マシン testguest にアタッチされている vCPU を 4 に増やすには、以下を実行します。

      # virsh setvcpus testguest 4 --live
      Copy to Clipboard Toggle word wrap

      これにより、仮想マシンの次回の起動まで、仮想マシンのパフォーマンスおよび testguest のホスト負荷のフットプリントが高まります。

    • testguest 仮想マシンにアタッチされている vCPU の数を永続的に 1 に減らすには、次のコマンドを実行します。

      # virsh setvcpus testguest 1 --config
      Copy to Clipboard Toggle word wrap

      これにより、仮想マシンの次回の起動後に、仮想マシンのパフォーマンスおよび testguest のホスト負荷のフットプリントが低下します。ただし、必要に応じて、仮想マシンに追加の vCPU をホットプラグして、一時的にパフォーマンスを向上させることができます。

検証

  • 仮想マシンの vCPU の現在の状態に変更が反映されていることを確認します。

    # virsh vcpucount testguest
    maximum      config         8
    maximum      live           4
    current      config         1
    current      live           4
    Copy to Clipboard Toggle word wrap

18.7.3. Web コンソールを使用した仮想 CPU の管理

RHEL 9 Web コンソールを使用して、Web コンソールが接続している仮想マシンが使用する仮想 CPU を確認し、設定できます。

前提条件

手順

  1. RHEL 9 Web コンソールにログインします。

    詳細は、Web コンソールへのログイン を参照してください。

  2. 仮想マシン インターフェイスで、情報を表示する仮想マシンを選択します。

    新しいページが開き、選択した仮想マシンに関する基本情報を含む Overview セクションと、仮想マシンのグラフィカルインターフェイスにアクセスするための Console セクションが表示されます。

  3. 概要ペインで、vCPU の数の横にある 編集 をクリックします。

    vCPU の詳細ダイアログが表示されます。

  1. 選択した仮想マシンの仮想 CPU を設定します。

    • vCPU 数: 現在使用中の vCPU の数

      注記

      vCPU 数は、vCPU 最大値以下にする必要があります。

    • vCPU 最大値 - 仮想マシンに設定できる仮想 CPU の最大数を入力します。この値が vCPU 数 よりも大きい場合には、vCPU を追加で仮想マシンに割り当てることができます。
    • ソケット - 仮想マシンに公開するソケットの数を選択します。
    • ソケットごとのコア - 仮想マシンに公開する各ソケットのコア数を選択します。
    • コアあたりのスレッド - 仮想マシンに公開する各コアのスレッド数を選択します。

      SocketsCores per socket、および Threads per core オプションは、仮想マシンの CPU トポロジーを調整することに注意してください。これは、vCPU のパフォーマンスにメリットがあり、ゲスト OS の特定のソフトウェアの機能に影響を与える可能性があります。デプロイメントで別の設定が必要ない場合は、デフォルト値のままにします。

  2. Apply をクリックします。

    仮想マシンに仮想 CPU が設定されます。

    注記

    仮想 CPU 設定の変更は、仮想マシンの再起動後にのみ有効になります。

18.7.4. 仮想マシンでの NUMA の設定

以下の方法は、RHEL 9 ホストで、仮想マシンの Non-Uniform Memory Access (NUMA) 設定の設定に使用できます。

使いやすさのため、自動化ユーティリティーとサービスを使用して、仮想マシンの NUMA を設定できます。ただし、手動で NUMA を設定すると、パフォーマンスが大幅に向上する可能性が高くなります。

前提条件

  • ホストが NUMA 対応のマシンである。これを確認するには、virsh nodeinfo コマンドを使用して、NUMA cell(2) の行を確認します。

    # virsh nodeinfo
    CPU model:           x86_64
    CPU(s):              48
    CPU frequency:       1200 MHz
    CPU socket(s):       1
    Core(s) per socket:  12
    Thread(s) per core:  2
    NUMA cell(s):        2
    Memory size:         67012964 KiB
    Copy to Clipboard Toggle word wrap

    行の値が 2 以上であると、そのホストは NUMA に対応しています。

  • オプション: ホストにctlctl パッケージ がインストールされている。

    # dnf install numactl
    Copy to Clipboard Toggle word wrap

手順

自動方式

  • 仮想マシンの NUMA ポリシーを Preferred に設定します。たとえば、仮想マシン testguest5 を設定するには、次のようにします。

    # virt-xml testguest5 --edit --vcpus placement=auto
    # virt-xml testguest5 --edit --numatune mode=preferred
    Copy to Clipboard Toggle word wrap
  • numad サービスを使用して、メモリーリソースで仮想マシンの CPU を自動的に調整します。

    # echo 1 > /proc/sys/kernel/numa_balancing
    Copy to Clipboard Toggle word wrap
  • umad サービスを起動して、メモリーリソースで仮想マシンの CPU を自動的に調整します。

    # systemctl start numad
    Copy to Clipboard Toggle word wrap

手動方式

NUMA 設定を手動で調整するには、特定の仮想マシンに対して特別に割り当てるホスト NUMA ノードを指定します。これにより、仮想マシンの vCPU によるホストメモリーの使用率が向上します。

  1. 必要に 応じ て、numactl コマンドを使用して、ホストの NUMA トポロジーを表示します。

    # numactl --hardware
    
    available: 2 nodes (0-1)
    node 0 size: 18156 MB
    node 0 free: 9053 MB
    node 1 size: 18180 MB
    node 1 free: 6853 MB
    node distances:
    node   0   1
      0:  10  20
      1:  20  10
    Copy to Clipboard Toggle word wrap
  2. 仮想マシンの XML 設定を編集して、特定の NUMA ノードに CPU およびメモリーリソースを割り当てます。たとえば、以下の設定では、NUMA ノード 0 で vCPU 0 -7 を使用し、NUMA ノード 1 で vCPUS 8-15 を使用するように testguest6 を設定します。両方のノードには、16 GiB の仮想マシンメモリーも割り当てられます。

    # virsh edit <testguest6>
    
    <domain type='kvm'>
      <name>testguest6</name>
      ...
      <vcpu placement='static'>16</vcpu>
      ...
      <cpu ...>
        <numa>
          <cell id='0' cpus='0-7' memory='16' unit='GiB'/>
          <cell id='1' cpus='8-15' memory='16' unit='GiB'/>
        </numa>
      ...
    </domain>
    Copy to Clipboard Toggle word wrap
  3. 仮想マシンが実行中の場合は、再起動して設定を適用します。
注記

最適なパフォーマンス結果を得るには、ホスト上の各 NUMA ノードの最大メモリーサイズを考慮することが推奨されます。

18.7.5. 仮想 CPU ピニングの設定

仮想マシンの CPU パフォーマンスを向上させるために、仮想 CPU (vCPU)をホストの特定の物理 CPU スレッドに固定できます。これにより、vCPU に専用の物理 CPU スレッドが含まれるようにするため、vCPU のパフォーマンスが大幅に向上します。

CPU パフォーマンスをさらに最適化するには、指定した仮想マシンに関連付けられている QEMU プロセススレッドを、特定のホスト CPU に固定することもできます。

手順

  1. ホストの CPU トポロジーを確認します。

    # lscpu -p=node,cpu
    
    Node,CPU
    0,0
    0,1
    0,2
    0,3
    0,4
    0,5
    0,6
    0,7
    1,0
    1,1
    1,2
    1,3
    1,4
    1,5
    1,6
    1,7
    Copy to Clipboard Toggle word wrap

    この例では、出力には NUMA ノードと、ホスト上で利用可能な物理 CPU スレッドが含まれます。

  2. 仮想マシン内の vCPU スレッドの数を確認します。

    # lscpu -p=node,cpu
    
    Node,CPU
    0,0
    0,1
    0,2
    0,3
    Copy to Clipboard Toggle word wrap

    この例では、出力には NUMA ノードと利用可能な vCPU スレッドが仮想マシン内に含まれます。

  3. 仮想マシンから、特定ホストの CPU、またはある範囲の CPU に特定の vCPU スレッドをピニングします。これは、vCPU のパフォーマンスを向上させる安全な方法として推奨されます。

    たとえば、次のコマンドでは、仮想マシン testguest6 の vCPU スレッドの 0 から 3 を、ホストの CPU 1、3、5、7 にそれぞれピニングします。

    # virsh vcpupin testguest6 0 1
    # virsh vcpupin testguest6 1 3
    # virsh vcpupin testguest6 2 5
    # virsh vcpupin testguest6 3 7
    Copy to Clipboard Toggle word wrap
  4. オプション:vCPU スレッドが CPU に正常にピニングされているかどうかを確認します。

    # virsh vcpupin testguest6
    VCPU   CPU Affinity
    ----------------------
    0      1
    1      3
    2      5
    3      7
    Copy to Clipboard Toggle word wrap
  5. vCPU スレッドのピニング後に、指定の仮想マシンに関連付けられた QEMU プロセススレッドを、特定ホスト CPU、またはある範囲の CPU に固定することもできます。これは、QEMU プロセスが物理 CPU でより効率的に実行されるのに役立ちます。

    たとえば、以下のコマンドは、testguest6 の QEMU プロセススレッドを CPU 2 および 4 にピニングし、これが成功したことを確認します。

    # virsh emulatorpin testguest6 2,4
    # virsh emulatorpin testguest6
    emulator: CPU Affinity
    ----------------------------------
           *: 2,4
    Copy to Clipboard Toggle word wrap

18.7.6. 仮想 CPU キャッピングの設定

仮想 CPU (vCPU)上限を使用して、仮想マシン(VM)が使用できる CPU リソースの量を制限できます。vCPU 上限により、1 台の VM によるホストの CPU リソースを過剰に使用しなくなり、ハイパーバイザーによる CPU スケジューリングを容易に管理できるため、全体的なパフォーマンスを向上させることができます。

手順

  1. ホストで現在の vCPU スケジューリング設定を表示します。

    # virsh schedinfo <vm_name>
    
    Scheduler      : posix
    cpu_shares     : 0
    vcpu_period : 0
    vcpu_quota : 0
    emulator_period: 0
    emulator_quota : 0
    global_period  : 0
    global_quota   : 0
    iothread_period: 0
    iothread_quota : 0
    Copy to Clipboard Toggle word wrap
  2. 仮想マシンに絶対 vCPU 上限を設定するには、vcpu_period パラメーターおよび vcpu_quota パラメーターを設定します。どちらのパラメーターも、マイクロ秒単位で期間を表す数値を使用します。

    1. virsh schedinfo コマンドを使用して、vcpu_period パラメーターを設定します。以下に例を示します。

      # virsh schedinfo <vm_name> --set vcpu_period=100000
      Copy to Clipboard Toggle word wrap

      この例では、vcpu_period は 100,000 マイクロ秒に設定されています。これは、スケジューラーがこの時間間隔に vCPU 上限を強制することを意味します。

      また、the-- live --config オプションを使用して、再起動せずに実行中の仮想マシンを設定することもできます。

    2. virsh schedinfo コマンドを使用して、vcpu_quota パラメーターを設定します。以下に例を示します。

      # virsh schedinfo <vm_name> --set vcpu_quota=50000
      Copy to Clipboard Toggle word wrap

      この例では、vcpu_quota は 50,000 マイクロ秒に設定されています。これは、vcpu_period インターバルに仮想マシンが使用できる最大 CPU 時間を指定します。この場合、vcpu_quotavcpu_period の半分に設定されるため、仮想マシンは、その間に最大 CPU 時間の 50% を使用できます。

      また、the-- live --config オプションを使用して、再起動せずに実行中の仮想マシンを設定することもできます。

検証

  • vCPU スケジューリングパラメーターに正しい値があることを確認します。

    # virsh schedinfo <vm_name>
    
    Scheduler      : posix
    cpu_shares     : 2048
    vcpu_period    : 100000
    vcpu_quota     : 50000
    ...
    Copy to Clipboard Toggle word wrap

18.7.7. CPU の重みのチューニング

CPU の重み (または CPU 共有)設定は、他の実行中の仮想マシンと比較して、仮想マシンが受け取る CPU 時間を制御します。特定の仮想マシンの CPU 重み を増やすことで、この仮想マシンが他の仮想マシンと比較してより多くの CPU 時間になるようにすることができます。複数の仮想マシン間の CPU 時間割り当てを優先するには、cpu_shares パラメーターを設定します

CPU の重みの値の範囲は 0 から 262144、新しい KVM 仮想マシンのデフォルト値は 1024 です。

手順

  1. 仮想マシンの現在の CPU ウェイト を確認します。

    # virsh schedinfo <vm_name>
    
    Scheduler      : posix
    cpu_shares : 1024
    vcpu_period    : 0
    vcpu_quota     : 0
    emulator_period: 0
    emulator_quota : 0
    global_period  : 0
    global_quota   : 0
    iothread_period: 0
    iothread_quota : 0
    Copy to Clipboard Toggle word wrap
  2. CPU の重み を優先値に調整します。

    # virsh schedinfo <vm_name> --set cpu_shares=2048
    
    Scheduler      : posix
    cpu_shares : 2048
    vcpu_period    : 0
    vcpu_quota     : 0
    emulator_period: 0
    emulator_quota : 0
    global_period  : 0
    global_quota   : 0
    iothread_period: 0
    iothread_quota : 0
    Copy to Clipboard Toggle word wrap

    この例では、cpu_shares は 2048 に設定されています。つまり、他のすべての仮想マシンの値が 1024 に設定されている場合、この仮想マシンは CPU 時間の約 2 倍になります。

    また、the-- live --config オプションを使用して、再起動せずに実行中の仮想マシンを設定することもできます。

18.7.8. Kernel Same-Page Merging の有効化と無効化

Kernel Same-Page Merging (KSM) は、仮想マシン (VM) 間で同一のメモリーページを共有することにより、メモリー密度を向上させます。したがって、KSM を有効にすると、仮想マシンデプロイメントのメモリー効率が向上する可能性があります。

ただし、KSM を有効にすると、CPU 使用率も増加し、ワークロードによっては全体的なパフォーマンスに悪影響が生じる可能性があります。

RHEL 9 以降では、KSM はデフォルトで無効になっています。KSM を有効にして仮想マシンパフォーマンスへの影響をテストするには、次の手順を参照してください。

前提条件

  • ホストシステムへのルートアクセス。

手順

  1. KSM を有効にします。

    警告

    KSM を有効にすると、CPU 使用率が増大し、CPU 全体のパフォーマンスに影響を及ぼします。

    1. ksmtuned サービスをインストールします。

      # {PackageManagerCommand} install ksmtuned
      Copy to Clipboard Toggle word wrap
    2. サービスを起動します。

      • KSM を単一セッションの間だけ有効にするには、systemctl ユーティリティーを使用して ksm および ksmtuned サービスを開始します。

        # systemctl start ksm
        # systemctl start ksmtuned
        Copy to Clipboard Toggle word wrap
      • KSM を永続的に有効にするには、systemctl ユーティリティーを使用して ksm サービスおよび ksmtuned サービスを有効にします。

        # systemctl enable ksm
        Created symlink /etc/systemd/system/multi-user.target.wants/ksm.service  /usr/lib/systemd/system/ksm.service
        
        # systemctl enable ksmtuned
        Created symlink /etc/systemd/system/multi-user.target.wants/ksmtuned.service  /usr/lib/systemd/system/ksmtuned.service
        Copy to Clipboard Toggle word wrap
  2. ホスト上の仮想マシンのパフォーマンスとリソース消費を監視して、KSM を有効にすることによる利点を評価します。具体的には、KSM による CPU 使用率の増加によってメモリーの改善が相殺されないこと、および別のパフォーマンスの問題が発生しないことを確認します。レイテンシーの影響を受けやすいワークロードでは、NUMA 間のページマージにも注意してください。
  3. オプション: KSM によって仮想マシンのパフォーマンスが向上しない場合は、無効にします。

    • KSM を単一セッションの間だけ無効にするには、systemctl ユーティリティーを使用して ksm および ksmtuned サービスを停止します。

      # systemctl stop ksm
      # systemctl stop ksmtuned
      Copy to Clipboard Toggle word wrap
    • KSM を永続的に無効にするには、systemctl ユーティリティーを使用して ksm および ksmtuned サービスを無効にします。

      # systemctl disable ksm
      Removed /etc/systemd/system/multi-user.target.wants/ksm.service.
      # systemctl disable ksmtuned
      Removed /etc/systemd/system/multi-user.target.wants/ksmtuned.service.
      Copy to Clipboard Toggle word wrap
注記

KSM を無効にする前に仮想マシン間で共有されていたメモリーページは、そのまま共有されます。共有を停止するには、以下のコマンドを使用して、システムの PageKSM ページをすべて削除します。

# echo 2 > /sys/kernel/mm/ksm/run
Copy to Clipboard Toggle word wrap

ただし、このコマンドはメモリー使用量を増加させ、ホストまたは仮想マシンでパフォーマンスの問題を引き起こす可能性があります。

トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

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

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

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

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

会社概要

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

Theme

© 2025 Red Hat