17.4. 仮想マシンのメモリーの設定

仮想マシンのパフォーマンスを改善するために、追加のホスト RAM を仮想マシンに割り当てることができます。同様に、仮想マシンに割り当てるメモリー量を減らして、ホストメモリーを他の仮想マシンやタスクに割り当てることができます。

これらのアクションを実行するには、Web コンソール または コマンドラインインターフェイス を使用します。

17.4.1. Web コンソールで仮想マシンのメモリーの追加と削除

仮想マシンのパフォーマンスを向上させるか、仮想マシンが使用するホストリソースを解放するために、Web コンソールを使用して、仮想マシンに割り当てられたメモリーの量を調整できます。

前提条件

  • ゲスト OS がメモリーバルーンドライバーを実行している。これを確認するには、以下を実行します。

    1. 仮想マシンの設定に memballoon デバイスが含まれていることを確認します。

      # virsh dumpxml testguest | grep memballoon
      <memballoon model='virtio'>
          </memballoon>

      このコマンドで出力が表示され、モデルが none に設定されていない場合は、memballoon デバイスが存在します。

    2. バルーンドライバーがゲスト OS で実行していることを確認します。

      • Windows ゲストでは、ドライバーは virtio-win ドライバーパッケージの一部としてインストールされます。手順は、Installing KVM paravirtualized drivers for Windows virtual machines を参照してください。
      • Linux ゲストでは、通常、このドライバーはデフォルトで含まれており、memballoon デバイスがあれば、アクティベートされます。
  • Web コンソールの仮想マシンプラグインが システムにインストールされている

手順

  1. 任意: 最大メモリーと、仮想マシンに現在使用されている最大メモリーの情報を取得します。これは、変更のベースラインとしても、検証のためにも機能します。

    # virsh dominfo testguest
    Max memory:     2097152 KiB
    Used memory:    2097152 KiB
  2. 仮想マシン インターフェイスで、情報を表示する仮想マシンを選択します。

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

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

    メモリー調整 ダイアログが表示されます。

    仮想マシンのメモリー調整ダイアログボックスを表示するイメージ。
  4. 選択した仮想マシンの仮想 CPU を設定します。

    • 最大割り当て: 仮想マシンがそのプロセスに使用できるホストメモリーの最大量を設定します。VM の作成時に最大メモリーを指定することも、後で増やすこともできます。メモリーは、MiB または GiB の倍数で指定できます。

      仮想マシンをシャットダウンしてからでないと、最大メモリー割り当てを調整できません。

    • 現在の割り当て - 仮想マシンに割り当てる実際のメモリー量を設定します。この値は、最大割り当てより小さい値にすることができますが、上限を超えることはできません。値を調整して、仮想マシンで利用可能なメモリーをプロセス用に調整できます。メモリーは、MiB または GiB の倍数で指定できます。

      この値を指定しない場合、デフォルトの割り当ては最大割り当て の値になります。

  5. Save をクリックします。

    仮想マシンのメモリー割り当てが調整されます。

17.4.2. コマンドラインインターフェイスで仮想マシンのメモリーの追加と削除

仮想マシンのパフォーマンスを改善したり、使用しているホストリソースを解放したりするために、CLI を使用して仮想マシンに割り当てられたメモリーの量を調整できます。

前提条件

  • ゲスト OS がメモリーバルーンドライバーを実行している。これを確認するには、以下を実行します。

    1. 仮想マシンの設定に memballoon デバイスが含まれていることを確認します。

      # virsh dumpxml testguest | grep memballoon
      <memballoon model='virtio'>
          </memballoon>

      このコマンドで出力が表示され、モデルが none に設定されていない場合は、memballoon デバイスが存在します。

    2. ballon ドライバーがゲスト OS で実行されていることを確認します。

      • Windows ゲストでは、ドライバーは virtio-win ドライバーパッケージの一部としてインストールされます。手順は、Installing KVM paravirtualized drivers for Windows virtual machines を参照してください。
      • Linux ゲストでは、通常、このドライバーはデフォルトで含まれており、memballoon デバイスがあれば、アクティベートされます。

