Virtualisierte CPU-Kerne vs. Threads

8

Wir haben ein KVM-Hostsystem unter Ubuntu 9.10 mit einer neueren Quad-Core-Xeon-CPU mit Hyperthreading. Wie auf der Intel-Produktseite beschrieben , verfügt der Prozessor über 4 Kerne, aber 8 Threads. / proc / cpuinfo und htop listen beide 8 Prozessoren auf, obwohl jeder 4 Kerne in cpuinfo angibt. KVM / QEMU meldet außerdem 8 VCPUs, die Gästen zugewiesen werden können.

Meine Frage ist, wenn ich VM-Gästen VCPUs zuordne, sollte ich sie pro Kern oder pro Thread zuweisen? Da KVM / QEMU meldet, dass der Server 8 VCPUs zuzuweisen hat, sollte ich einen Gast so einstellen, dass er 4 CPUs verwendet, wo ich ihn zuvor auf 2 eingestellt hätte (unter der Annahme, dass insgesamt 4 VCPUs verfügbar sind)? Ich möchte das Beste aus der Host-Hardware herausholen, ohne zu viel zuzuweisen.

Update: Die Antwort von Chopper3 ist zweifellos der richtige Ansatz. Ich würde jedoch immer noch gerne von Hardware-Experten hören, die die Leistungsaspekte von Threads und Kernen erläutern könnten ... irgendjemand?

nedm
quelle

Antworten:

8

Stellen Sie die niedrigste Anzahl von vCPUs ein, die Ihre Server benötigen, um ihre Funktion auszuführen. Weisen Sie sie nicht zu stark zu, da Sie sonst Ihre VMs leicht verlangsamen können.

Chopper3
quelle
1
Dies scheint ein weiser Ansatz zu sein. Trotzdem bin ich gespannt, wie sich die Zuweisung von VCPUs pro Thread und nicht pro Kern auf die Leistung auswirkt. Aber ich habe einige der sehr schlechten Dinge gesehen, die durch Überzuweisung passieren können, und die Verwendung der gleichen Anzahl von VCPUs wie bei einem Host ohne Hyperthread scheint die Last für die Gäste angemessen zu handhaben, sodass ich gut genug in Ruhe lasse und planen, irgendwann an einer nicht produktiven Box zu experimentieren.
Nedm
1
+1, Die Antwort hängt auch von Ihrer Arbeitsbelastung ab. Zählen Sie VMs mit starker CPU-Bindung als einen ganzen Kern, VMs mit Leerlauf oder E / A als Thread. Aber im Allgemeinen sollten Sie immer so wenig wie möglich zuweisen, um große Kopfschmerzen zu vermeiden.
Chris S
1
Obwohl ich dem minimalistischen Ansatz zustimme, ist KVM in diesem Sinne keine VMWare. Keine Gangplanung bedeutet, dass mehr vCPUs pro VM harmlos verwendet werden können
dyasny
5

In der Regel funktioniert HT gut bei Workloads mit höherem E / A-Aufwand. Die CPU kann mehr Verarbeitungsaufgaben aus der Warteschlange der anderen virtuellen CPU planen, während die erste virtuelle CPU auf dem E / A wartet. Wirklich alle HT-Subsysteme bieten Ihnen eine hardwarebeschleunigte Kontextumschaltung - das Workload-Muster, das auch beim Umschalten zwischen VMs verwendet wird. Daher reduziert HT (normalerweise) die Verlangsamung ein wenig, wenn Sie mehr VMs als Kerne haben, vorausgesetzt, jede VM erhält einen virtuellen Kern.

Das Zuweisen mehrerer vCPUs zu einer VM kann die Leistung verbessern, wenn die Apps in der VM für das Threading geschrieben sind. Dies erschwert jedoch auch dem Hypervisor das Leben. Es muss Zeit auf 2 oder 4 CPUs gleichzeitig zugewiesen werden. Wenn Sie also eine Quad-Core-CPU und eine Quad-vCPU-VM haben, kann während dieser Zeitscheibe nur eine VM geplant werden (während 4 verschiedene Single-vCPU-VMs ausgeführt werden können auf einmal).

