Wie viele CPUs sollten mit Hyperthreading verwendet werden?

22

Nehmen wir an, ich besitze eine Server-CPU mit 18 Kernen und aktivierter Hyperthreading-Funktion, was bedeutet, dass in htop 36 CPUs angezeigt werden.

Um die CPU voll auszunutzen und die Single-Thread-Leistung nicht zu beeinträchtigen, sollte ich anstreben, dass alle 36 "Kerne" zu 100% ausgeführt werden und die HT-Kerne nur weniger arbeiten und immer noch 100% melden, oder würde dies bedeuten, dass die "volle" Kerne werden bereits von der Aufgabe auf ihrem "HT-Kern" unterbrochen und erledigen so weniger Single-Thread-Arbeit?

Mir ist bewusst, dass es viele Variablen gibt, die die HT-Leistung beeinflussen. Ich möchte nur wissen, was CPU-Meter im Umgang mit HT bedeuten.

Tassadar
quelle
6
Hyperthreading gibt Ihnen nicht wirklich die doppelte CPU. Stellen Sie sich das eher so vor, als würde eine CPU zwei Programme einlesen, und wenn ein Programm im Begriff ist, etwas zu tun, das mehrere Zyklen in Anspruch nimmt, oder wenn es nicht alle Ressourcen (Addierer, Multiplikatoren, Lader usw.) verwendet, wechselt es zum anderes Programm, damit es sie verwenden kann. Wenn Sie also 100% über alle Threads hinweg sehen möchten, müssen kompatible Programme auf einem Core zufällig ausgeführt werden.
Simpleuser
4
Aufgrund dieses Designs eignet sich Hyperthreading gut für gemischte Workloads. Zum Beispiel ein Hypervisor, auf dem alle VMs unterschiedliche Dienste ausführen. In einem solchen Szenario ist es wahrscheinlich nicht einmal notwendig, zu testen. Für homogenere Workloads ist normalerweise ein Test erforderlich, um sicherzugehen.
Michael Hampton

Antworten:

14

Wenn der zweite virtuelle Kern einen Beitrag leisten darf, während der erste ansonsten hängen bleiben würde, ist dies besser als nicht , damit Sie (zumindest) ein wenig mehr Arbeit erledigen können.

Es stellt sich die Frage, wann zwei unterschiedliche Threads dazu führen, dass einer schlechter läuft. Die Verzweigungsvorhersage und Abhängigkeiten zwischen Befehlen ändern sich nicht. Jetzt auf Speicherzugriff warten ... die beiden Threads konkurrieren um den Speicherzugriff, sowohl in Bezug auf die Cache-Auslastung als auch in Bezug auf die Bandbreite.

Wenn auf einigen CPUs HT ausgeführt wird und auf anderen nicht, bedeutet dies auch, dass Sie dem einen oder anderen Typ bestimmte Threads zuweisen? Ich denke nicht: Ihre Programme werden ihre Threads auf zufälligen virtuellen Kernen ausführen. Wie hilft die Aufteilung der Konfiguration? Da jede CPU über einen eigenen Cache verfügt, hängt der einzige Einfluss von der Speicherbandbreite und der Belastung durch die Cache-Kohärenz ab.

Im Allgemeinen erreichen Sie einen Punkt, an dem es teurer ist, mehr zu tun, als einige CPU-Ausführungseinheiten im Leerlauf laufen zu lassen. Dies hängt nicht direkt von der Anzahl der Threads ab, sondern von was die Threads tun , und von der detaillierten Speicherarchitektur und den Leistungsnuancen der verschiedenen Komponenten.

Es gibt keine einfache Antwort. Selbst mit Blick auf ein bestimmtes Programm kann sich die Maschine von derjenigen von Personen unterscheiden, die über ihre eigenen Erfahrungen berichten.

Sie müssen es selbst ausprobieren und messen was am schnellsten ist, mit dieser spezifischen Arbeit an genau dieser Maschine. Und selbst dann kann es sich mit Software-Updates und Nutzungsänderungen im Laufe der Zeit ändern.

