CPU-Lastmessung mit Hyperthreading unter Linux


12

Wie kann ich die tatsächliche Verwendung einer Multicore-Hyperthreading-fähigen CPU ermitteln?

Betrachten wir zum Beispiel eine 2-Kern-CPU, die 4 virtuelle Kerne ausdrückt.

Eine einzelne Thread-Workload wird jetzt zu 100% angezeigt top, da ein Kern der virtuellen Kerne vollständig verwendet wird. Die CPU und toparbeiten wie erwartet, als gäbe es 4 echte Kerne.

Bei zwei Threads werden die Dinge jedoch schwierig: Wenn alles gut funktioniert, werden sie auf die beiden realen Kerne abgestimmt, sodass wir eine Auslastung von 200% haben: Zweimal 100% und zwei virtuelle Kerne im Leerlauf und nutzen die gesamte verfügbare CPU-Leistung . Scheint mir in Ordnung zu sein.

Wenn die beiden Threads jedoch auf einem einzelnen realen Kern ausgeführt würden, würden sie zweimal 100% verwenden, was einer Auslastung des virtuellen Kerns von 200% entspricht. Auf der realen Seite wäre dies jedoch ein Kern, der seine Leistung auf die beiden Threads verteilt, die dann nur die Hälfte der gesamten CPU-Leistung verbrauchen.

Die von angezeigten Nutzungsnummern topkönnen daher nicht zur Messung der gesamten CPU-Arbeitslast verwendet werden.

Ich frage mich auch, wie Hyperthreading zwei virtuelle auf einem realen Kern balanciert. Wenn zwei Threads unterschiedlich viele Zyklen benötigen, würden sich die virtuellen Kerne so anpassen, dass beide eine 100% ige Last aufweisen, selbst wenn sich die tatsächliche Last unterscheidet?


1
Sie verstehen, dass das Betriebssystem den Unterschied zwischen einem virtuellen Hyperthreading-Kern und dem physischen Kern nicht kennt, oder?
Ramhound

Es scheint so, aber es muss nicht? Die Zuordnung von realem und virtuellem Kern ist eine einfache Zuordnung von eins zu zwei. Das Problem besteht darin, wie die Last eines virtuellen Kerns gemessen werden kann, der tatsächlich seine verfügbare Leistung ändert, indem er mit einem anderen auf dem realen Kern geplant wird. Aber alle Daten sind verfügbar, denke ich. Die Frage ist nur, wo sind die Tools, die ein korrektes Ergebnis daraus ziehen?
Dronus

1
Ich möchte nur ein Lastmaß haben, bei dem 100% bedeuten würde, dass jeder Zyklus jedes realen Kerns verwendet wird.
Dronus

1
Einfach gesagt: Wie kann ich zu einem bestimmten Zeitpunkt feststellen, ob meine CPU in der Lage ist, weitere Arbeiten auszuführen, ohne die derzeit laufenden Arbeiten zu verlangsamen?
Dronus

1
@Ramhound: Wenn ich also einen physischen 4-Core-Prozessor mit 8 logischen Kernen habe und mein Lastdurchschnitt 4,00 beträgt, bin ich zu 100% ausgelastet oder zu 50% ausgelastet?
Buttle Butkus

Antworten:


5

Martin Tegtmeier von Oracle hat einen interessanten Blog-Beitrag über dieses letzte Jahr geschrieben: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2

Die kurze Antwort; Hyperthreading beeinträchtigt die Fähigkeit von top, die prozentualen Anteile an CPU-Auslastung / CPU-Leerlauf insgesamt zu melden.

Im schlimmsten Fall könnte eine 2-Kern-CPU mit 4 virtuellen Kernen, die 2 Threads mit 100% Auslastung pro Kern ausführt, die CPU nahezu sättigen. (Abhängig von der Verwendung des Ausführungsports können nur Threads ausgeführt werden, die völlig unterschiedliche Computerressourcen auf der CPU verwenden, ohne die Leistung des aktuellen Threads zu beeinträchtigen.) In diesem Fall meldet top jedoch weiterhin 50% Leerlauf.



3

Die Kernauslastung unterscheidet sich stark von der Belastung des Systems. Die Kernauslastung zeigt nur an, wie viel der Kern etwas berechnet oder auf Anweisungen wartet. Es kann 100% sein, was einer bestimmten Zeit entspricht, zu der die CPU etwas berechnet.

Die Last ist jedoch eine andere Sache. Die Last wird im Allgemeinen gemessen, um festzustellen, ob ein Prozess auf eine Ressource warten muss oder nicht. Wenn Prozesse nicht auf Ressourcen warten, sehen Sie ein sehr leistungsfähiges System. Aber manchmal sehen Sie langsame Systeme, aber eine geringe CPU-Auslastung. Dies bedeutet im Allgemeinen, dass einige Prozesse auf eine Ressource warten und die CPU nicht freigeben. Für diese Art von Szenario wird keine hohe CPU-Auslastung angezeigt, aber das System ist möglicherweise weit über seiner Kapazität.