手順

  1. 任意: 最大メモリーと、仮想マシンに現在使用されている最大メモリーの情報を取得します。これは、変更のベースラインとしても、検証のためにも機能します。

    # virsh dominfo testguest
    Max memory:     2097152 KiB
    Used memory:    2097152 KiB
  2. 仮想マシンに割り当てる最大メモリーを調整します。この値を増やすと、仮想マシンのパフォーマンスが低下する可能性が向上し、値を減らすことで、仮想マシンがホスト上にあるパフォーマンスフットプリントが低減します。この変更は、停止している仮想マシンでのみ実行できるため、実行中の仮想マシンを調整するには再起動する必要があります。

    たとえば、仮想マシン testguest が使用可能な最大メモリーを 4096 MiB に変更するには、次のコマンドを実行します。

    # virt-xml testguest --edit --memory memory=4096,currentMemory=4096
    Domain 'testguest' defined successfully.
    Changes will take effect after the domain is fully powered off.

    実行中の仮想マシンの最大メモリーを増やすには、仮想マシンにメモリーデバイスを割り当てます。これは、メモリーのホットプラグとも呼ばれます。詳細は、Attaching memory devices to virtual machines を参照してください。

    警告

    実行中の仮想マシン (メモリーのホットアンプラグとも呼ばれる) から、メモリーデバイスを削除することはサポートされておらず、Red Hat では推奨していません。

  3. 任意: 仮想マシンが現在使用しているメモリーを最大割り当てまで調整することもできます。これにより、仮想マシンの最大割り当てを変更せずに、仮想マシンが次回の再起動までホスト上にあるメモリー負荷が調整されます。

    # virsh setmem testguest --current 2048

検証

  1. 仮想マシンが使用するメモリーが更新されていることを確認します。

    # virsh dominfo testguest
    Max memory:     4194304 KiB
    Used memory:    2097152 KiB
  2. (必要に応じて) 現在の仮想マシンメモリーを調整すると、仮想マシンのメモリーバルーンの統計を取得して、そのメモリー使用量をどの程度効果的に調整するかを評価できます。

     # virsh domstats --balloon testguest
    Domain: 'testguest'
      balloon.current=365624
      balloon.maximum=4194304
      balloon.swap_in=0
      balloon.swap_out=0
      balloon.major_fault=306
      balloon.minor_fault=156117
      balloon.unused=3834448
      balloon.available=4035008
      balloon.usable=3746340
      balloon.last-update=1587971682
      balloon.disk_caches=75444
      balloon.hugetlb_pgalloc=0
      balloon.hugetlb_pgfail=0
      balloon.rss=1005456

17.4.3. virtio-mem を使用した仮想マシンメモリーの追加および削除

RHEL 9 では、テクノロジープレビューとして virtio-mem 準仮想化メモリーデバイスを提供します。virtio-mem を使用すると、仮想マシン (VM) でホストメモリーを動的に追加または削除できます。たとえば、このデバイスを使用して、実行中の VM 間でメモリーリソースを移動したり、現在の要件に基づいてクラウドセットアップで VM メモリーのサイズを変更したりできます。

重要

virtio-mem は、テクノロジープレビューとして RHEL 9 に含まれています。つまり、これはサポート対象外となります。

17.4.3.1. 前提条件

  • ホストに Intel 64 または AMD64 CPU アーキテクチャーがある。
  • ホストおよび仮想マシンは、RHEL 9 をオペレーティングシステムとして使用している。

17.4.3.2. virtio-mem の概要

virtio-mem は、仮想マシンでホストメモリーを動的に追加または削除するために使用できる準仮想化メモリーデバイスです。たとえば、このデバイスを使用して、実行中の VM 間でメモリーリソースを移動したり、現在の要件に基づいてクラウドセットアップで VM メモリーのサイズを変更したりできます。

