トポロジが宣言されていない場合、仮想マシンに間違った数のvCPUが割り当てられるのはなぜですか?

トポロジが宣言されていない場合、仮想マシンに間違った数のvCPUが割り当てられるのはなぜですか?

私はXeon E5-2680v2 @ 2.8GHz CPU 2つを搭載したMPUシステムでkvmを実行しています。私の仮想マシンはすべてWindowsマシンであり、主にバージョン10です。 libvirtdはバージョン5ですが、以前のバージョンでも説明した問題がありました。

についてはCPUモード、仮想マシンがCPUの全機能セットを使用できるように、「ホストパススルー」構成を使用します。

<vcpu placement='static'>6</vcpu>
<cpu mode='host-passthrough' check='partial'/>

さて、これは私が少し迷子になった場所です。上記のように6つのvCPUでVMを構成し、トポロジを指定しないと仮定すると(有効なアプローチのようです)、Windows VMは合計2つのソケットと2つの仮想プロセッサにのみアクセスできると主張します。これは単に表示内容の問題ではなく、パフォーマンスに明確に反映されます。

トポロジを指定して上記の行を次のように変更すると、次のようになります。

<vcpu placement='static'>6</vcpu>
<cpu mode='host-passthrough' check='partial'>
   <topology sockets='1' cores='6' threads='1'/>
</cpu> 

これで、Windows VM は正しい vCPU 数を認識し、パフォーマンスが向上します。

ソケット、プロセッサ、およびスレッドの展開方法によってトポロジが異なる可能性があることを理解していますが、トポロジを指定しないと、正しい合計vCPUの数が仮想マシンに提供されないことが奇妙です。

今はうまく機能していることを嬉しく思いますが、この問題が存在する理由と問題を解決するための最善のアプローチを選択したかどうかをよりよく理解したいと思います。

答え1

ここで質問してから1年が経ちましたが、すでに答えを得た可能性があります。

libvirt自体のホームページでは確認された情報が見つかりませんが、オープンスタック Wikiそれは言う:

libvirtドライバは、すべてのvCPUをハイパースレッディングなしで1つのコアを持つ別々のソケットとして公開します。

libvirtプロジェクト自体でこれらの明確な説明を見るのは良いことですが、これは質問で言及した私の観察によって確認されているようです。もしそうなら、私のWindows 10 Pro VMが正しい数のvCPUを表示しない理由は明らかです。 Windows 10 Proは2つの物理ソケットに制限されています。このウィキペディア記事。 libvirtが6つのソケットを生成すると言っても構いません。そのうち、Windows 10 Proでは2つしか許可されていません。これは私が説明する動作を説明します。

関連情報