In einem Linux-System ist der Lastdurchschnitt ein berechneter Wert, um die Gesamtleistung eines Systems zu messen. Der Wert des Lastdurchschnitts sollte mit den parallelen Rechenressourcen verglichen werden, um genau zu sein. Wenn ein System mit 4 physischen Kernen einen Lastdurchschnitt von 4 oder mehr hat, können wir mit Sicherheit sagen, dass einige Prozesse auf eine Ressource warten.

Es ist nicht wichtig, ob die CPU-Auslastung 100 oder 10 Prozent beträgt. Der Lastdurchschnitt kann bis zu 200 oder 300 betragen. In diesen Fällen reagiert das System kaum.

Unter normalen Betriebsbedingungen sollte der durchschnittliche Serverlast die Anzahl der Kerne für eine lange Dauer nicht überschreiten. Kurze Spitzen sind meiner Meinung nach nicht wichtig. 3 Zahlen, die Sie in einer wAusgabe sehen, sind load av. für 1/5/15 Minuten.


0

Meiner Meinung nach ist keine der oben genannten Antworten zufriedenstellend.

Ich denke, der Artikel, auf den ich mich unter folgendem Link beziehe, ist gut darauf ausgerichtet, diese Frage zu beantworten: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html

ZITAT:

Die Idee hinter HT ist, die Ausführung eines anderen Anwendungsthreads zuzulassen, wenn die aktuell ausgeführte App blockiert. Aufgrund von Fehlvorhersagen für Zweige, Blasen in der Pipeline usw. Um dies zu ermöglichen, muss ein anderer Port oder ein anderes AS-Register vorhanden sein. Dieses Register wird für das Betriebssystem sichtbar, wenn HT aktiviert ist. Das Betriebssystem (und die gesamte Nahrungskette bis zu den von Ihnen verwendeten Perf-Tools) glaubt jedoch, dass die doppelte Prozessorkapazität verfügbar ist, dh 100% CPU an jedem AS-Port.

Unter der Haube gibt es jedoch immer noch nur eine Ausführungseinheit: den einzelnen physischen Kern, mit dem Sie begonnen haben, bevor HT aktiviert wurde. Der Unterschied besteht darin, dass es auf irgendeine Weise zwischen den 2 AS-Ports geteilt wird. Wie der einzelne Kern zwischen den beiden Ports umgeschaltet wird, ist sehr kompliziert, lässt sich jedoch am einfachsten anhand der abgefragten Warteschlangen verstehen. Ich gehe in meinen GCaP-Klassen auf diesen Detaillierungsgrad ein.

Die besten Testmessungen, die ich habe, zeigen, dass jeder HT-Port im Durchschnitt nicht mehr als 75% ausgelastet sein kann oder 150% der erwarteten Gesamtkapazität von 200% je nach Betriebssystem. Die "fehlende" Kapazität von 50%, auf die ich bereits hingewiesen habe, ist eine Illusion. Intel hat behauptet, dass für allgemeine Anwendungen etwas im Bereich von 120% bis 130% zu erwarten ist.

Tatsächlich bin ich mir ziemlich sicher, dass das Betriebssystem auf jedem virtuellen Kern 100% erreichen kann, daran besteht kein Zweifel. Ich habe gerade ein:

mvn clean install -DskipTests -T 5

Und ich kann Ihnen versichern, dass meine 8 virtuellen Kerne und 4 physischen Kerne zu 100% CPU-Auslastungen waren. Und ich habe definitiv keine 8 Kerne auf meiner Maschine.

Kurz gesagt, Sie können Folgendes annehmen, wenn die Gesamt-CPU-Auslastung über 100% liegt, höchstens und höchstwahrscheinlich ziemlich genau, wenn Sie genau 100% des physischen Kerns verwenden. Das heißt, wenn Sie physischen CORE 1 in Betriebssystem CPU 1 und CPU 2 aufgeteilt haben. Und auf CPU 1 haben Sie eine Gesamtauslastung von 50% und auf CPU 2 haben Sie eine Gesamtauslastung von 50%, höchstwahrscheinlich im wirklichen Leben Druck auf eine Gesamtauslastung von 100% auf diese CPU ausüben. Sie haben es ausgereizt.

Aber natürlich hat das Betriebssystem in seinen Systemüberwachungstools keine Ahnung, dass es Ihnen eine Illusion verkauft. Unter dem Gesichtspunkt des Betriebssystems und der Art und Weise, wie es Ressourcen verwaltet, wird es nur glauben, dass jeder dieser beiden virtuellen Kerne immer noch zu 50 Prozent inaktiv ist. Wenn also mehr Aufgaben ausgeführt werden müssen, wird versucht, sie gleichmäßig auf diese beiden Kerne zu verteilen . Wenn Sie also über 100% der CPU-Auslastung hinausgehen, müssen während eines Zeitraums der CPU-Auslastung immer Arbeiten in der Warteschlange ausgeführt werden, die sich nie geändert haben, um einen Zeitsclice für die CPU zu erhalten. Irgendwann wird es klappen, aber es gibt immer einige Threads, die tatsächlich nicht einmal ausgeführt werden, obwohl sie ausgeführt werden sollen.

Vielen Dank

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.