Ich hatte ein Problem, bei dem ich nur raten konnte, welcher Prozess die CPU belastete.
Meine CPU-Auslastung lag bei psensor für alle Kerne bei etwa 80 %.
Ich habe es versucht htop
, top
und ps -A -o pcpu,pid,cmd --sort +pcpu
(das letzte habe ich sogar vergeblich mit sudo versucht).
Alle diese zeigten, dass die fehlerhafte PID (die mir bekannt war) nur etwa 7 % nutzte ...
Wenn ich für diese PID einen SIGKILL ausführe, ist alles wieder normal.
Zum Testen habe ich im Terminal eine Endlosschleife ausgeführt, while true;do echo -n;done
die ich jedoch bei htop deutlich sehen konnte. Meine Vermutung, dass das Problem hiervon nicht betroffen war …
Daher frage ich mich, ob es andere Möglichkeiten gegeben hätte, den Täter zu finden, ohne raten zu müssen?
Wenn ich noch einmal darüber nachdenke, würde ich gern wissen, welche Berechnungen psensor
und welches „Applet zur Anzeige der Systemlast“ verwendet wurde, das diesen Wert anzeigen konnte, die anderen aber nicht?
PS.:Verlinkung über Wartezeit, Verlinkung über Lastdurchschnitt
Antwort1
Ich bin mit den Details nicht vertraut genug, um präzise Hinweise zu geben, aber ich vermute, dass es zwei Ursachen für die Unterschiede zwischen der tatsächlich verursachten Last und der angezeigten CPU-Auslastung gibt:
Der Prozess kann aus mehreren Threads bestehen und
top
muss diese nicht zusammenfassen. Die Anzahl der Threads können Sie wie folgt sehen:ps -eo pid,nlwp,%cpu,user,args
In
top
können Sie die Thread-Behandlung mit umschaltenH
. Die CPU-Auslastung jedes Threads ist normalerweise recht gering.Der Prozess kann eine Menge I/O verursachen. Die I/O-Wartezeit ist Teil der gesamten CPU-Last, aber möglicherweise nicht Teil des CPU-Auslastungswerts eines Prozesses. Überprüfen Sie daher den
wait
Wert intop
. Er sagt Ihnen nicht, welche Prozesse dies in welchem Ausmaß verursachen, aber wenn der Wert niedrig ist, kann er die Auswirkung nicht erklären.
Antwort2
Der auf einem Unix-System ausgeführte Code wird entweder als Kernelcode oder als Userlandcode klassifiziert. Userlandcode ist immer an einen Prozess angehängt. Wenn die CPU also mit der Ausführung von Userlandcode beschäftigt ist, wird dies in einer Zeile in angezeigt top
. Kernelcode ist normalerweise an einen Prozess angehängt: Wenn der Kernel einen Systemaufruf ausführt, wird die Verarbeitung im Kernel als zu diesem Prozess gehörend betrachtet. Die Kernelzeit ist die vom Dienstprogramm gemeldete „Systemzeit“ time
.
Einige der Dinge, die der Kernel tut, können nicht direkt einem Prozess zugeordnet werden. Insbesondere Hardware-Interrupts gehören nicht von Haus aus zu einem bestimmten Prozess. Nehmen wir beispielsweise an, dass ein Interrupt von der Netzwerkkarte ausgelöst wird. Der Kernel führt Code aus, um das Netzwerkpaket zu lesen und zu analysieren; bis jetzt ist kein Prozess daran beteiligt. Das Paket kann über eine Firewall-Regel abgelehnt werden, in diesem Fall kann kein Prozess diese Verarbeitungszeit beanspruchen. Wenn ein Prozess dieses Paket schließlich empfängt, wird ein Teil der Empfangszeit auf die Rechnung dieses Prozesses gesetzt, jedoch nicht die frühen Phasen.
Es ist also möglich, dass CPU-Zeit vorhanden ist, die keinem Prozess zuzuordnen ist. Manchmal wird diese CPU-Zeit jedoch indirekt durch einen Prozess verursacht. Wenn es beispielsweise einen Prozess gibt, der Pakete an einen anderen Computer sendet und diesen Computer dazu veranlasst, zu antworten, die Firewall die Antwortpakete jedoch blockiert, kann die Zeit, die zum Analysieren und Verwerfen der Antwortpakete aufgewendet wird, nicht auf den sendenden Prozess zurückgeführt werden. Wenn der sendende Prozess jedoch stoppt, was dazu führt, dass der Remotecomputer nicht mehr antwortet, verbringt der Kernel keine Zeit mehr damit, die Pakete abzulehnen. Natürlich ist das Netzwerk nur ein Beispiel. Es gibt viele andere Möglichkeiten für den Kernel, Dinge zu tun, die nicht direkt auf einen Prozess zurückgeführt werden können.
Sie haben nicht genügend Informationen gegeben, um sicher zu sein, dass dies der Fall ist (und ohne Kernel-Debugger kann es schwierig sein, das herauszufinden), aber dies ist eine plausible Erklärung.
Antwort3
Wenn Sie htop,ps,top nicht verwenden möchten, können Sie systemtap für weitere Details auf niedrigerer Ebene verwenden