virtio-mem を使用すると、VM のメモリーを初期サイズを超えて増やしたり、2 から数百メビバイト (MiB) の単位で元のサイズに縮小したりできます。ただし、virtio-mem は、特にメモリーを確実にアンプラグするために、特定のゲストオペレーティングシステム設定にも依存していることに注意してください。

重要

virtio-mem は、テクノロジープレビューとして RHEL 9 に含まれています。つまり、これはサポート対象外となります。

virtio-mem テクノロジープレビューの制限

virtio-mem は現在、以下の機能と互換性がありません。

  • ホストでのメモリーの事前割り当ての使用
  • ホストでの Huge Page の使用
  • ホスト上のリアルタイムアプリケーションのメモリーロックの使用
  • ホストでの暗号化された仮想化の使用
  • ホストでの動的メモリーメタデータの割り当て
  • virtio-mem とホスト上での memballoon 膨張および収縮の組み合わせ
  • 仮想マシンからの virtio-mem デバイスのアンプラグ
  • 仮想マシンでの virtio_mem ドライバーのアンロードまたはリロード
  • virtio_mem ドライバーが読み込まれている仮想マシンの休止または一時停止

仮想マシンのメモリーのオンライン化

実行中の RHEL VM にメモリーを接続する場合 (メモリーのホットプラグとも呼ばれます)、VM オペレーティングシステムでホットプラグされたメモリーをオンライン状態に設定する必要があります。そうしないと、システムはメモリーを使用できなくなります。

次の表は、使用可能なメモリーオンライン設定を選択する際の主要な考慮事項をまとめたものです。

表17.1 メモリーオンライン設定の比較

設定名仮想マシンからのメモリーのアンプラグメモリーゾーンの不均等性が発生するリスク潜在的なユースケース目的のワークロードのメモリー要件

online_movable

ホットプラグされたメモリーを確実に取り外すことができます。

はい

比較的少量のメモリーのホットプラグ

ほとんどがユーザー空間のメモリー

auto-movable

ホットプラグされたメモリーの可動部分は確実に取り外すことができます。

最小

大量のメモリーのホットプラグ

ほとんどがユーザー空間のメモリー

online_kernel

ホットプラグされたメモリーは確実に取り外すことができません。

いいえ

信頼性の低いメモリーの取り外しは許容されます。

ユーザー空間またはカーネル空間のメモリー

ゾーン不均衡 とは、Linux メモリーゾーンの 1 つに、使用可能なメモリーページがないことです。ゾーン不均衡 になると、システムのパフォーマンスに悪影響を及ぼす可能性があります。たとえば、移動不可能な割り当てが原因で空きメモリーが不足すると、カーネルがクラッシュする可能性があります。通常、移動可能な割り当てには、主にユーザー空間のメモリーページが含まれ、移動不可能な割り当てには、主にカーネル空間のメモリーページが含まれています。

メモリーのオンライン化に関する考慮事項の詳細は、Onlining and Offlining Memory Blocks および Zone Imbalances を参照してください。

17.4.3.3. 仮想マシンでのメモリーのオンライン化設定

virtio-mem を使用して実行中の仮想マシンにメモリーを接続する (メモリーのホットプラグとも呼ばれます) 前に、ホットプラグされたメモリーが自動的にオンライン状態に設定されるように仮想マシン (VM) オペレーティングシステムを設定する必要があります。そうしないと、ゲストオペレーティングシステムは追加メモリーを使用できなくなります。メモリーのオンライン化については、次のいずれかの設定から選択できます。

  • online_movable
  • online_kernel
  • auto-movable

これらの設定の違いについては、仮想マシンのメモリーのオンライン化 を参照してください。

RHEL では、メモリーのオンライン化はデフォルトで udev ルールで設定されます。ただし、virtio-mem を使用する場合は、カーネル内でメモリーのオンライン化を直接設定することを推奨します。

重要

virtio-mem は、テクノロジープレビューとして RHEL 9 に含まれています。つまり、これはサポート対象外となります。

前提条件

  • ホストに Intel 64 または AMD64 CPU アーキテクチャーがある。
  • ホストおよび仮想マシンは、RHEL 9 をオペレーティングシステムとして使用している。

