23.12. CPU モデルおよびトポロジー

このセクションでは、CPU モデルの要件について扱います。すべてのハイパーバイザーには、ゲストがデフォルトで表示する CPU 機能についての独自のポリシーがあることに注意してください。KVM によってゲストに提供される CPU 機能のセットは、ゲスト仮想マシン設定で選択される CPU モデルによって異なります。qemu32 および qemu64 は基本的な CPU モデルですが、他に利用できる他のモデル (追加の機能を含む) もあります。それぞれのモデルとそのトポロジーは、ドメイン XML の次の要素を使って指定されます。
<cpu match='exact'>
    <model fallback='allow'>core2duo</model>
    <vendor>Intel</vendor>
    <topology sockets='1' cores='2' threads='1'/>
    <feature policy='disable' name='lahf_lm'/>
</cpu>

図23.14 CPU モデルおよびトポロジーサンプル 1

<cpu mode='host-model'>
   <model fallback='forbid'/>
   <topology sockets='1' cores='2' threads='1'/>
</cpu>

図23.15 CPU モデルおよびトポロジーサンプル 2

<cpu mode='host-passthrough'/>

図23.16 CPU モデルおよびトポロジーサンプル 3

CPU モデルまたはその機能への制限が設けられていない場合、以下のような単純な <cpu> 要素が使用される場合があります。
<cpu>
   <topology sockets='1' cores='2' threads='1'/>
</cpu>

図23.17 CPU モデルおよびトポロジーサンプル 4

<cpu mode='custom'>
   <model>POWER8</model>
</cpu>

図23.18 PPC64/PSeries CPU モデルサンプル

<cpu mode='host-passthrough'/>

図23.19 aarch64/virt CPU モデルサンプル

ドメイン XML のこのセクションを構成するコンポーネントは以下の通りです。

表23.8 CPU モデルおよびトポロジー要素

要素説明
<cpu>これは、ゲスト仮想マシンの CPU 要件について説明するための主なコンテナーです。
<match>ゲスト仮想マシンに提供される仮想 CPU がどのように要件と一致する必要があるかを指定します。トポロジーが <cpu> 内の唯一の要素である場合、match 属性を省略することができます。match 属性に使用できる値は、以下のとおりです。
  • minimum: 指定した CPU モデルと機能は、必要最小限の CPU を記述します。
  • exact: ゲスト仮想マシンに提供される仮想 CPU は仕様に完全に一致します。
  • strict: ホスト物理マシンの CPU が仕様に完全一致しないと、ゲスト仮想マシンは作成されません。
match 属性は省略することができ、その場合のデフォルトは exact になります。
<mode>このオプションの属性は、ゲスト仮想マシン CPU をできるだけホスト物理マシン CPU に近づけるように設定しやすくするように使用できます。mode 属性に使用できる属性は以下になります。
  • custom: CPU をゲスト仮想マシンに表示する方法を説明します。これは、mode 属性が指定されない場合のデフォルト設定です。このモードは、永続的なゲスト仮想マシンがどのホスト物理マシン上で起動されても、同じハードウェアを認識できるようにします。
  • host-model: capabilities XML からドメイン XML にホスト物理マシンの CPU 定義をコピーするためのショートカットです。ドメインを起動する直前に CPU 定義がコピーされるので、同じ XML を異なる複数のホスト物理マシン上で使用することができます。その間、それぞれのホスト物理マシンがサポートする最適なゲスト仮想マシン CPU は依然として提供されます。match 属性も、いずれの機能要素もこのモードでは使用できません。詳細は、libvirt アップストリームの web サイト を参照してください。
  • host-passthrough: このモードでは、ゲスト仮想マシンに表示される CPU は、libvirt 内でエラーを生じさせる要素を含め、ホスト物理マシン CPU の場合と全く同じになります。このモードの大きな短所は、ゲスト仮想マシン環境を異なるハードウェア上で再現できないことにあり、そのためこのモードは細心の注意を払って使用することが推奨されます。model および feature 要素はこのモードでは許可されません。
