20.2. Windows 仮想マシンの最適化

RHEL 9 でホストされる仮想マシンで Microsoft Windows をゲストオペレーティングシステムとして使用すると、ゲストのパフォーマンスが悪影響を受ける可能性があります。

そのため、Red Hat は、以下のいずれかを組み合わせて実行して Windows 仮想マシンを最適化することを推奨しています。

20.2.1. Windows 仮想マシン用の KVM 準仮想化ドライバーのインストール

Windows 仮想マシンのパフォーマンスを改善する主な方法は、Windows 用の KVM 準仮想化 (virtio) ドライバーをゲストオペレーティングシステムにインストールすることです。

注記

virtio-win ドライバーは、各 virtio-win リリースの時点で利用可能な Windows 10 および 11 の最新リリースに対して認定 (WHQL) されています。ただし、virtio-win ドライバーは広くテストされており、Windows 10 および 11 の以前のビルドでも正しく機能することが期待されます。

Windows VM にドライバーをインストールするには、次の操作を実行します。

  1. ホストマシンにインストールメディアを準備します。詳細は、Preparing virtio driver installation media on a host machine を参照してください。
  2. インストールメディアを既存の Windows 仮想マシンに接続するか、新しい Windows 仮想マシンを作成するときに接続します。詳細については、RHEL への Windows 仮想マシンのインストール を参照してください。
  3. Windows ゲストオペレーティングシステムに virtio ドライバーをインストールします。詳細は、Installing virtio drivers on a Windows guest を参照してください。
  4. QEMU Guest Agent を Windows ゲストオペレーティングシステムにインストールします。詳細は、Windows ゲストへの QEMU ゲストエージェントのインストール を参照してください。

20.2.1.1. Windows virtio ドライバーの仕組み

準仮想化ドライバーは仮想マシンのパフォーマンスを向上し、I/O レイテンシーを下げ、ベアメタルレベルまでスループットを増加させます。Red Hat は、I/O 負荷の高いタスクとアプリケーションを実行する仮想マシンには、準仮想化ドライバーを使用することを推奨します。

virtio ドライバーは、KVM ホストで実行する Windows 仮想マシンで利用可能な、KVM の準仮想化デバイスドライバーです。これらのドライバーは、virtio-win パッケージにより提供されます。これには、以下のドライバーが含まれます。

  • ブロック (ストレージ) デバイス
  • ネットワークインターフェイスコントローラー
  • ビデオコントローラー
  • メモリーバルーニングデバイス
  • 準仮想化シリアルポートデバイス
  • エントロピーソースデバイス
  • 準仮想化パニックデバイス
  • マウス、キーボード、タブレットなどの入力デバイス
  • エミュレートされたデバイスの小規模セット
注記

エミュレートされたデバイス、virtio デバイス、および割り当てられたデバイスの詳細は、仮想デバイスの管理 を参照してください。

KVM virtio ドライバーを使用すると、以下の Microsoft Windows バージョンが、物理システムと同様に動作することが期待されます。

20.2.1.2. ホストマシンでの virtio ドライバーインストールメディアの準備

KVM virtio ドライバーを Windows 仮想マシン (VM) にインストールまたは更新するには、最初にホストマシンで virtio ドライバーインストールメディアを準備する必要があります。これを行うには、virtio-win パッケージで提供される .iso ファイルをストレージデバイスとして Windows VM に接続します。

前提条件

  • RHEL 9 ホストシステムで仮想化が有効になっていることを確認する。詳細は、仮想化の有効化 を参照してください。
  • 仮想マシンへのルートアクセス権限があることを確認します。

