Frage Wie viele CPUs sollten mit Hyperthreading verwendet werden?


Nehmen wir an, ich habe eine Server-CPU mit 18 Kernen, mit aktiviertem Hyperthreading, was bedeutet, dass ich 36 CPUs in htop sehen kann.

Um die CPU voll auszunutzen und die Leistung einzelner Threads nicht zu beeinträchtigen, sollte ich darauf achten, dass alle 36 "Kerne" bei 100% laufen, und die HT-Kerne werden nur weniger arbeiten und immer noch 100% melden, oder würde das bedeuten "Volle" Kerne werden durch die Aufgabe auf ihrem "HT-Kern" bereits unterbrochen und machen somit weniger single-threaded Arbeit?

Ich bin mir bewusst, dass es viele Variablen gibt, die die HT-Leistung beeinflussen, ich möchte nur wissen, welche CPU-Zähler im Umgang mit HT bedeuten.


21
2018-04-02 12:58


Ursprung


Hyperthreading gibt Ihnen nicht wirklich die doppelte CPU. Denken Sie eher daran, dass eine CPU zwei Programme liest, und wenn ein Programm etwas macht, das mehrere Zyklen benötigt, oder wenn es nicht alle Ressourcen (Addierer, Multiplikatoren, Lader usw.) verwendet, wechselt es zu anderes Programm, damit es sie benutzen kann. Also 100% über alle sehen Fäden erfordert ein glückliches Zusammentreffen kompatibler Programme, die auf einem Kern laufen. - simpleuser
Aufgrund dieses Designs funktioniert Hyperthreading gut mit gemischten Arbeitslasten. Zum Beispiel ein Hypervisor, auf dem alle VMs unterschiedliche Dienste ausführen. In diesem Szenario ist es wahrscheinlich nicht einmal notwendig zu testen. Um eine homogenere Auslastung zu erreichen, müssen normalerweise Tests durchgeführt werden. - Michael Hampton♦


Antworten:


Wenn der zweite virtuelle Kern beitragen darf, wenn der erste andernfalls stecken bleiben würde, ist es besser als nicht, damit Sie (mindestens) etwas mehr Arbeit erledigen können.

Die Frage wird: Wann führt es dazu, dass zwei verschiedene Fäden schlechter laufen? Die Verzweigungsvorhersage und Abhängigkeiten zwischen Anweisungen ändern sich nicht. Warten auf Speicherzugriff jetzt ... die beiden Threads konkurrieren über Speicherzugriff, sowohl in Cache-Auslastung und Bandbreite.

Wenn Sie einige CPUs mit HT und andere nicht haben, bedeutet das auch, dass Sie bestimmte Threads dem einen oder anderen Typ zuweisen? Ich denke nicht: Ihre Programme werden ihre Threads auf zufälligen virtuellen Kernen laufen lassen. Wie hilft das Aufteilen der Konfiguration? Da jede CPU ihren eigenen Cache hat, ist die einzige Auswirkung auf die Speicherbandbreite und die Last der Cache-Kohärenz zurückzuführen.

Im Allgemeinen erreichen Sie einen Punkt, wo haben Etwas mehr, was Sie tun könnten, ist teurer, als einige CPU-Ausführungseinheiten untätig laufen zu lassen. Dies hängt nicht von der Anzahl der Threads direkt ab, sondern davon was die Threads machenund die detaillierte Speicherarchitektur und Leistungsnuancen der verschiedenen Komponenten.

Es gibt keine einfache Antwort. Selbst mit einem bestimmten Programm kann sich die Maschine von denen anderer Menschen unterscheiden, die ihre eigenen Erfahrungen mit einbeziehen.

Du musst es selbst ausprobieren und messen Was ist am schnellsten, mit dieser spezifischen Arbeit an genau dieser Maschine? Und selbst dann kann sich das mit Software-Updates und einer Verschiebung der Nutzung im Laufe der Zeit ändern.

