Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

20.11. CPU モデルとトポロジー

このセクションでは、CPU モデルの要件を説明します。すべてのハイパーバイザーには、ゲストにデフォルトで表示される CPU 機能に関する独自のポリシーがあることに注意してください。QEMU/KVM によりゲストに提示される CPU 機能のセットは、ゲスト仮想マシンの設定で選択された CPU モデルによって異なります。qemu32qemu64 は基本的な CPU モデルですが、他のモデル (追加機能付き) も利用できます。各モデルとそのトポロジーは、ドメイン XML の以下の要素を使用して指定されます。

図20.13 CPU モデルとトポロジーの例 1

<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>

図20.14 CPU モデルとトポロジーの例 2

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

図20.15 CPU モデルとトポロジーの例 3

<cpu mode='host-passthrough'/>
CPU モデルやその機能に制限を設けない場合は、以下のような簡単な cpu 要素を使用できます。

図20.16 CPU モデルとトポロジーの例 4

<cpu>
   <topology sockets='1' cores='2' threads='1'/>
</cpu>
ドメイン XML のこのセクションのコンポーネントは以下のとおりです。

表20.9 CPU モデルとトポロジー要素

要素説明
<cpu>この要素には、vCPU 機能セットのすべてのパラメーターが含まれています。
<match><cpu> 要素に示されている機能が、使用可能な vCPU とどの程度一致している必要があるかを指定します。<topology><cpu> 要素にネストされた唯一の要素である場合は、match 属性を省略できます。match 属性に使用できる値は、以下のとおりです。
  • minimum - リストされている機能は最小要件です。示されている vCPU で利用可能な機能が他にもある可能性がありますが、これは受け入れられる最小の機能です。最小要件が満たされていない場合、この値は失敗します。
  • exact - ゲスト仮想マシンに提供される仮想 CPU は、指定された機能と完全に一致する必要があります。一致するものが見つからない場合、エラーが発生します。
  • strict - ホストの物理マシンの CPU が仕様と完全に一致しない限り、ゲスト仮想マシンが作成されません。
match 属性が <cpu> 要素から省略されている場合、デフォルト設定の match='exact' が使用されます。
<mode>このオプション属性を使用すると、ゲスト仮想マシンの CPU を、ホストの物理マシンの CPU にできるだけ近づけるように設定できます。mode 属性に使用できる値は、以下のとおりです。
  • custom - CPU がゲスト仮想マシンにどのように表示されるかを説明します。mode 属性が指定されていない場合のデフォルト設定です。このモードでは、ゲスト仮想マシンを起動しているホストの物理マシンがどのホストの物理マシンであっても、永続ゲスト仮想マシンが同じハードウェアを認識できるようになります。
  • host-model - これは基本的に、ホスト物理マシンの CPU 定義を機能 XML からドメイン XML にコピーするためのショートカットです。CPU 定義はドメインの起動直前にコピーされるため、同じ XML を異なるホストの物理マシンで使用することも、各ホストの物理マシンがサポートする最適なゲスト仮想マシンの CPU を提供することもできます。このモードでは、match 属性も機能要素も使用できません。詳細については、libvirt ドメインの XML CPU モデルを参照してください。
  • host-passthrough このモードでは、ゲスト仮想マシンから見える CPU は、libvirt 内のエラーの原因となる要素を含め、ホストの物理マシン CPU とまったく同じです。このモードのデメリットは、ゲストの仮想マシン環境を異なるハードウェアで再生できないため、このモードを使用する場合は十分注意して行うことが推奨されます。このモードでは、model 要素も feature 要素も許可されていません。
  • host-model モードと host-passthrough モードの両方で、現在のホスト物理マシンで使用される実際の (ホストパススルーモードに近い) CPU 定義は、virDomainGetXMLDescAPI を呼び出すときに VIR_DOMAIN_XML_UPDATE_CPU フラグを指定することで決定できることに注意してください。異なるハードウェアが提示されたときにオペレーティングシステムが再アクティブ化される可能性があり、異なる機能を持つホスト物理マシン間で移行されるゲスト仮想マシンを実行している場合、この出力を使用して XML をカスタムモードに書き換え、より堅牢な移行を行うことができます。
<model>ゲスト仮想マシンが要求する CPU モデルを指定します。利用可能な CPU モデルとその定義の一覧は、libvirt の データディレクトリーにインストールされている cpu_map.xml ファイルを参照してください。ハイパーバイザーが、正確な CPU モデルを使用できない場合、libvirt は、CPU 機能の一覧を維持しながら、ハイパーバイザーが対応する最も近いモデルに自動的にフォールバックします。オプションの fallback 属性を使用すると、この動作を禁止できます。この場合、対応していない CPU モデルを要求するドメインを起動しようとすると失敗します。フォールバック属性で対応している値は、allow (デフォルト) と forbid です。オプションの vendor_id 属性を使用すると、ゲスト仮想マシンが認識するベンダー id を設定できます。ちょうど 12 文字の長さである必要があります。設定しない場合は、ホスト物理マシンのベンダー id が使用されます。一般的な値は、AuthenticAMD および GenuineIntel です。
<vendor>ゲスト仮想マシンが要求する CPU ベンダーを指定します。この要素がないと、ゲスト仮想マシンは、ベンダーに関係なく、指定された機能と一致する CPU で実行します。サポートされているベンダーの一覧は、cpu_map.xml を参照してください。
<topology>ゲスト仮想マシンに提供される仮想 CPU の要求されたトポロジーを指定します。ソケット、コア、およびスレッドには、それぞれゼロ以外の値を 3 つ指定する必要があります。つまり、CPU ソケットの合計数、ソケットごとのコア数、およびコアごとのスレッド数です。
<feature>選択した CPU モデルが提供する機能を微調整するために使用する、ゼロ以上の要素を含むことができます。既知の機能名のリストは、CPU モデルと同じファイルにあります。各機能要素の意味は、ポリシー属性により異なります。この属性は、次のいずれかの値に設定する必要があります。
  • force - 仮想マシンがホスト物理マシンの CPU で実際に対応しているかどうかに関係なく、仮想マシンを強制的に対応させます。
  • require - この機能がホストの物理マシンの CPU で対応していない場合は、ゲスト仮想マシンの作成に失敗することを指示します。これはデフォルト設定です。
  • optional - この機能は仮想 CPU で対応していますが、ホストの物理マシン CPU で対応している場合に限ります。
  • disable - これは仮想 CPU では対応していません。
  • forbid - この機能がホストの物理マシンの CPU でサポートされていると、ゲスト仮想マシンの作成に失敗します。

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

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

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


  <cpu>
    <numa>
      <cell cpus='0-3' memory='512000'/>
      <cell cpus='4-7' memory='512000'/>
    </numa>
  </cpu>
  ...
各セル要素は、NUMA セルまたは NUMA ノードを指定します。cpus は、ノードの一部である CPU または CPU の範囲を指定します。memory は、ノードメモリーを kibibytes (1024 バイトのブロック) で指定します。各セルまたはノードには、0 から始まる昇順で cellid または nodeid が割り当てられます。