手順

  1. サブスクリプションデータを更新します。

    # subscription-manager refresh
    All local data refreshed
  2. virtio-win パッケージの最新バージョンを入手します。

    • virtio-win がインストールされていない場合:

      # dnf install -y virtio-win
    • virtio-win がインストールされている場合:

      # dnf upgrade -y virtio-win

      インストールが成功すると、virtio-win ドライバーファイルが /usr/share/virtio-win/ ディレクトリーで使用可能になります。これには、ISO ファイルと、ディレクトリーにドライバーファイルを持つ drivers ディレクトリー (各アーキテクチャーと対応している Windows バージョン用のファイル) が含まれます。

      # ls /usr/share/virtio-win/
      drivers/  guest-agent/  virtio-win-1.9.9.iso  virtio-win.iso
  3. virtio-win.iso ファイルをストレージデバイスとして Windows VM に接続します。

    • 新しい Windows 仮想マシンを作成する 場合は、virt-install コマンドオプションを使用してファイルをアタッチします。
    • 既存の Windows VM にドライバーをインストールする場合は、virt-xml ユーティリティーを使用して、ファイルを CD-ROM としてアタッチします。

      # virt-xml WindowsVM --add-device --disk virtio-win.iso,device=cdrom
      Domain 'WindowsVM' defined successfully.

20.2.1.3. Windows ゲストへの virtio ドライバーのインストール

KVM virtio ドライバーを Windows ゲストオペレーティングシステムにインストールするには、ドライバーを含むストレージデバイスを (仮想マシン (VM) の作成時または作成後に) 追加し、Windows ゲストオペレーティングシステムにドライバーをインストールする必要があります。

この手順では、グラフィカルインターフェイスを使用してドライバーをインストールする手順を説明します。Microsoft Windows インストーラー (MSI) コマンドラインインターフェイスを使用することもできます。

前提条件

手順

  1. Windows ゲストオペレーティングシステムで、File Explorer アプリケーションを開きます。
  2. この PC をクリックします。
  3. デバイスおよびドライブ ペインで、virtio-win メディアを開きます。
  4. 仮想マシンにインストールされているオペレーティングシステムに基づいて、次のいずれかのインストーラーを実行します。

    • 32 ビットオペレーティングシステムを使用している場合は、virtio-win-gt-x86.msi インストーラーを実行します。
    • 64 ビットオペレーティングシステムを使用している場合は、virtio-win-gt-x64.msi インストーラーを実行します。
  5. 表示された Virtio-win-driver-installer セットアップウィザードで、表示される指示に従い、Custom Setup ステップまで進みます。

    Virtio-win-guest-tools セットアップウィザードを表示しているイメージ。
  6. カスタムセットアップ画面で、インストールするデバイスドライバーを選択します。推奨されるドライバーセットが自動的に選択され、ドライバーの説明がリストの右側に表示されます。
  7. 次へ をクリックして、インストール をクリックします。
  8. インストールが完了したら、完了 をクリックします。
  9. 仮想マシンを再起動してドライバーのインストールを完了します。

検証

  1. Windows 仮想マシンで、Device Manager に移動します。

    1. Start をクリックします。
    2. Device Manager を検索します。
  2. デバイスが正しいドライバーを使用していることを確認します。

    1. デバイスをクリックして Driver Properties ウィンドウを開きます。
    2. Driver タブに移動します。
    3. Driver Details をクリックします。

次のステップ

  • NetKVM ドライバーをインストールした場合は、Windows ゲストのネットワークパラメーターの設定も必要になる場合があります。詳細は、Configuring NetKVM driver parameters を参照してください。

20.2.1.4. Windows ゲストでの virtio ドライバーの更新

Windows ゲストオペレーティングシステム (OS) で KVM virtio ドライバーを更新するには、Windows OS バージョンがサポートしている場合、Windows Update サービスを使用できます。そうでない場合は、Windows 仮想マシン (VM) に接続されている virtio ドライバーインストールメディアからドライバーを再インストールします。

前提条件

手順 1: Windows Update を使用したドライバーの更新

Windows 10、Windows Server 2016 以降のオペレーティングシステムでは、Windows Update グラフィカルインターフェイスを使用して、ドライバーの更新が利用可能かどうかを確認します。

  1. Windows 仮想マシンを起動し、ゲスト OS にログインします。
  2. Optional updates ページに移動します。

    Settings → Windows Update → Advanced options → Optional updates

  3. Red Hat, Inc. からのすべての更新をインストールします。

手順 2: ドライバーを再インストールして更新する