Sieh dir das an Band 3 von Angers Hauptwerk. Wenn Sie sich einen bestimmten Prozessor genauer ansehen, können Sie in der tiefen Pipeline vieler Schritte, die zum Ausführen von Code erforderlich sind, beschränkende Ressourcen finden. Sie müssen einen Fall finden, in dem eine Überkompensation dazu führt, dass sie langsamer ausgeführt wird, anstatt mehr Arbeit aufzunehmen. Im Allgemeinen würde das eine Art Caching bedeuten; und wo die Ressource unter Threads geteilt wird.


Was bedeutet der CPU-Zähler: Er gibt die gesamte Zeit an, die nicht benötigt wird, um den Leerlauf-Thread auszuführen. Beide logischen Threads, die einem Kern zugewiesen sind, werden nicht inaktiv sein, obwohl die tatsächliche Arbeit, die an einem von ihnen ausgeführt wird, klein sein kann. Die Zeit, die mit der Pipeline verbracht wird, bleibt für einige Zyklen bestehen, bis die Ergebnisse fertig sind, Speicher abgerufen wird, atomare Operationen eingezäunt sind usw. Ebenso wird der Thread nicht als "nicht bereit" gespeichert, so dass er nicht im Leerlauf ist. und die Zeit zeigt sich immer noch als in Verwendung. Warten auf RAM wird nicht als Leerlauf angezeigt. Nur etwas wie I / O wird den Thread blockieren und die Ladezeit dafür stoppen. Ein Betriebssystem Mutex im Allgemeinen wird dies tun, aber Mit dem Aufkommen von Multicore-Systemen ist das nicht mehr so ​​sicher, wie ein "Spinlock" es tun wird nicht mach den Faden zurück auf das Regal.

Ein CPU-Meter von 100% bedeutet also nicht, dass alles reibungslos abläuft, wenn die CPU oft festsitzt und auf Speicher wartet. Eine geringere Anzahl von logischen Kernen, die 90% anzeigen, könnte sehr wohl mehr Arbeit erledigen endet Die Nummer knirscht und wartet jetzt auf der Festplatte.

Also mach dir keine Sorgen über das CPU-Meter. Sehen Sie sich den tatsächlichen Fortschritt an, nur.


14
2018-04-03 05:49





CPU-Meter sind sehr schlecht, um Ihnen zu sagen, wie viel mehr Leistung Sie aus Ihren CPUs mit Hyperthreading herausholen können. Dafür sollten Sie Ihre eigenen Benchmarks bei verschiedenen physischen Über-Abonnement-Raten durchführen. Es gibt einige Workloads, die am besten funktionieren, wenn HT vollständig deaktiviert ist. Schließen Sie diesen Fall also ebenfalls in Ihre Tests ein. Es könnte ein 1: 2 (36 parallele Arbeiter) oder 1: 1,5 oder sogar 1: 2,5 sein! Es hängt von Ihrer Arbeitsbelastung ab.

Genauer gesagt wird HT auf dem Silizium auf Weisen implementiert, die die Zeit reduzieren, die der Prozessor ungenutzt verbringt, wenn ein Kontext umgeschaltet werden muss oder eine Verzweigungsvorhersage fehlschlägt. Dies macht es einfacher, eine 100% ige Verwendung der Ausführungseinheit zu erreichen als mit reinen Betriebssystem-Tricks. HT hat sich seit seiner Einführung weiterentwickelt, und auf modernen Chips gibt es mehr Parallelität als vor zehn Jahren.

Es gibt zwei Ausführungsprofile, die sich auf den optimalen Überbezugspunkt auswirken:

  • Lange Ausführungsdauer. Wenn Ihre Mitarbeiter vor dem Recycling Minuten oder Stunden laufen, z. B. große Rendering-Jobs oder Umgebungsmodellierung, erhalten Sie eine effizientere Einzelkernleistung pro Mitarbeiter. Dies wird Ihr Verhältnis senken.
  • Kurze Ausführungsdauer. Wenn Ihre Mitarbeiter in Sekundenschnelle oder in kleinen Minuten wie beispielsweise Web-App-Threads arbeiten, bedeutet der Overhead beim Einschalten eines neuen Prozesses, dass Ihr Verhältnis höher ist.