<model>ゲスト仮想マシンが要求する CPU モデルを指定します。利用可能な CPU モデルとそれらの定義の一覧は、libvirt のデータディレクトリーにインストールされた cpu_map.xml ファイルにあります。ハイパーバイザーが指定の CPU モデルを使用できない場合、libvirt は、CPU 機能の一覧を維持しつつ、ハイパーバイザーでサポートされる直近のモデルにフォールバックします。オプションの fallback 属性は、この動作を禁止するために使用できます。この場合、サポートされていない CPU モデルを要求するドメインの起動は失敗します。fallback 属性のサポートされている値は、allow (デフォルト) と forbid です。オプションの vendor_id 属性は、ゲスト仮想マシンによって認識されるベンダー ID を設定するために使用できます。ID は 12 文字である必要があります。これが設定されていない場合、ホスト物理マシンのベンダー ID が使用されます。通常、可能な値は AuthenticAMDGenuineIntel です。
<vendor>ゲスト仮想マシンによって要求される CPU ベンダーを指定します。この要素がない場合、ゲスト仮想マシンは、ベンダーに関係なく、指定の機能に一致する CPU 上で実行されます。サポートされるベンダーの一覧は cpu_map.xml にあります。
<topology>ゲスト仮想マシンに提供される仮想 CPU の要求されるトポロジーを指定します。3 つのゼロ以外の値を、ソケット、コアおよびスレッドに指定する必要があります。それぞれは、CPU ソケットの合計数、1 ソケットあたりのコア数、1 コアあたりのスレッド数になります。
<feature>選択した CPU モデルによって提供される機能を微調整するために使用されるゼロまたは 1 つ以上の要素を含めることができます。既知の機能名の一覧は、cpu_map.xml ファイルにあります。それぞれの feature 要素の意味は、以下の値のいずれかに設定する必要のあるそのポリシー属性によって変わります。
  • force: 仮想マシンがホスト物理マシン CPU によって実際にサポートされているかどうかにかかわらず、仮想マシンのサポートを強制します。
  • require: 機能がホスト物理マシンによってサポートされていない場合、ゲスト仮想マシンの作成が失敗するように指定します。これはデフォルトの設定です。
  • optional: この機能は仮想 CPU によってサポートされますが、サポートされるのはホスト物理マシン CPU によってサポートされている場合のみです。
  • disable: これは仮想 CPU によってサポートされていません。
  • forbid: 機能がホスト物理マシン CPU によってサポートされている場合、ゲスト仮想マシンの作成は失敗します。

23.12.1. 指定 CPU に設定された機能の変更

CPU モデルには継承された機能セットがありますが、個別の機能コンポーネントは機能ごとに機能上で許可するか、または禁止することができます。これにより、CPU のさらに個別化された設定が可能になります。

手順23.1 CPU 機能の有効化および無効化

  1. まず、ゲスト仮想マシンをシャットダウンします。
  2. virsh edit [domain] コマンドを実行して、ゲスト仮想マシンの設定ファイルを開きます。
  3. <feature> または <model> 内のパラメーターを変更し、属性値 'allow' を含めて機能を強制的に許可するか、'forbid' を含めて機能のサポートを拒否します。
    		      
    <!-- original feature set -->
    <cpu mode='host-model'>
       <model fallback='allow'/>
       <topology sockets='1' cores='2' threads='1'/>
    </cpu>
    
    <!--changed feature set-->
    <cpu mode='host-model'>
       <model fallback='forbid'/>
       <topology sockets='1' cores='2' threads='1'/>
    </cpu>
    		      

    図23.20 CPU 機能の有効化および無効化の例

    		         
    <!--original feature set-->
    <cpu match='exact'>
        <model fallback='allow'>core2duo</model>
        <vendor>Intel</vendor>
        <topology sockets='1' cores='2' threads='1'/>
        <feature policy='disable' name='lahf_lm'/>
    </cpu>
    
    <!--changed feature set-->
    <cpu match='exact'>
        <model fallback='allow'>core2duo</model>
        <vendor>Intel</vendor>
        <topology sockets='1' cores='2' threads='1'/>
        <feature policy='enable' name='lahf_lm'/>
      </cpu>
    		         

    図23.21 CPU 機能の有効化および無効化の例 2

  4. 変更が完了したら、設定ファイルを保存して、ゲスト仮想マシンを再起動します。

23.12.2. ゲスト仮想マシンの NUMA トポロジー

ゲスト仮想マシンの NUMA トポロジーは、ドメイン XML の <numa> 要素を使用して指定できます。

  <cpu>
    <numa>
      <cell cpus='0-3' memory='512000'/>
      <cell cpus='4-7' memory='512000'/>
    </numa>
  </cpu>
  ...

図23.22 ゲスト仮想マシンの NUMA トポロジー

それぞれの cell 要素は NUMA セルまたは NUMA ノードを指定します。cpus は、ノードの一部である CPU または CPU の範囲を指定します。memory はノードメモリーをキビバイト単位 (1024 バイトのブロック) で指定します。それぞれのセルまたはノードには、0 から始まる昇順で cellid または nodeid が割り当てられます。