Windows 10 および Windows Server 2016 より前のオペレーティングシステムの場合、または OS が Windows Update にアクセスできない場合は、ドライバーを再インストールします。これにより、Windows ゲスト OS のネットワーク設定がデフォルト (DHCP) に復元されます。カスタマイズしたネットワーク設定を保持する場合は、netsh ユーティリティーを使用してバックアップを作成し、復元する必要があります。

  1. Windows 仮想マシンを起動し、ゲスト OS にログインします。
  2. Windows コマンドプロンプトを開きます。

    1. Super+R キーボードショートカットを使用します。
    2. 表示されるウィンドウで、cmd と入力し、Ctrl+Shift+Enter を押して管理者として実行します。
  3. Windows コマンドプロンプトを使用して、OS ネットワーク設定をバックアップします。

    C:\WINDOWS\system32\netsh dump > backup.txt
  4. 付属のインストールメディアから KVM virtio ドライバーを再インストールします。次のいずれかを行います。

    • Windows コマンドプロンプトを使用してドライバーを再インストールします。ここで、X はインストールメディアのドライブ文字です。次のコマンドは、すべての virtio ドライバーをインストールします。

      • 64 ビット vCPU を使用している場合:

        C:\WINDOWS\system32\msiexec.exe /i X:\virtio-win-gt-x64.msi /passive /norestart
      • 32 ビット vCPU を使用している場合:

        C:\WINDOWS\system32\msiexec.exe /i X:\virtio-win-gt-x86.msi /passive /norestart
    • VM を再起動せずに、グラフィカルインターフェイスを使用して ドライバーを再インストールします。
  5. Windows コマンドプロンプトを使用して、OS ネットワーク設定を復元します。

    C:\WINDOWS\system32\netsh -f backup.txt
  6. 仮想マシンを再起動してドライバーのインストールを完了します。

20.2.1.5. Windows ゲストへの QEMU ゲストエージェントのインストール

ホストが Windows 仮想マシン (VM) 上でさまざまな操作を実行できるようにするには、QEMU ゲストエージェントをインストールします。これを行うには、QEMU ゲストエージェントインストーラーを含むストレージデバイスを、既存の仮想マシンに追加するか、新しい仮想マシンを作成するときに追加し、Windows ゲストオペレーティングシステムにドライバーをインストールします。

この手順では、グラフィカルインターフェイスを使用してゲストエージェントをインストールする手順を説明します。Microsoft Windows インストーラー (MSI) コマンドラインインターフェイスを使用することもできます。

前提条件

手順

  1. Windows ゲストオペレーティングシステムで、File Explorer アプリケーションを開きます。
  2. この PC をクリックします。
  3. デバイスおよびドライブ ペインで、virtio-win メディアを開きます。
  4. guest-agent フォルダーを開きます。
  5. 仮想マシンにインストールされているオペレーティングシステムに基づいて、次のいずれかのインストーラーを実行します。

    • 32 ビットオペレーティングシステムを使用している場合は、qemu-ga-i386.msi インストーラーを実行します。
    • 64 ビットオペレーティングシステムを使用している場合は、qemu-ga-x86_64.msi インストーラーを実行します。

検証

  1. Windows 仮想マシンで、Services ウィンドウに移動します。

    Computer Management > Services

  2. QEMU ゲストエージェントサービスの StatusRunning であることを確認します。

20.2.2. Hyper-V Enlightenment の有効化

Hyper-V Enlightenment では、KVM が Microsoft Hyper-V ハイパーバイザーをエミュレートするための方法を利用できます。これにより、Windows 仮想マシンのパフォーマンスが向上します。

以下のセクションは、対応している Hyper-V Enlightenment と、その有効化に関する情報を提供します。

20.2.2.1. Windows 仮想マシンでの Hyper-V Englightenment の有効化

Hyper-V Enlightenment により、RHEL 9 ホストで実行している Windows 仮想マシン (VM) でパフォーマンスが向上します。それを有効にする方法は、次を参照してください。

