仮想化CPUコアとスレッド


8

ハイパースレッディングを備えた新しいクアッドコアXeon CPUを搭載したUbuntu 9.10にKVMホストシステムがあります。Intelの製品ページで詳しく説明されているように、プロセッサには4つのコアがありますが、8つのスレッドがあります。/ proc / cpuinfoとhtopはどちらも8つのプロセッサをリストしていますが、それぞれがcpuinfoで4つのコアを示しています。KVM / QEMUは、ゲストに割り当てるために使用可能な8つのVCPUも報告します。

私の質問は、VCPUをVMゲストに割り当てるとき、コアごとまたはスレッドごとに割り当てる必要があるかどうかです。KVM / QEMUはサーバーに割り当てるVCPUが8つあることを報告しているので、以前に2を使用するように設定したはずの4つのCPUを使用するようにゲストを設定する必要がありますか?過剰に割り当てずにホストハードウェアを最大限に活用したいのですが。

更新: Chopper3の答えは間違いなく正しいアプローチです。ただし、スレッドとコアのパフォーマンスの側面を解明できるハードウェアの専門家からの連絡をお待ちしています...誰か?

回答:


8

サーバーが機能を実行するために必要なvCPUの最小数を設定します。それらを過剰に割り当てないでください。VMの速度が低下します。


1
これは賢いアプローチのようです。それでも、コアごとではなくスレッドごとにVCPUを割り当てると、パフォーマンスにどのように影響するのか興味があります。しかし、割り当て超過によって発生する可能性のある非常に悪いことをいくつか見てきました。ハイパースレッド化されていないホストと同じ数のVCPUを使用すると、ゲストの負荷を適切に処理しているようですので、そのままにしておきますいつか非生産ボックスで実験する予定です。
nedm 2010

1
+1、答えはワークロードにも依存します。CPUに強くバインドされているVMの場合は、コア全体を使用していると見なし、アイドルまたはIOバインドされているVMは、スレッドを使用していると見なします。ただし、一般的には、常にできるだけ少ない量を割り当てれば、大きな頭痛の種を回避できます。
クリスS

1
私は最小限のアプローチに同意しますが、この意味でKVMはVMWareではありません。ギャングスケジューリングがないということは、VMあたりのvCPUを無害に使用できることを意味します
dyasny 2012

5

通常、HTはIOの負荷が高いワークロードで適切に機能します。CPUは、最初の仮想CPUがIOで待機している間に、他の仮想CPUのキューからより多くの処理タスクをスケジュールできます。本当にすべてのHTサブシステムがハードウェアアクセラレーションによるコンテキストスイッチングを実現します。これは、VMを切り替えるときにも使用されるワークロードパターンです。そのため、各VMが1つの仮想コアを取得する場合、HTは(通常)コアよりもVMの数が多い場合にスローダウンを少し減らします。

VMに複数のvCPUを割り当てると、VM内のアプリがスレッド化向けに記述されている場合、パフォーマンスが向上しますが、ハイパーバイザーの運用が難しくなります。一度に2つまたは4つのCPUに時間を割り当てる必要があるため、クアッドコアCPUとクアッドvCPU VMがある場合、そのタイムスライス中にスケジュールできるVMは1つだけです(4つの異なるシングルvCPU VMを実行できます)。すぐに)。


@ Chris、@ techieb0y:ありがとう、これはまさに私が探していた洞察の一種です。
nedm 2010

これは正確には当てはまりません。クワッドvCPUを備えたVMが単一のvコアをスケジュールする必要がある場合、これは4つのコアすべてではなく、ホストでスケジュールされます。少なくともこれはKVMの場合です(ギャングスケジューリングを行うため、VMwareのアプローチは効果が低いことを知っています)
dyasny

5

これはかなりトリッキーです。負荷に応じて、HTはパフォーマンスを最大30%向上または低下させる可能性があります。通常、物理コアよりも多くのvCPUを単一のVMに割り当てないことをお勧めしますが、VMがかなりアイドル状態の場合(もちろん、そのようなVMは実際にはあまり多くのCPUを必要としません)、次のように指定できます。スレッドの数に応じて多くのvCPU。単一のVMに、スケジュール可能なコアよりも多くのvCPUを与えたくないのは、私が得ていることです。いずれにしても、@ Chopper3のアドバイスは正しいです。VMに絶対に必要な数より多くのv-CPUを与えないでください。

そのため、VMの負荷と重要度に応じて、全割り当てを行わないか、物理コア数に固執するか、VMあたりのスレッド数と同じくらい多くします。

さて、HTの問題に入ると、特に物理コアやスレッドよりも多くのvCPUをVMにコミットする場合、LinuxスケジューラがそれらのvCPUを簡単にスケジュールできるようになるため、これは一般的に良いことです。

最後に、kvmでVMに割り当てられたvCPUは、Linuxスケジューラによってスケジュールされたホスト上のプロセスにすぎないため、ここで実行できるすべての通常の最適化を簡単に適用できます。さらに、cores / sockets設定は、このプロセスがVMのゲストOSに対して表示される方法であり、ホスト上では、VMがそれをどのように認識しているかにかかわらず、それは単なるプロセスです。


2

Chopper3の答えについて詳しく説明すると思います。システムが主にcpu-idleの場合は、大量のvcpuを割り当てないでください。cpuが多すぎる場合は、割り当てすぎないように十分注意してください。競合することなく合計8個のvCPUを割り当てることができるはずです。割り当て超過は可能ですが、行う場合は、単一のゲスト、特にCPUを集中的に使用するゲストに8つのvcpuがないことを確認してください。そうしないと、競合が発生します。KVMスケジューラのメカニズムがそれより具体的であるかどうかはわかりません。

上記は、vCPUと固定されたCPUの以下の理解に基づいていますが、十分なスレッドを割り当てると、KVMによって単一のゲスト(または複数のゲスト)が他のユーザーから実際のすべてのCPUを占有できるようになるという仮定にも基づいています。vCPU〜ホストスレッド、ゲストCPU CPU =ホストコア、ゲストCPU(ハイパースレッディングがないため、同じゲスト上でvCPUと固定CPUを混在させてプレイしたことはありません。)


1
ピン留めされたvCPUは、特定のコア(またはコアのサブセット)でのみ実行するように割り当てられた単なる仮想CPUプロセスです。全体的な割り当てを行わず、VMが同じコアのCPU時間で競合していないことを確認する場合は、それらを異なるコアに固定できます。これは、NUMAの固定を行う方法でもありますが、最近は直接行うこともできます
dyasny
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.