15.16.3. ホスト物理マシンのプールに適合する互換性のある CPU モデルの決定

1 つのホスト物理マシンが持つ CPU 機能を認識することができるようになったら、次のステップは、そのゲスト仮想マシンに公開するにはどの CPU 機能が最適であるかを決定することです。ゲスト仮想マシンが別のホスト物理マシンに決して移行する必要がないことが判明している場合は、そのホスト物理マシンの CPU モデルは修正なしでストレートに通過できます。一部の仮想化データセンターには、すべてのサーバーが 100% 同一の CPU を保持していることを保証する設定セットが含まれる場合があります。そのような場合も、ホスト物理マシンの CPU モデルは修正なしでストレートに通過できます。しかし、さらに一般的なケースでは、ホスト物理マシン間に CPU のバリエーションが存在するものです。このような混合の CPU 環境では、妥協できる共通の CPU を決定する必要があります。これは単純な手順ではないため、libvirt はこのタスクに適格な API を提供します。libvirt が、それぞれホスト物理マシン用の CPU モデルを記述している XML 文書の一覧を受け取ると、libvirt は内部でこれらを CPUID マスクに変換し、それらの接点を算出して、CPUID マスクの結果を XML CPU 記述に変換し直します。
以下は、virsh capabilities が実行される際に、libvirt が基本ワークステーションの機能として報告する内容についての例です。

<capabilities>
  <host>
    <cpu>
      <arch>i686</arch>
      <model>pentium3</model>
      <topology sockets='1' cores='2' threads='1'/>
      <feature name='lahf_lm'/>
      <feature name='lm'/>
      <feature name='xtpr'/>
      <feature name='cx16'/>
      <feature name='ssse3'/>
      <feature name='tm2'/>
      <feature name='est'/>
      <feature name='vmx'/>
      <feature name='ds_cpl'/>
      <feature name='monitor'/>
      <feature name='pni'/>
      <feature name='pbe'/>
      <feature name='tm'/>
      <feature name='ht'/>
      <feature name='ss'/>
      <feature name='sse2'/>
      <feature name='acpi'/>
      <feature name='ds'/>
      <feature name='clflush'/>
      <feature name='apic'/>
    </cpu>
 </host>
</capabilities>

図15.3 ホスト物理マシンの CPU モデル情報のプル

ここで、同じ virsh capabilities コマンドを使い、これをランダムなサーバーと比較します。

<capabilities>
  <host>
    <cpu>
      <arch>x86_64</arch>
      <model>phenom</model>
      <topology sockets='2' cores='4' threads='1'/>
      <feature name='osvw'/>
      <feature name='3dnowprefetch'/>
      <feature name='misalignsse'/>
      <feature name='sse4a'/>
      <feature name='abm'/>
      <feature name='cr8legacy'/>
      <feature name='extapic'/>
      <feature name='cmp_legacy'/>
      <feature name='lahf_lm'/>
      <feature name='rdtscp'/>
      <feature name='pdpe1gb'/>
      <feature name='popcnt'/>
      <feature name='cx16'/>
      <feature name='ht'/>
      <feature name='vme'/>
    </cpu>
    ...snip...

図15.4 ランダムサーバーから CPU 記述を生成する

この CPU 記述に直前のワークステーションの CPU 記述との互換性があるかを判別するには、virsh cpu-compare コマンドを使用します。
この削減したコンテンツは、virsh-caps-workstation-cpu-only.xml という名前のファイル内に格納されて、このファイルに virsh cpu-compare コマンドを実行することができます。
# virsh cpu-compare virsh-caps-workstation-cpu-only.xml
Host physical machine CPU is a superset of CPU described in virsh-caps-workstation-cpu-only.xml
以上の出力で見えるように、サーバー CPU 内のいくつかの機能がクライアント CPU 内で欠如しているため、libvirt は、CPU が厳密には互換性を持たないことを正しく報告しています。クライアントとサーバー間で移行を可能にするには、XML ファイルを開いていくつかの機能をコメントアウトする必要があります。どの機能を削除するかを決定するには、両方のマシンの CPU 情報が含まれる both-cpus.xmlvirsh cpu-baseline コマンドを実行します。 # virsh cpu-baseline both-cpus.xml を実行すると、次のような結果になります。

<cpu match='exact'>
  <model>pentium3</model>
  <feature policy='require' name='lahf_lm'/>
  <feature policy='require' name='lm'/>
  <feature policy='require' name='cx16'/>
  <feature policy='require' name='monitor'/>
  <feature policy='require' name='pni'/>
  <feature policy='require' name='ht'/>
  <feature policy='require' name='sse2'/>
  <feature policy='require' name='clflush'/>
  <feature policy='require' name='apic'/>
</cpu>

図15.5 複合 CPU ベースライン

この複合ファイルは、共通の要素を示します。共通でない要素はすべてコメントアウトされます。