手順

  1. virsh edit コマンドを使用して、仮想マシンの XML 設定を表示します。以下に例を示します。

    # virsh edit windows-vm
  2. XML の <features> セクションに、以下の <hyperv> サブセクションを追加します。

    <features>
      [...]
      <hyperv>
        <relaxed state='on'/>
        <vapic state='on'/>
        <spinlocks state='on' retries='8191'/>
        <vpindex state='on'/>
        <runtime state='on' />
        <synic state='on'/>
        <stimer state='on'>
          <direct state='on'/>
        </stimer>
        <frequencies state='on'/>
        <reset state='on'/>
        <relaxed state='on'/>
        <time state='on'/>
        <tlbflush state='on'/>
        <reenlightenment state='on'/>
        <stimer state='on'>
          <direct state='on'/>
        </stimer>
        <ipi state='on'/>
        <crash state='on'/>
        <evmcs state='on'/>
      </hyperv>
      [...]
    </features>

    XML に <hyperv> サブセクションが含まれている場合は、上記のように変更します。

  3. 以下のように、設定の クロック セクションを変更します。

    <clock offset='localtime'>
      ...
      <timer name='hypervclock' present='yes'/>
    </clock>
  4. XML 設定を保存して終了します。
  5. 仮想マシンが実行中の場合は再起動します。

検証

  • virsh dumpxml コマンドを使用して、実行中の仮想マシンの XML 設定を表示します。次のセグメントが含まれている場合は、Hyper-V Enlightenment が仮想マシンで有効になります。

    <hyperv>
      <relaxed state='on'/>
      <vapic state='on'/>
      <spinlocks state='on' retries='8191'/>
      <vpindex state='on'/>
      <runtime state='on' />
      <synic state='on'/>
      <stimer state='on'/>
      <frequencies state='on'/>
      <reset state='on'/>
      <relaxed state='on'/>
      <time state='on'/>
      <tlbflush state='on'/>
      <reenlightenment state='on'/>
      <stimer state='on'>
        <direct state='on'/>
      </stimer>
      <ipi state='on'/>
      <crash state='on'/>
      <evmcs state='on'/>
    </hyperv>
    
    <clock offset='localtime'>
      ...
      <timer name='hypervclock' present='yes'/>
    </clock>

20.2.2.2. 設定可能な Hyper-V Enlightenment

特定の Hyper-V 機能を設定して Windows 仮想マシンを最適化できます。以下の表では、設定可能な Hyper-V 機能およびその値に関する情報を提供します。

表20.1 設定可能な Hyper-V 機能

Enlightenment説明

crash

仮想マシンがクラッシュした場合に、情報とログを保存するために使用できる MSR を仮想マシンに提供します。QEMU ログの情報を利用できます。

注記

hv_crash が有効になっている場合、Windows クラッシュダンプは作成されません。

on、off

evmcs

L0 (KVM) と L1 (Hyper-V) ハイパーバイザーとの間で準仮想化プロトコルを実装し、L2 を終了してハイパーバイザーに移動する時間を短縮できます。

注記

この機能は Intel プロセッサーのみを対象とします。

on、off

frequencies

Hyper-V 周波数 MSR (Machine Specific Registeres) を有効にします。

on、off

ipi

IPI (準仮想化された相互プロセッサー割り込み) サポートを有効にします。

on、off

no-nonarch-coresharing

仮想プロセッサーが SMT シブリングスレッドとして報告されない限り、物理コアを共有しないように、ゲスト OS に指示します。この情報は、SMT (同時マルチスレッド) に関連する CPU の脆弱性を適切に軽減するために、Windows および Hyper-V ゲストで必要です。

on、off、auto

reenlightenment

タイムスタンプカウンター (TSC) 周波数の変更がある場合に (移行時のみ) 通知します。新しい周波数に切替える準備ができるまで、ゲストでそのまま以前の周波数を使用することも可能です。

on、off

relaxed

仮想マシンを高負荷のホストで実行すると、一般的に BSOD に陥る Windows のサニティーチェックを無効化します。これは、Linux カーネルオプション no_timer_check と似ています。これは、Linux が KVM で実行している場合に自動的に有効になります。

on、off

runtime

ゲストコードの実行に費やすプロセッサー時間および、ゲストコードの代わりに費やすプロセッサー時間を設定します。

on、off

spinlocks

  • 仮想マシンのオペレーティングシステムによって使用され、呼び出し仮想プロセッサーが同じパーティション内の別の仮想プロセッサーで保持する可能性があるリソースを取得することを Hyper-V に通知します。
  • Hyper-V に過度のスピン状況を示す前に、スピンロックの取得が施行されるべき回数についてを仮想マシンのオペレーティングシステムに示すために Hyper-V によって使用されます。