Schauen Sie sich Band 3 von Angers Magnum Opus an . Wenn Sie sich einen bestimmten Prozessor genau ansehen, finden Sie begrenzende Ressourcen in der umfangreichen Pipeline vieler Schritte, die zum Ausführen von Code erforderlich sind. Sie müssen einen Fall finden, in dem Überbeanspruchung dazu führt, dass sie langsamer ausgeführt wird, als dass keine weitere Arbeit aufgenommen wird. Im Allgemeinen würde dies eine Art Caching bedeuten; und wo die Ressource zwischen Threads geteilt wird.


Was bedeutet die CPU-Anzeige: Sie zeigt alle Zeiten an, die nicht für die Ausführung des inaktiven Threads aufgewendet wurden. Beide logischen Threads, die einem Core zugewiesen sind, sind nicht inaktiv, obwohl die tatsächliche Arbeit an einem von ihnen möglicherweise gering ist. Die Zeit, die mit der Pipeline verbracht wird, steckt für einige Zyklen fest, bis die Ergebnisse fertig sind, der Speicher abgerufen wird, atomare Operationen eingezäunt sind usw. und die Zeit zeigt sich immer noch als in Benutzung. Warten auf RAM wird nicht als Leerlauf angezeigt. Nur so etwas wie I / O blockiert den Thread und stoppt die Ladezeit. Ein Betriebssystem-Mutex im Allgemeinen wird dies tun, aber mit dem Aufkommen von Multicore-Systemen ist dies keine sichere Sache mehr, da ein "Spinlock" den Thread nicht dazu bringt , wieder im Regal zu landen.

Eine CPU-Anzeige von 100% bedeutet also nicht, dass alles reibungslos läuft, wenn die CPU häufig auf Speicher wartet. Eine geringere Anzahl von logischen Kernen 90% zeigen , könnte sehr wohl mehr Arbeit bekommen, wie es endet die Zahl Knirschen und ist nun auf der Festplatte zu warten.

Sorgen Sie sich also nicht um die CPU-Anzeige. Blick auf tatsächliche Fortschritte gemacht, nur .

JDługosz
quelle
23

CPU-Anzeigen sind sehr schlecht, um Ihnen zu sagen, wie viel mehr Leistung Sie aus Ihren Hyperthread-CPUs herausholen können. Dazu sollten Sie Ihre eigenen Benchmarks mit verschiedenen physischen Core-Überzeichnungsraten ausführen. Es gibt einige Workloads, die am besten funktionieren, wenn HT vollständig deaktiviert ist. Nehmen Sie diesen Fall daher auch in Ihre Tests auf. Es könnte ein 1: 2 (36 parallele Arbeiter) oder 1: 1,5 oder sogar 1: 2,5 sein! Das hängt von Ihrer Arbeitsbelastung ab.

Im Einzelnen wird HT auf dem Silizium so implementiert, dass der Prozessor weniger Zeit im Leerlauf verbringt, wenn ein Kontext umgeschaltet werden muss oder eine Verzweigungsvorhersage fehlschlägt. Dies macht es einfacher, eine 100% ige Auslastung der Ausführungseinheit zu erreichen als mit reinen Tricks des Betriebssystems. HT hat sich seit seiner Einführung weiterentwickelt und es gibt mehr Parallelität bei modernen Chips als bei denen, die wir vor 10 Jahren verwendet haben.

Es gibt zwei Ausführungsprofile, die sich darauf auswirken, wo sich Ihr optimaler Überzeichnungspunkt befindet:

  • Lange Ausführungsdauer . Wenn Ihre Mitarbeiter vor dem Recycling einige Minuten oder Stunden ausgeführt werden, z. B. umfangreiche Renderaufträge oder Modellierung der Umgebung, wird die Leistung der einzelnen Kerne pro Mitarbeiter effizienter. Dies senkt Ihr Verhältnis.
  • Kurze Ausführungsdauer . Wenn Ihre Mitarbeiter in Sekunden oder kleinen Minuten zyklisch arbeiten, z. B. Web-App-Threads, bedeutet der mit dem Einschalten eines neuen Prozesses verbundene Mehraufwand, dass Ihr Verhältnis höher ist.