手順

  • 仮想マシンで online_movable 設定を使用するようにメモリーオンライン化を設定するには、以下を実行します。

    1. memhp_default_state カーネルコマンドラインパラメーターを online_movable に設定します。

      # grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_movable
    2. 仮想マシンを再起動します。
  • 仮想マシンで online_kernel 設定を使用するようにメモリーオンライン化を設定するには、以下を実行します。

    1. 以下のように、memhp_default_state カーネルコマンドラインパラメーターを online_kernel に設定します。

      # grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online_kernel
    2. 仮想マシンを再起動します。
  • 仮想マシンで auto-movable メモリーオンライン化ポリシーを使用するには、以下の手順を実行します。

    1. memhp_default_state カーネルコマンドラインパラメーターを online に設定します。

      # grubby --update-kernel=ALL --remove-args=memhp_default_state --args=memhp_default_state=online
    2. memory_hotplug.online_policy カーネルコマンドラインパラメーターを auto-movable に設定します。

      # grubby --update-kernel=ALL --remove-args="memory_hotplug.online_policy" --args=memory_hotplug.online_policy=auto-movable
    3. オプション:auto-movable オンライン化ポリシーをさらに調整するには、memory_hotplug.auto_movable_ratio パラメーターと memory_hotplug.auto_movable_numa_aware パラメーターを変更します。

      # grubby --update-kernel=ALL --remove-args="memory_hotplug.auto_movable_ratio" --args=memory_hotplug.auto_movable_ratio=<percentage>
      
      # grubby --update-kernel=ALL --remove-args="memory_hotplug.memory_auto_movable_numa_aware" --args=memory_hotplug.auto_movable_numa_aware=<y/n>
      • memory_hotplug.auto_movable_ratio parameter は、任意の割り当てに使用できるメモリーと比較すると、移動可能な割り当てにのみ使用できるメモリーの最大比率を設定します。比率はパーセントで表され、デフォルト値は 3:1 の比率である 301 (%)です。
      • memory_hotplug.auto_movable_numa_aware パラメーターは、memory_hotplug.auto_movable_ratio パラメーターを使用可能なすべての NUMA ノードのメモリーに適用するか、単一の NUMA ノード内のメモリーのみに適用するかを制御します。デフォルト値は y (yes)です。

        たとえば、最大比率を 301% に設定し、memory_hotplug.auto_movable_numa_awarey (yes) に設定されている場合は、アタッチされた virtio-mem デバイスを持つ NUMA ノード内でも 3:1 の比率が適用されます。パラメーターが n (no) に設定されている場合、最大 3:1 の比率はすべての NUMA ノード全体に対してのみ適用されます。

        また、比率を超えていない場合、新しくホットプラグされたメモリーは、移動可能な割り当てに対してのみ利用できます。それ以外の場合では、新しくホットプラグされたメモリーは、移動可能な割り当てと移動不可能な割り当ての両方に使用できます。

    4. 仮想マシンを再起動します。

検証

  • online_movable 設定が正しく設定されているかを確認するには、memhp_default_state カーネルパラメーターの現在の値を確認します。

    # cat /sys/devices/system/memory/auto_online_blocks
    
    online_movable
  • online_kernel 設定が正しく設定されているかを確認するには、memhp_default_state カーネルパラメーターの現在の値を確認します。

    # cat /sys/devices/system/memory/auto_online_blocks
    
    online_kernel
  • auto-movable 設定が正しく設定されているかを確認するには、以下のカーネルパラメーターを確認してください。

    • memhp_default_state:

      # cat /sys/devices/system/memory/auto_online_blocks
      
      online
    • memory_hotplug.online_policy:

      # cat /sys/module/memory_hotplug/parameters/online_policy
      
      auto-movable
    • memory_hotplug.auto_movable_ratio:

      # cat /sys/module/memory_hotplug/parameters/auto_movable_ratio
      
      301
    • memory_hotplug.auto_movable_numa_aware:

      # cat /sys/module/memory_hotplug/parameters/auto_movable_numa_aware
      
      y