23
2018-04-02 13:44



Kleine Minuten? Du meinst, ein paar Minuten? - Ismael Miguel
Ziemlich viel. 1 bis 5 oder so. Bei 120 Sekunden pro Arbeiter mit 18 Arbeitern dreht man alle 7 Sekunden einen neuen. Vieles kommt auf die Cache-Lokalität an. - sysadmin1138♦
Du hast es nicht verstanden ... Du sagst "kleine Minuten" auf deinem 2. Punkt. Minuten haben immer die gleiche "Größe", also 60 Sekunden. Manchmal 61 Sekunden. - Ismael Miguel


Sie sollten sehen, dass alle 36 Kerne bei 100% laufen - vorausgesetzt, die Software kann das (was nicht trivial ist - die Planung kann mit diesen vielen Kernen schwierig sein, so dass Einbrüche unter 100% akzeptabel sind).

Wenn man ein Erz mit Hyperthreading "spaltet", ist die Bedeutung dieser 200% natürlich nicht "2x100%" in der ausgeführten Arbeit. Aber dies ist für jede durchgeführte Messung unsichtbar (was von der CPU-Auslastung herrührt und kein Konzept der Arbeit hat). Wie viel Arbeit damit gemacht wird, hängt davon ab, was die Arbeit ist - irgendwo über 1,5 x ist die Arbeit ohne Hyper-Threading die meiste Zeit zu erwarten.


4
2018-04-02 13:18





Die Art und Weise, wie Hyperthreading implementiert wird, variiert mit der spezifischen CPU-Suche. Von Nehalem bis Skylake hat Intel die gemeinsam genutzten Teile der Pipeline mit festen Anteilen (dh 50/50) deutlich reduziert, indem sie sich zu dynamisch gemeinsamen Strukturen entwickelt haben.

Wie auch immer, im Allgemeinen führte das Aktivieren von HT zu einer langsameren Single-Thread-Ausführung, aber aufgrund der Funktionsweise des Linux-Schedulers geschieht dies nur, wenn die Nummer oder der laufende Thread dies ist höher als die Anzahl der physischen Kerne. Da in solchen Situationen (wenn Threads> Cores) der Gesamtdurchsatz von größter Wichtigkeit ist, bleibt Hyperthreading ein Nettogewinn.

Wie ist das möglich? Der entscheidende Punkt ist, dass die CPU die physischen Kerne und die virtuellen Kerne nicht als gleichwertige Kerne präsentiert, sondern sie auf eine Art und Weise aussetzt, die der Linux-Scheduler nicht planen kann, wenn andere physische Kerne verfügbar sind. Mit anderen Worten, es verwendet zuerst alle physischen Kerne, dann es fängt an, den virtuellen zu benutzen.

Dies bedeutet, dass HyperThreading im Allgemeinen sehr nützlich ist (andere Prozessoren, wie Power8, verwendet sogar tiefere SMT-Techniken) und um den Durchsatz zu maximieren, sollten Sie es aktivieren und die CPU mit mindestens einem Thread pro virtuellem oder physikalischem Kern laden. Um ein praktisches Beispiel zu erhalten, sollten Sie mindestens 36 Threads verwenden, um die volle Leistung einer 18-Core-CPU zu erhalten.

Es gibt zwei Ausnahmen:

  1. Wenn Sie nur die Latenz aus einer begrenzten Menge von Threads (wo Threads <physische Kerne) minimieren möchten, können Sie HT deaktivieren
  2. Sehr alte CPUs (Pentium4 und, viel kleiner, Nehalem) haben unflexible Partitionsregeln, die die CPU zwingen, viele Schlüsselressourcen im Verhältnis 50/50 aufzuteilen, unabhängig vom Status / der Auslastung des zweiten Threads. In diesem Fall mussten Sie Ihren Anwendungsfall vergleichen, um sicherzustellen, dass der hinzugefügte Durchsatz die deutlich geringere Leistung einzelner Threads wert ist.

3
2018-04-18 21:34