sysadmin1138
quelle
Kleine Minuten? Du meinst, ein paar Minuten?
Ismael Miguel
Ziemlich viel. 1 bis 5 oder so. Bei 120 Sekunden pro Arbeiter und 18 Arbeitern drehen Sie alle sieben Sekunden einen neuen um. Ein Großteil davon hängt von der Cache-Lokalität ab.
sysadmin1138
1
Du hast es nicht verstanden. Du sagst "kleine Minuten" zu deinem 2. Punkt. Minuten haben immer dieselbe "Größe", dh 60 Sekunden. Manchmal 61 Sekunden.
Ismael Miguel
4

Sie sollten sehen, dass alle 36 Kerne zu 100% ausgeführt werden - vorausgesetzt, die Software kann dies (was nicht trivial ist - die Planung kann bei so vielen Kernen schwierig sein, so dass Einbrüche unter 100% akzeptabel sind).

Wenn Sie ein Erz mit Hyperthreading "spalten", sind diese 200% nicht "2x100% - in erledigter Arbeit. Dies ist jedoch für jede durchgeführte Messung (die aus der CPU-Auslastung stammt und kein Konzept für erledigte Arbeit hat) unsichtbar. Wie viel Arbeit dabei geleistet wird, hängt davon ab, um was es sich handelt - irgendwo über dem 1,5-fachen ist die meiste Zeit mit der Arbeit ohne Hyper-Threading zu rechnen.

TomTom
quelle
3

Die Art und Weise, wie Hyperthreading implementiert wird, hängt vom jeweiligen CPU-Uarch ab. Von Nehalem bis Skylake reduzierte Intel die gemeinsam genutzten Teile der Pipeline mit festem Verhältnis (dh: 50/50) erheblich und ging zu gemeinsam genutzten Strukturen über.

Im Allgemeinen führte die Aktivierung von HT zu einer etwas langsameren Single-Thread-Ausführung. Aufgrund der Funktionsweise des Linux-Schedulers tritt dies jedoch nur auf, wenn die Anzahl der ausgeführten Threads höher ist als die Anzahl der physischen Kerne. Da Sie in solchen Situationen (wenn Threads> Kerne) normalerweise den Gesamtdurchsatz von maximaler Wichtigkeit schätzen, bleibt Hyperthreading ein Nettogewinn.

Wie ist das möglich? Der Schlüssel zum Verständnis ist, dass die CPU die physischen und virtuellen Kerne nicht als gleiche Kerne darstellt, sondern diese auf eine Weise verfügbar macht, die der Linux-Scheduler vermeiden kann, wenn andere physische Kerne verfügbar sind. Mit anderen Worten, es werden zuerst alle physischen Kerne verwendet, dann wird der virtuelle verwendet.

Dies bedeutet, dass HyperThreading im Allgemeinen eine sehr wertvolle Funktion ist (andere Prozessoren, wie Power8, verwenden noch tiefere SMT-Techniken). Um den Durchsatz zu maximieren, sollten Sie es aktivieren und die CPU mit mindestens einem Thread pro virtuellem oder physischem Kern laden. Für ein praktisches Beispiel sollten Sie mindestens 36 Threads verwenden, um die volle Leistung einer 18-Kern-CPU zu erzielen.

Es gibt zwei Ausnahmen:

  1. Wenn Sie lediglich die Latenzzeit für eine begrenzte Anzahl von Threads minimieren möchten (wobei Threads <physische Kerne sind), können Sie HT deaktivieren
  2. Sehr alte CPUs (Pentium4 und in viel geringerem Maße Nehalem) haben unflexible Partitionsregeln, die die CPU zwingen, viele Schlüsselressourcen unabhängig vom Status / der Last des zweiten Threads im Verhältnis 50/50 aufzuteilen. In diesem Fall mussten Sie Ihren Anwendungsfall einem Benchmark unterziehen, um sicherzustellen, dass der zusätzliche Durchsatz die deutlich geringere Leistung eines einzelnen Threads wert ist.
Shodanshok
quelle