it-swarm.com.de

'htop' zeigt nicht den korrekten Prozentsatz der CPU an, 'top' hingegen schon

Während der Ausführung von mencoder mit Threads = 4 (auf einer Quad-Core-CPU). Ich habe festgestellt, dass htop nicht die true CPU-Auslastung anzeigt, aber top.

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 ps oder htop oder top angezeigt werden. Ich gehe davon aus, dass 100% bedeutet, dass 1 Kern voll ist, aber selbst das kommt mir seltsam vor; Was ist mit den anderen Kernen?

Update: Ausgabe von "System Monitor" hinzugefügt

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
11
Peter.O

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

Nur zum späteren Nachschlagen (und zum Spaß), lasst uns die CPU-Auslastung berechnen!

Ein bisschen Hintergrund:

In einem modernen Betriebssystem gibt es einen Scheduler. Es soll sicherstellen, 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 Queue . Hier stehen alle Anweisungen aller Prozesse an und warten, bis sie an der Reihe sind.

Jeder Prozess stellt seine "Tasks" in die Ausführungswarteschlange und 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 "Nice value" genannt) - dh ein Prozess ist Schön über Systemressourcen).

Die Länge der Warteschlange bestimmt das Laden des Systems. Eine Last von beispielsweise 2,5 bedeutet, dass für jede Anweisung, die die CPU in Echtzeit verarbeiten kann, 2,5 Anweisungen 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 t und repräsentiert Echtzeit . Es misst jede Sekunde eine Sekunde. Die andere Uhr nennen wir 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 im System hat einen davon.

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

U = c/t = 0.5s / 1s = 0.5

oder für alle Prozesse:

alt text

Auf einem Multi-Core-Rechner kann dies natürlich zu einem Wert von 3,9 führen, da die CPU bei perfekter Auslastung jede Sekunde Berechnungen für vier Sekunden durchführen kann.

Wikipedia liefert 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 erwartet, dass die Gesamt-CPU-Zeit in Echtzeit das Sechsfache der verstrichenen Zeit beträgt.

Hier ist ein kleines python Snippet, das 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. (Aber in Wirklichkeit wäre das falsch, weil komplexe Dinge wie E/A-Wartezeiten, Planung von Ineffizienzen usw. auftreten.)

Im Gegensatz zu load ergeben diese Berechnungen immer einen Wert zwischen 0 und die Anzahl der Prozessoren, dh zwischen 0 und 1 oder 0 bis 100%. Es ist jetzt nicht mehr möglich, zwischen einer Maschine, auf der drei Tasks mit 100% CPU ausgeführt werden, und einer Maschine, auf der eine Million Tasks ausgeführt werden, zu unterscheiden. Wenn Sie beispielsweise versuchen, eine Reihe von Prozessen auf vielen Computern auszugleichen, ist die CPU-Auslastung so gut wie nutzlos. Laden ist, was Sie dort wollen.

In Wirklichkeit gibt es mehr als eine dieser Verarbeitungszeituhren. Es gibt zum Beispiel eine für das Warten auf I/O. So können Sie auch die I/O-Ressourcennutzung berechnen.

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

24
Stefano Palazzo