techieb0y
quelle
@ Chris, @ techieb0y: Danke, das ist genau die Art von Einsicht, nach der ich gesucht habe.
Nedm
Das ist nicht genau richtig. Wenn eine VM mit vier vCPUs einen einzelnen v-Core planen muss, wird dies auf dem Host geplant, nicht auf allen 4 Kernen. Zumindest ist dies bei KVM der Fall (ich weiß, dass der Ansatz von vmware weniger effektiv ist, da sie Gangscheduling durchführen)
dyasny
5

Das ist ziemlich schwierig. Abhängig von den Lasten kann HT die Leistung um ~ 30% steigern oder verringern. Normalerweise rate ich, einer einzelnen VM nicht mehr vCPUs zuzuweisen, als Sie physische Kerne haben. Wenn die VM jedoch eher inaktiv ist (und eine solche VM natürlich nicht wirklich zu viele CPUs benötigt), kann sie bis zu as angegeben werden viele vCPUs, da Sie Threads haben. Sie möchten einer einzelnen VM nicht wirklich mehr vCPUs geben, als Sie planbare Kerne haben . In jedem Fall ist der Rat von @ Chopper3 richtig - geben Sie der VM nicht mehr v-CPUs, als unbedingt erforderlich ist.

Abhängig davon, wie ausgelastet und kritisch Ihre VMs sind, ordnen Sie sie entweder überhaupt nicht zu, halten sich an die Anzahl der physischen Kerne oder gehen so hoch wie die Anzahl der Threads pro VM.

Wenn Sie sich nun mit der Frage von HT befassen, ist dies im Allgemeinen eine gute Sache, insbesondere wenn Sie mehr vCPUs auf Ihre VMs übertragen als physische Kerne oder sogar Threads, da dies dem Linux-Scheduler das Planen dieser vCPUs erleichtert.

Eine letzte Sache: Mit kvm ist eine einer VM zugewiesene vCPU nur ein Prozess auf dem Host, der vom Linux-Scheduler geplant wird, sodass alle normalen Optimierungen, die Sie hier vornehmen können, problemlos angewendet werden können. Darüber hinaus ist die Einstellung für Kerne / Sockets genau die Art und Weise, wie dieser Prozess für das Gastbetriebssystem der VM angezeigt wird. Auf dem Host ist dies immer noch nur ein Prozess, unabhängig davon, wie die VM ihn sieht.

dyasny
quelle
2

Ich denke, um die Antwort von Chopper3 näher zu erläutern: Wenn die Systeme größtenteils im CPU-Leerlauf sind, weisen Sie keine CPU-CPU zu. Wenn sie CPU-intensiv sind, achten Sie sehr darauf, dass sie nicht insgesamt zugeordnet werden. Sie sollten in der Lage sein, insgesamt 8 vCPU ohne Konkurrenz zuzuweisen. Sie können eine Gesamtzuordnung vornehmen. Wenn Sie dies jedoch tun, stellen Sie sicher, dass kein einzelner Gast, insbesondere kein CPU-intensiver Gast, über 8 VCPU verfügt. Andernfalls treten Konflikte auf. Ich weiß nicht, ob der KVM-Scheduler-Mechanismus genauer ist.

Das Obige basiert auf dem folgenden Verständnis von vCPU im Vergleich zu fixierter CPU, aber auch auf der Annahme, dass KVM es einem einzelnen Gast (oder mehreren Gästen) ermöglicht, die gesamte tatsächliche CPU von anderen zu trennen, wenn Sie ihm (/ ihnen) genügend Threads zuweisen. vCPU ~ Host-Thread, Gast-CPU-CPU = Host-Kern, Gast-CPU (Habe nicht mit gemischter vCPU und angehefteter CPU auf demselben Gast gespielt, da ich kein Hyperthreading habe.)

Nakarti
quelle
1
Die angeheftete vCPU ist nur ein virtueller CPU-Prozess, der nur auf einem bestimmten Kern (oder einer Teilmenge von Kernen) ausgeführt werden kann. Wenn Sie nicht insgesamt zuordnen und sicherstellen möchten, dass die VMs nicht um die CPU-Zeit desselben Kerns kämpfen, können Sie sie an verschiedene Kerne anheften. Dies ist auch eine Möglichkeit, NUMA-Pinning
durchzuführen