17.4.3.4. Attaching a virtio-mem device to virtual machines

実行中の仮想マシンに追加のメモリーをアタッチ (メモリーのホットプラグとも呼ばれます) し、その後ホットプラグされたメモリーのサイズを変更できるようにするには、virtio-mem デバイスを使用できます。具体的には、libvirt XML 設定ファイルと virsh コマンドを使用し、virtio-mem デバイスを定義して仮想マシン (VM) に割り当てることができます。

重要

virtio-mem は、テクノロジープレビューとして RHEL 9 に含まれています。つまり、これはサポート対象外となります。

前提条件

  • ホストに Intel 64 または AMD64 CPU アーキテクチャーがある。
  • ホストおよび仮想マシンは、RHEL 9 をオペレーティングシステムとして使用している。
  • VM にメモリーオンライン化が設定されている。手順は、仮想マシンでのメモリーのオンライン化設定 を参照してください。

手順

  1. ターゲット仮想マシンの XML 設定に maxMemory パラメーターが含まれるようにします。

    # virsh edit testguest1
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <maxMemory slots='2' unit='GiB'>128</maxMemory>
      ...
    </domain>

    この例では、仮想マシン testguest1 の XML 設定は、2 つのスロットと 128 ギビバイト (GiB) サイズを持つ maxMemory パラメーターを定義します。maxMemory サイズは、仮想マシンが使用できる最大メモリーを指定します。これには、初期メモリーとホットプラグされたメモリーの両方が含まれます。現在、接続されている virtio-mem デバイスごとに 1 つのスロットを予約する必要があります。

  2. ターゲット仮想マシンの XML 設定には、少なくとも 1 つの NUMA ノードが定義されていることを確認します。以下に例を示します。

    # virsh edit testguest1
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <vcpu placement='static'>8</vcpu>
      ...
      <cpu ...>
        <numa>
          <cell id='0' cpus='0-7' memory='16' unit='GiB'/>
        </numa>
      ...
    </domain>

    この例では、16 GiB の初期メモリーを持つ NUMA ノードが 1 つ定義され、仮想マシン testguest1 の 8 つの CPU に割り当てられます。仮想マシンでメモリーデバイスを使用するには、少なくとも 1 つの NUMA ノードが定義されている必要があります。

  3. XML ファイルを作成して開き、ホスト上の virtio-mem デバイスを定義します。次に例を示します。

    # vim virtio-mem-device.xml
  4. virtio-mem デバイスの XML 定義をファイルに追加し、保存します。

    <memory model='virtio-mem'>
            <target>
                    <size unit='GiB'>48</size>
                    <node>0</node>
                    <block unit='MiB'>2</block>
                    <requested unit='GiB'>16</requested>
                    <current unit='GiB'>16</current>
            </target>
            <alias name='ua-virtiomem0'/>
            <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
    </memory>
    <memory model='virtio-mem'>
            <target>
                    <size unit='GiB'>48</size>
                    <node>1</node>
                    <block unit='MiB'>2</block>
                    <requested unit='GiB'>0</requested>
                    <current unit='GiB'>0</current>
            </target>
            <alias name='ua-virtiomem1'/>
            <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
    </memory>

    この例では、2 つの virtio-mem デバイスが以下のパラメーターで定義されます。

    • size: これは、デバイスの最大サイズです。この例では 48 GiB です。sizeblock サイズの倍数である必要があります。
    • node: これは、virtio-mem デバイスに割り当てられた vNUMA ノードです。
    • block: これはデバイスのブロックサイズです。これは、少なくとも Transparent Huge Page (THP) のサイズである必要があります。THP は、Intel 64 または AMD64 CPU アーキテクチャーでは 2 MiB です。通常、Intel 64 または AMD64 アーキテクチャーでは、2 MiB ブロックサイズが適切なデフォルトの選択となります。virtio-memVirtual Function I/O (VFIO) または 仲介デバイス (mdev) で使用する場合、すべての virtio-mem デバイスにまたがるブロックの合計数は 32768 を超えることはできません。超えると、RAM のプラグインに失敗する可能性があります。
    • requested: これは、virtio-mem デバイスを使用して仮想マシンに割り当てるメモリー量です。ただし、これは VM に対する単なるリクエストであり、VM が適切に設定されていない場合など、正常に解決されない可能性があります。requested サイズは block サイズの倍数である必要があり、定義された最大 size を超えることはできません。
    • current: これは、virtio-mem デバイスが仮想マシンに提供する現在のサイズを表します。たとえば、リクエストを完了できない場合や VM を再起動する場合など、current サイズは、requested サイズとは異なる場合があります。
    • alias: これは、libvirt コマンドでデバイスを編集する場合など、目的の virtio-mem デバイスを指定するために使用できるオプションのユーザー定義のエイリアスです。libvirt のすべてのユーザー定義のエイリアスは、"ua-" 接頭辞で始まる必要があります。

      これらの特定のパラメーターとは別に、libvirt は、virtio-mem デバイスを他の PCI デバイスと同様に処理します。VM に接続された PCI デバイスの管理の詳細については、仮想デバイスの管理 を参照してください。

  5. XML ファイルを使用して、定義された virtio-mem デバイスを仮想マシンにアタッチします。たとえば、virtio-mem-device.xml で定義された 2 つのデバイスを実行中の仮想マシン testguest1 に永続的にアタッチするには、次のコマンドを実行します。

    # virsh attach-device testguest1 virtio-mem-device.xml --live --config

    --live オプションは、実行中の仮想マシンにのみデバイスを接続します。再起動後に永続性は維持されません。--config オプションは、設定の変更を永続化します。--live オプションを指定せずに、デバイスをシャットダウンした仮想マシンに接続することもできます。

  6. Optional: 実行中の仮想マシンに接続されている virtio-mem デバイスの requested サイズを動的に変更するには、virsh update-memory-device コマンドを使用します。

    # virsh update-memory-device testguest1 --alias ua-virtiomem0 --requested-size 4GiB

    この例では、以下のように設定されています。

    • testguest1 は、更新する仮想マシンです。
    • --alias ua-virtiomem0 は、以前に定義されたエイリアスで指定された virtio-mem デバイスです。
    • --requested-size 4GiB は、virtio-mem デバイスの requested サイズを 4 GiB に変更します。