on、off

stimer

仮想プロセッサーの合成タイマーを有効にします。この Enlightenment が指定されない場合には、特定の Windows バージョンが、HPET (HPET が利用できない場合には RTC も使用) を使用するように戻るため、仮想 CPU がアイドル状態であっても、CPU の消費量が大幅に消費される可能性があることに注意してください。

on、off

stimer-direct

有効期限イベントが通常の割り込みで配信されると合成タイマーを有効にします。

on、off

synic

stimer とともに、synic タイマーをアクティブにします。Windows 8 では、この機能は定期的なモードで使用します。

on、off

時間

仮想マシンでできるように、以下の Hyper-V 固有のクロックソースを有効にします。

  • MSR ベースの 82 Hyper-V クロックソース (HV_X64_MSR_TIME_REF_COUNT, 0x40000020)
  • MSR で有効にされる Reference TSC 83 ページ (HV_X64_MSR_REFERENCE_TSC, 0x40000021)

on、off

tlbflush

仮想プロセッサーの TLB をフラッシュします。

on、off

vapic

仮想 APIC を有効にして、高負荷のメモリーマッピングされた APIC (Advanced Programmable Interrupt Controller) レジスターへのアクセラレート MSR アクセスを提供します。

on、off

vendor_id

Hyper-V ベンダー ID を設定します。

  • on、off
  • ID 値: 文字列 (最大 12 文字)

vpindex

仮想プロセッサーのインデックスを有効にします。

on、off

20.2.3. NetKVM ドライバーパラメーターの設定

NetKVM ドライバーをインストールした後は、ご使用の環境に応じて設定を行うことができます。次の手順にリストされているパラメーターは、Windows デバイスマネージャー(devmgmt.msc)を使用して設定できます。

重要

ドライバーのパラメーターを変更すると、Windows はそのドライバーを再読み込みします。これにより、既存のネットワークアクティビティーが中断します。

前提条件

手順

  1. Windows デバイスマネージャーを開きます。

    Device Manager を開く方法は、Windows のドキュメントを参照してください。

  2. Red Hat VirtIO Ethernet Adapter を見つけます。

    1. Device Manager 画面で、Network アダプターの隣にある + をクリックします。
    2. ネットワークアダプターのリストの下で、Red Hat VirtIO Ethernet Adapter をダブルクリックします。

      デバイスの プロパティー ウィンドウが開きます。

  3. デバイスパラメーターを表示します。

    プロパティー ウィンドウで、詳細設定 タブをクリックします。

  4. デバイスパラメーターを変更します。

    1. 変更するパラメーターをクリックします。

      そのパラメーターのオプションが表示されます。

    2. 必要に応じてオプションを変更します。

      NetKVM パラメーターオプションの詳細は、NetKVM ドライバーパラメーター を参照してください。

    3. OK をクリックして変更を保存します。

20.2.4. NetKVM ドライバーパラメーター

次の表に、設定可能な NetKVM ドライバーのロギングパラメーターに関する情報を示します。

表20.2 ロギングパラメーター

パラメーター説明 2

logging.Enable

ロギングが有効であるかどうかを決定するブール値。デフォルト値は Enabled です。

logging.Level

ロギングレベルを定義する整数。この整数を高くすると、ログの詳細度が上がります。

  • デフォルト値は 0 (エラーのみ) です。
  • 1-2 は設定メッセージを追加します。
  • 3-4 は、パケットフロー情報を追加します。
  • 5-6 は割り込みおよび DPC レベルのトレース情報を追加します。
注記

ロギングレベルが高くなると、仮想マシンの速度が低下します。

次の表に、設定可能な NetKVM ドライバーの初期パラメーターに関する情報を示します。

表20.3 初期パラメーター

パラメーター説明

Assign MAC

準仮想化 NIC のローカル管理 MAC アドレスを定義する文字列。これはデフォルトでは設定されません。

Init.Do802.1PQ

Priority/VLAN タグポピュレーションと削除サポートを有効にするブール値。デフォルト値は Enabled です。

Init.MaxTxBuffers

