Szenario: Auf einmal fühlt sich mein Computer träge an. Die Maus bewegt sich, aber das Öffnen von Fenstern dauert ewig usw. Die Anzeige uptime
zeigt, dass die Auslastung 7,69 beträgt und weiter zunimmt.
Wie lässt sich am schnellsten herausfinden, welcher/welche Prozess(e) die Ursache für die Belastung ist/sind?
Nun, "top" und ähnliche Tools sind nicht die Antwort, da sie entweder die CPU- oder die Speicherauslastung anzeigen, aber nicht beides gleichzeitig. Was ich brauche, ist der einzelne Befehl, den ich möglicherweise eingeben kann, während er passiert - etwas, das alle
Das System versucht, 8 GB RAM auf die Festplatte auszulagern, weil Prozess X ...
oder
Prozess X durchsucht die gesamte Festplatte
oder
Prozess X nutzt 400 % der CPU"
Ich suche also nach einem Tool, das mit iostat, htop/atop und ähnlichen Tools in einem Programm mit einer Ausgabe wie dieser zusammenläuft:
1235 cp - Disk trashing
87 chrome - Uses 2 GB of RAM
137 nfs_bench - Uses 95% of the network bandwidth
Ich möchte kein Tool, das mir irgendwelche Zahlen liefert, die ich analysieren kann, sondern ein Tool, das mir genau sagt, welcher Prozess die aktuelle Auslastung verursacht. Gehen wir davon aus, dass der Benutzer vor der Tastatur kaum weiß, wie man „Prozess“ schreibt, aber bei „Resident Size“, „Virtueller Speicher“ oder „Prozesslebenszyklus“ ist er schnell überfordert.
Meine Argumentation geht so: Ein Benutzer bemerkt ein Problem. Dafür kann es tausende Gründe geben ... na ja, fast :-) Der Benutzer möchte die Ursache des Problems wissen.
Die aktuellen Lösungen liefern mir viele Zahlen und ich muss wissen, was diese Zahlen bedeuten. Ich suche nach einem Metatool. 99 % der Daten sind für das Problem irrelevant. Das Tool sollte also nach Prozessen suchen, die Ressourcen verbrauchen, und nur diese auflisten, zusammen mit „dieser Prozess benötigt viel CPU, dies erzeugt viele IRQs, dieser Prozess belegt viel RAM (und dieser wächst immer noch)“.
Dies wird eine relativ kurze Liste. Für jemanden, der sich damit nicht auskennt, wird es viel einfacher sein, den Übeltäter anhand dieser Liste zu finden, als anhand der Ausgabe von beispielsweise: , htop
die mir etwa 5000 Zahlen liefert, von mir aber verlangt, dass ich selbst Multithread-Prozesse zusammenstelle (ich habe 50 Zeilen, die sagen, VIRT 2750M
aber nur 16 GB RAM - die Maschine sollte sich selbst tot tauschen, aber das ist natürlich eine Fehlinterpretation der Daten, die schnell passieren kann).
Antwort1
Ich muss über die Antworten schmunzeln, denn in jeder Antwort wurde Ihnen gesagt, Sie sollten das Tool X ausführen. Das einzige Problem ist, dass es keine Möglichkeit gibt, etwas zu korrelieren, wenn das, was Sie sehen, nur zeitweise auftritt. Ein Tool wiesarkann helfen, wenn man es mit einer ausreichend hohen Frequenz laufen lässt, aber ich würde behauptensammelnist noch besser.
Wiesar, führen Sie es als Daemon aus, indem Sie das RPM installieren und ausführen /etc/init.d/collectl start
.
Wenn Sie jetzt etwas Langsames bemerken, collectl -p /var/log/collectl/filename --top
werden die Daten wiedergegeben und Ihnen die wichtigsten Prozesse angezeigt. Sie hätten collectl --top
sie auch einfach ausführen und in Echtzeit sehen können. Übrigens – alles, was Sie in Echtzeit tun können, können Sie auch wiedergeben.
Was die CPU-Auslastung betrifft: Was passiert, wenn Sie durch Interrupts überlastet werden? collectl -sC
zeigt nicht nur die Auslastung einzelner CPUs (oder die Verwendung -sc
für die durchschnittliche Auslastung), sondern auch, wie sie ihre Zeit verbringen. Fügen Sie -j
( -scj
) ein, und Sie sehen die Anzahl der Interrupts/CPUs. Verwenden Sie Großbuchstaben -J
, und Sie sehen die TYPEN der einzelnen Interrupts/CPUs.
Wenn Sie vmstat wirklich mögen, können Sie natürlich jederzeit Collectl-Daten wiedergeben --vmstat
und es werden historische Daten im vmstat-Format angezeigt.
Es gibt weitaus mehr Schalter, als ich hier auflisten kann, aber Sie können sie hier nachlesen:QuelleForgeoder einfach googlen.
Antwort2
"top" funktioniert einigermaßen gut, solange Sie sich die richtigen Zahlen ansehen. Mal sehen:
top - 13:11:45 up 13 days, 1:13, 21 users, load average: 0.06, 0.11, 0.26
Tasks: 271 total, 2 running, 267 sleeping, 0 stopped, 2 zombie
Cpu(s): 19.0%us, 6.3%sy, 0.0%ni, 74.0%id, 0.5%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 8183668k total, 8002712k used, 180956k free, 12476k buffers
Swap: 11847900k total, 723480k used, 11124420k free, 767016k cached
Wenn das System jetzt langsam ist, weil die CPU vollständig belegt ist, wird dies in den Spalten „us“ und „sy“ in der Zeile „Cpu(s):“ angezeigt, deren Gesamtauslastung bei fast 100 % liegt.
Wenn es aufgrund von Swapping langsam ist, zeigt „Mem:“ „free“ sehr niedrige Werte und „Swap:“ „used“ hohe Werte an.
Wenn es langsam ist aufgrund vonE/Aim Allgemeinen gibt „Cpu(s):“ „wa“ an, wie viel Zeit für die E/A-Wartezeit aufgewendet wird.
Wenn Sie nun wissen, dass I/O-Wartezeiten das Problem sind, können Sie das Programm „iotop“ verwenden, um herauszufinden, welche Prozesse die meisten I/O-Vorgänge verursachen.
Antwort3
Aufgrund der Auslastung von 400 % gehe ich davon aus, dass Sie einen Quad-Core-Prozessor haben. Ihre durchschnittliche Auslastung ist fast doppelt so hoch und die Hälfte der Prozesse wartet auf die CPU.
Stellen Sie zunächst renice
Ihre Shell auf 0 oder -10, um ein reaktionsfähigeres System zu erhalten, und verwenden Sie dann, htop
um den/die fehlerhaften Prozess(e) zu finden und diesen mit strace
einem bestimmten Prozess zu verfolgen. Andere Tools, die nützlich sein könnten, sind:
vmsat
sar
iostat
pmap
Antwort4
vmstat könnte Ihnen allgemein weiterhelfen. Ein Anwendungsbeispiel ist:
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
1 0 0 977908 426184 1543884 0 0 38 45 106 385 4 1 95 1
Sie können es auch alle X Sekunden ausführen – fügen Sie einfach die Zahl X nach dem Befehl hinzu.
Bearbeiten: Im Hinblick auf den Kommentar ... Schreiben Sie das Folgende in eine Datei und machen Sie diese Datei ausführbar. Dadurch werden Ihnen die drei wichtigsten Prozesse auf dem Computer angezeigt.
top -n 1 | tail -16 | head -4 | awk '{print $13}'
Wenn Sie wissen möchten, was im Gegensatz zur CPU den Speicher beansprucht, lesen Sie die oberste Manpage und ändern Sie die Anzeigereihenfolge.