検証

  • 仮想マシンで、利用可能な RAM を確認し、合計量にホットプラグされたメモリーが含まれているかを確認します。

    # free -h
    
            total    used    free   shared  buff/cache   available
    Mem:    31Gi     5.5Gi   14Gi   1.3Gi   11Gi         23Gi
    Swap:   8.0Gi    0B      8.0Gi
    # numactl -H
    
    available: 1 nodes (0)
    node 0 cpus: 0 1 2 3 4 5 6 7
    node 0 size: 29564 MB
    node 0 free: 13351 MB
    node distances:
    node   0
      0:  10
  • 実行中の仮想マシンの XML 設定を表示して、プラグイン RAM の現在の容量をホストで表示することもできます。

    # virsh dumpxml testguest1
    
    <domain type='kvm'>
      <name>testguest1</name>
      ...
      <currentMemory unit='GiB'>31</currentMemory>
      ...
      <memory model='virtio-mem'>
          <target>
            <size unit='GiB'>48</size>
            <node>0</node>
            <block unit='MiB'>2</block>
            <requested unit='GiB'>16</requested>
            <current unit='GiB'>16</current>
          </target>
          <alias name='ua-virtiomem0'/>
          <address type='pci' domain='0x0000' bus='0x08' slot='0x00' function='0x0'/>
      ...
    </domain>

    この例では、以下のように設定されています。

    • <currentMemory unit='GiB'>31</currentMemory> は、すべてのソースから VM で利用可能な合計 RAM を表します。
    • <current unit='GiB'>16</current> は、virtio-mem デバイスが提供するプラグイン RAM の現在のサイズを表します。

17.4.4. 関連情報