割り当てられた TX リング記述子の数を表す整数。この値は、QEMU の Tx キューのサイズによって制限されます。

デフォルト値は 1024 です。

有効な値は、16、32、64、128、256、512、1024 です。

Init.MaxRxBuffers

割り当てられた RX リング記述子の数を表す整数。この値は、QEMU の Tx キューのサイズによって制限されます。

デフォルト値は 1024 です。

有効な値は、16、32、64、128、256、512、1024、2048、および 4096 です。

Offload.Tx.Checksum

TX チェックサムオフロード機能を指定します。

Red Hat Enterprise Linux 9 では、このパラメーターの有効な値は次のとおりです。

  • IPv4 と IPv6 の両方で IP、TCP、および UDP チェックサムオフロードを有効にする All (デフォルト)
  • IPv4 と IPv6 の両方で TCP および UDP チェックサムオフロードを有効にする TCP/UDP (v4,v6)
  • IPv4 でのみ TCP および UDP チェックサムオフロードを有効にする TCP/UDP (v4)
  • IPv4 でのみ TCP (v4) チェックサムオフロードを有効にする TCP (v4)

Offload.Rx.Checksum

RX チェックサムオフロード機能を指定します。

Red Hat Enterprise Linux 9 では、このパラメーターの有効な値は次のとおりです。

  • IPv4 と IPv6 の両方で IP、TCP、および UDP チェックサムオフロードを有効にする All (デフォルト)
  • IPv4 と IPv6 の両方で TCP および UDP チェックサムオフロードを有効にする TCP/UDP (v4,v6)
  • IPv4 でのみ TCP および UDP チェックサムオフロードを有効にする TCP/UDP (v4)
  • IPv4 でのみ TCP (v4) チェックサムオフロードを有効にする TCP (v4)

Offload.Tx.LSO

TX ラージセグメントオフロード (LSO) 機能を指定します。

Red Hat Enterprise Linux 9 では、このパラメーターの有効な値は次のとおりです。

  • TCPv4 と TCPv6 の両方で LSO オフロードを有効にする Maximal (デフォルト)
  • TCPv4 でのみ LSO オフロードを有効にする IPv4
  • LSO オフロードを無効にする Disable

MinRxBufferPercent

RX キュー内の使用可能なバッファーの最小量を、RX バッファーの合計量に対するパーセントで指定します。使用可能なバッファーの実際の数がこの値よりも少ない場合、NetKVM ドライバーは、オペレーティングシステムにリソース不足状態を通知します (できるだけ早く RX バッファーを返すように要求します)。

最小値 (デフォルト) - 0。ドライバーがリソース不足状態を示さないことを意味します。

最大値 - 100。ドライバーが常にリソース不足状態を示すことを意味します。

20.2.5. Windows 仮想マシンでのバックグラウンドプロセスの最適化

Windows OS を実行している仮想マシンのパフォーマンスを最適化するには、さまざまな Windows プロセスを設定するか、無効化してください。

警告

設定を変更すると、プロセスによっては、予想通り機能しない場合があります。

手順

次の組み合わせを実行すると、Windows 仮想マシンを最適化できます。

  • USB や CD-ROM などの未使用のデバイスを削除して、ポートを無効にします。
  • SuperFetch や Windows Search などのバックグラウンドサービスを無効にします。サービスの停止に関する詳細は、システムサービスの無効化 または サービス停止 を参照してください。
  • useplatformclock を無効にします。これには以下のコマンドを実行します。

    # bcdedit /set useplatformclock No
  • スケジュール済みのディスクのデフラグなど、不要なスケジュールタスクを確認して無効にします。方法は、スケジュール済みタスクの無効化 を参照してください。
  • ディスクが暗号化されていないことを確認します。
  • 定期的なサーバーアプリケーションのアクティビティーを減らします。これには、各タイマーを編集します。詳細は Multimedia Timers を参照してください。
  • 仮想マシンで Server Manager アプリケーションを閉じます。
  • ウイルス対策ソフトウェアを無効にします。ウイルス対策ソフトウェアを無効にすると、仮想マシンのセキュリティーが侵害される可能性があることに注意してください。
  • スクリーンセーバーを無効にします。
  • 使用時以外は、Windows OS のサインイン画面のままにします。