'htop' zeigt nicht die korrekte CPU% an, 'top' jedoch

12

Beim Laufen mencodermit Threads = 4 (auf einer Quad-Core-CPU). Ich habe festgestellt, dass htopdies nicht die tatsächliche CPU-Auslastung anzeigt, dies jedoch toptut.

Es scheint, dass htop nur über einen Kern berichtet . Ist das ein Fehler / eine Einschränkung von htop ? Was geht hier vor sich?

Es gibt keine anderen Einträge für Mencoder , die in psoder htopoder angezeigt werden top. Ich gehe davon aus, dass 100% bedeutet, dass 1 Kern maximal ist, aber selbst das scheint mir seltsam; Was ist mit den anderen Kernen?

Update: Ausgabe "System Monitor" hinzugefügt

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
quelle
Welche Flags verwenden Sie für htop?
Sep332
sep332 ... Ich führe nur "htop" aus ... es handelt sich also um die Standardeinstellungen.
Peter.O
Bingo! sep332 .. mache eine Antwort daraus und ich werde es als gelöst markieren .. Du hast mich dazu gebracht, meine Standardeinstellungen zu überprüfen .... "H" ist eine Umschalttaste zu "Benutzer-Threads ausblenden" ... Wenn alles andere fehlschlägt " Lesen Sie die Info-Hilfe ", aber manchmal hilft ein praktischer Hinweis in der richtigen Richtung mehr. Danke.
Peter.O
@ Peter.O: Versehentlich heruntergestimmt (Maus-Touchpad!). Ich werde es abbrechen, wenn Sie Ihren Beitrag bearbeiten.
SabreWolfy

Antworten:

24

Wie Sie selbst gesagt haben, können Sie klicken H, um Benutzer-Threads anzuzeigen.

Berechnen wir die CPU-Auslastung nur zum späteren Nachschlagen (und zum Spaß)!

Ein bisschen Hintergrund:

In einem modernen Betriebssystem gibt es einen Scheduler. Ziel ist es sicherzustellen, dass alle Prozesse und ihre Threads einen angemessenen Anteil an Rechenzeit erhalten. Ich werde nicht zu viel planen (es ist wirklich kompliziert). Aber am Ende gibt es so etwas wie eine Run-Warteschlange . Hier reihen sich alle Anweisungen aller Prozesse aneinander, um auf die Ausführung zu warten.

Bei jedem Prozess werden die "Aufgaben" in die Ausführungswarteschlange gestellt. Sobald der Prozessor bereit ist, werden sie entfernt und ausgeführt. Wenn ein Programm beispielsweise in den Ruhezustand wechselt, entfernt es sich aus der Ausführungswarteschlange und kehrt zum "Ende der Zeile" zurück, sobald es wieder ausgeführt werden kann.

Das Sortieren in dieser Warteschlange hat mit der Priorität der Prozesse zu tun (auch als "netter Wert" bezeichnet - dh ein Prozess ist nett zu Systemressourcen).

Die Länge der Warteschlange bestimmt die Auslastung des Systems. Eine Last von 2,5 bedeutet beispielsweise, dass für jeden Befehl, den die CPU in Echtzeit verarbeiten kann, 2,5 Befehle vorhanden sind .

Unter Linux wird diese Last übrigens in 10-ms-Intervallen berechnet (standardmäßig).

Nun zu den Prozentwerten der CPU-Auslastung:

Stellen Sie sich vor, Sie haben zwei Uhren, eine heißt tund repräsentiert Echtzeit . Es misst eine Sekunde pro Sekunde. Die andere Uhr rufen wir an c. Es wird nur ausgeführt, wenn eine Verarbeitung erforderlich ist. Das heißt, nur wenn ein Prozess etwas berechnet, läuft die Uhr. Dies wird auch als CPU-Zeit bezeichnet. Jeder Prozess auf dem System hat einen davon.

Die Prozessorauslastung kann jetzt für einen einzelnen Prozess berechnet werden:

U = c / t = 0,5 s / 1 s = 0,5

oder für alle Prozesse:

Alt-Text

Auf einem Multi-Core-Computer kann dies natürlich zu einem Wert von 3,9 führen, da die CPU bei perfekter Nutzung jede Sekunde eine Berechnung im Wert von vier Sekunden berechnen kann.

Wikipedia bietet dieses Beispiel:

Eine Softwareanwendung, die auf einem 6-CPU-UNIX-Computer ausgeführt wird, erstellt drei UNIX-Prozesse, um die Benutzeranforderungen zu erfüllen. Jeder dieser drei Prozesse erstellt zwei Threads. Die Arbeit der Softwareanwendung wird gleichmäßig auf 6 unabhängige Ausführungsthreads verteilt, die für die Anwendung erstellt wurden. Wenn kein Warten auf Ressourcen erforderlich ist, wird die Gesamt-CPU-Zeit voraussichtlich sechsmal in Echtzeit verstrichen sein.

Hier ist ein kleiner Python-Ausschnitt, der dies tut

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

In einer perfekten Welt könnte man daraus schließen, dass die Systemlast 100 - 66,93 = 33,1% beträgt. (In Wirklichkeit wäre dies jedoch falsch, da komplexe Dinge wie E / A-Wartezeiten, das Planen von Ineffizienzen usw. erforderlich sind.)

Im Gegensatz zur Last führen diese Berechnungen immer zu einem Wert zwischen 0 und der Anzahl der Prozessoren, dh zwischen 0 und 1 oder 0 bis 100%. Es gibt jetzt keine Möglichkeit mehr zwischen einem Computer, auf dem drei Aufgaben mit 100% CPU ausgeführt werden, und einem Computer, auf dem eine Million Aufgaben ausgeführt werden und an dem kaum noch eine Arbeit ausgeführt wird, auch nicht zu 100%. Wenn Sie beispielsweise versuchen, eine Reihe von Prozessen auf vielen Computern auszugleichen, ist die CPU-Auslastung nahezu nutzlos. Laden ist das, was Sie dort wollen.

In Wirklichkeit gibt es mehr als eine dieser Verarbeitungszeituhren. Es gibt zum Beispiel eine, die auf E / A wartet. Sie können also auch die E / A-Ressourcennutzung berechnen.

Dies mag in Bezug auf die ursprüngliche Frage nicht hilfreich gewesen sein, aber ich hoffe, es ist interessant. :) :)

Stefano Palazzo
quelle
Ich hätte wirklich Unsicherheitswerte einbeziehen sollen, da mit dieser einfachen Methode die Berechnung wahrscheinlich um ± 1% abweicht, aber ich wollte nicht alle zu sehr langweilen .
Stefano Palazzo
Danke für die Lektion. Ich wusste das meiste davon, aber ein paar Dinge waren spezifischer als das, was ich gelernt habe.
NightwishFan