ADMIN

2021

09

2021-09-01T12:00:00

Clientmanagement und Support

PRAXIS

056

Monitoring

Tools

Prozessmonitoring mit htop

Besser beobachten

von Tim Schürmann

Veröffentlicht in Ausgabe 09/2021 - PRAXIS

Welcher Dienst gerade den Server in die Knie zwingt, verrät schnell das Kommandozeilenwerkzeug top. Doch es existiert eine deutlich modernere Alternative namens htop. Das kleine Tool verwaltet und überwacht Prozesse deutlich übersichtlicher als der in die Jahre gekommene Kollege. Seine nützlichen Funktionen verstecken sich allerdings hinter Tastenkürzeln.

Die von htop gezeigten Daten und Statistiken lassen sich individuell zusammenstellen. Bei Bedarf holen Sie sich etwa mit wenigen Tastendrücken den aktuellen Netzwerkverkehr auf den Schirm. Filter reduzieren die Datenflut gezielt auf die relevanten beziehungsweise problematischen Prozesse. Letztgenannte lassen sich interaktiv abschießen, ohne wie bei top die Prozess-ID eingeben zu müssen. htop kann zudem Signale senden und die Priorität der Prozesse anpassen. Damit empfiehlt sich das Werkzeug sogar als kleiner Systemmonitor und Prozessmanager. Das Tool gibt sämtliche Informationen auf der Konsole aus und läuft somit auch remote in einer Secure Shell. Die Bedienung orientiert sich an aktuellen top-Versionen und dem Dateimanager Midnight Commander. Ein Umstieg auf das Tool gelingt somit schnell.
Flexibel einsetzbar
Die htop-Software läuft auf zahlreichen unixoiden Systemen – viele Linux-Distributionen halten das Werkzeug in ihren Repositories vor. Manjaro und einige andere Distributionen installieren htop sogar standardmäßig. Im Zweifelsfall lässt sich das Tool schnell aus dem Quellcode übersetzen (siehe Kasten "htop übersetzen"). Zu den offiziell unterstützten Systemen gehören neben Linux noch Free-BSD, OpenBSD, DragonFly BSD, macOS und Solaris. In Letzterem müssen Sie allerdings auf einige spezielle Linux-Funktionen verzichten.
htop existiert bereits seit 2004. Seitdem entwickelte es sein Erfinder Hisham Muhammad langsam, aber stetig weiter. Auf der Fosdem-Konferenz 2018 kündigte er sogar noch größere Neuerungen an – und verschwand anschließend spurlos. Ein kleines Entwicklerteam sprang kurzerhand ein, verbesserte htop und veröffentlichte schließlich die Ergebnisse im Herbst 2020 unter der Versionsnummer 3.0. Alle folgenden Ausführungen gelten aber auch noch weitgehend für die Vorversionen.
Die von htop gezeigten Daten und Statistiken lassen sich individuell zusammenstellen. Bei Bedarf holen Sie sich etwa mit wenigen Tastendrücken den aktuellen Netzwerkverkehr auf den Schirm. Filter reduzieren die Datenflut gezielt auf die relevanten beziehungsweise problematischen Prozesse. Letztgenannte lassen sich interaktiv abschießen, ohne wie bei top die Prozess-ID eingeben zu müssen. htop kann zudem Signale senden und die Priorität der Prozesse anpassen. Damit empfiehlt sich das Werkzeug sogar als kleiner Systemmonitor und Prozessmanager. Das Tool gibt sämtliche Informationen auf der Konsole aus und läuft somit auch remote in einer Secure Shell. Die Bedienung orientiert sich an aktuellen top-Versionen und dem Dateimanager Midnight Commander. Ein Umstieg auf das Tool gelingt somit schnell.
Flexibel einsetzbar
Die htop-Software läuft auf zahlreichen unixoiden Systemen – viele Linux-Distributionen halten das Werkzeug in ihren Repositories vor. Manjaro und einige andere Distributionen installieren htop sogar standardmäßig. Im Zweifelsfall lässt sich das Tool schnell aus dem Quellcode übersetzen (siehe Kasten "htop übersetzen"). Zu den offiziell unterstützten Systemen gehören neben Linux noch Free-BSD, OpenBSD, DragonFly BSD, macOS und Solaris. In Letzterem müssen Sie allerdings auf einige spezielle Linux-Funktionen verzichten.
htop existiert bereits seit 2004. Seitdem entwickelte es sein Erfinder Hisham Muhammad langsam, aber stetig weiter. Auf der Fosdem-Konferenz 2018 kündigte er sogar noch größere Neuerungen an – und verschwand anschließend spurlos. Ein kleines Entwicklerteam sprang kurzerhand ein, verbesserte htop und veröffentlichte schließlich die Ergebnisse im Herbst 2020 unter der Versionsnummer 3.0. Alle folgenden Ausführungen gelten aber auch noch weitgehend für die Vorversionen.
htop übersetzen
Um htop aus dem Quellcode zu übersetzen, benötigen Sie einen C-Compiler, Make, die Autotools und das Entwicklerpaket der "ncurses"-Bibliothek. Unter Linux sollten Sie zudem "pkg-config" sowie die Entwicklerpakete von "libsensors", "libcap", "libnl-3" und "libnl-genl-3" installieren. Nur dann kann htop die von diesen Bibliotheken gelieferten Daten anzeigen. So ermöglicht etwa "libsensor" einen Zugriff auf die Temperaturfühler. Unter Ubuntu holen Sie alle benötigten Komponenten wie folgt hinzu:sudo apt install build-essential autoconf libncurses-dev pkg-config libsensors-dev libcap-dev libnl-3-dev libln-genl-3-devSind die Voraussetzungen erfüllt, laden Sie sich von GitHub das aktuelle Quellcodearchiv [1] herunter. Nach dem Entpacken übersetzen Sie htop mit libln-genl-3-dev./autogen.sh && ./configure && make"Unter Linux hängen Sie an "configure" noch den Parameter "--enable-delayacct" an. Wenn Sie "--enable-static" ergänzen, erhalten Sie ein statisch gelinktes Programm. In jedem Fall richtet abschließend sudo make install das Werkzeug im System ein.
Hardware und Prozesse überwachen
Nach dem Start von htop können Sie mit den Statistiken im oberen Teil feststellen, ob das System tatsächlich auf dem Zahnfleisch geht. Die Balken links repräsentieren die Auslastung der
einzelnen Prozessorkerne, des Hauptspeichers und des verfügbaren Swap-Speichers. Auf einem System mit Hyperthreading sehen Sie für jeden realen Kern zwei Balken. Die Farben der Balken warnen dabei nicht etwa, sondern stehen für die unterschiedlichen Verursacher. Die roten Balken bei der Auslastung eines CPU-Kerns zeigen beispielsweise an, wie viel Rechenzeit der Linux-Kernel gerade beansprucht.
In jedem Fall geben die Prozentzahlen die Gesamtauslastung an. Arbeitet nur ein CPU-Kern am Anschlag, belastet ihn entweder ein Prozess über Gebühr oder eine Multi-Core-Anwendung verteilt ihre Last nicht gut auf alle Kerne. Bei der Hauptspeicher- und Swap-Belegung zeigt Ihnen die erste Zahl den belegten und die zweite den insgesamt verfügbaren Platz. Ist dieser Balken sehr lang, braucht ein Prozess entweder zu viel Speicher oder aber der verfügbare reicht für die Anwendung nicht aus. Letzteres tritt gerne bei hastig oder automatisch erzeugten virtuellen Maschinen auf.
 Sofern die Farben verfälscht erscheinen oder Sie ein Terminal ohne Farbfähigkeiten verwenden, wechseln Sie mit "F2" in die Grundeinstellungen, dort zu "Colors" und mit der Pfeiltaste nach rechts. Aktivieren Sie dort mit der Leertaste ein Schema. Wie auch in den meisten anderen Fällen kehren Sie mit "Esc" zurück. Über den Parameter "-C" versetzen Sie htop direkt bei seinem Start in den Schwarzweißmodus. Das ist besonders nützlich, wenn die Ausgabe nicht lesbar ist.
Auf der rechten Seite finden Sie neben "Tasks" die Anzahl der Prozesse. Die untergliedern sich wiederum in Threads, deren Gesamtzahl vor "thr" steht. Der Parameter "running" verrät noch, wie viele Prozesse gerade laufen. Die "Load average" liefert die durchschnittliche Systemauslastung in der letzten Minute, den letzten fünf Minuten und den letzten 15 Minuten. Sind die ersten beiden Werte deutlich höher als der dritte, geht Ihr System erst seit Kurzem in die Knie.
Problematische Prozesse identifizieren
Um einen ressourcenfressenden Prozess zu identifizieren, wenden Sie sich der großen Tabelle zu. Über die Pfeiltasten navigieren Sie in ihr sowohl vertikal als auch horizontal. Alternativ blenden Sie mit "P" die Programmpfade aus und gestalten so die Darstellung etwas kompakter. Die Anzeige passt sich zudem automatisch dem verfügbaren Platz an, bei dichtem Gedränge vergrößern Sie einfach das Terminal-Fenster. htop lässt sich übrigens auch mit der Maus bedienen, wobei das Mausrad in der Prozessliste blättert. Das gelingt allerdings nur, wenn das Terminal die Mausbedienung zulässt. Bei Bedarf können Sie mit einem Programm wie gpm [2] nachhelfen.
Die Prozessliste aktualisiert htop automatisch nach einigen Sekunden. Um die Suche nach einem Amok laufenden Prozess zu erleichtern, frieren Sie den Stand mit "Z" ein. Nachdem Sie die Liste in Ruhe durchforstet haben, startet die gleiche Taste die Aktualisierung wieder. Das Intervall für ein Update können Sie zudem in den Grundeinstellungen ändern. Dazu drücken Sie "F2", steuern die "Display options" an, gehen mit den Pfeiltasten nach rechts und dann nach unten zum Punkt "Update interval". Den Wert ändern Sie mit den Plus- beziehungsweise Minus-Tasten.
Die Übersicht erhöht zudem die Baumdarstellung aus Bild 2. Zwischen ihr und der Prozessliste schalten Sie mit "F5" um. Die Baumansicht zeigt Ihnen, welcher Prozess welche (Kind-)Prozesse gestartet hat. Damit entlarven Sie schnell den Vater des CPU-folternden Prozesses.
Wie htop verrät, verfügt die Ubuntu-VM über zwei Prozessoren (0 und 1) und insgesamt 3,84 GByte Hauptspeicher.
Ordnung in der Prozessübersicht schaffen
Der erste Blick geht meistens zur Spalte "CPU%": Sie verrät, wie viel Prozent der verfügbaren CPU-Leistung derzeit die einzelnen Prozesse belegen. Unter "TIME+" lesen Sie ab, wie lange die Prozesse jeweils schon laufen. Speicherfresser entlarven Sie mit den Werten unter "VIRT", "RES" und "SHR". "VIRT" gibt dabei den kompletten vom Prozess nutzbaren Speicher an (den virtuellen Adressraum), "RES" den tatsächlich belegten physischen Speicher, während "SHR" das mit anderen Prozessen zusammen genutzte RAM nennt. Besonders hohe Werte färbt htop ein. So müssen Sie nicht alle Prozesse von oben nach unten durchgehen, um den ressourcenfressenden Prozess zu finden.
Standardmäßig sortiert die Prozessliste alle Einträge bereits anhand ihrer aktuellen CPU-Auslastung, der rechenintensivste Prozess steht dabei ganz oben. Die Baumansicht ordnet die Prozesse hingegen aufsteigend nach ihrer ID. Diese Sortierreihenfolgen ändern Sie schnell über "F6". Anschließend wählen Sie ein Sortierkriterium und bestätigen es mit der Eingabetaste. Um beispielsweise einen Hauptspeicherfresser zu finden, entscheiden Sie sich für "PERCENT_MEM". Der Delinquent steht dann oben in der Liste.
Für die besonders häufig benötigten Sortierkriterien kennt htop zudem Tastenkürzel: "Umschalt+P" führt Sie direkt auf die Sortierung nach Prozessorauslastung. Alle weiteren Kürzel listet unsere gleichnamige Tabelle auf. Das jeweils gerade geltende Sortierkriterium verrät der Tabellenkopf: htop sortiert die Prozesse anhand der blau hinterlegten Spalte. Das kleine Dreieck zeigt die Sortierrichtung an, die Sie mit "Umschalt+I" umdrehen.
Hängt ein Dienst, ohne Ressourcen zu fressen, verschwindet er irgendwo unter den anderen Prozessen. Sofern Sie seinen Namen kennen, aktivieren Sie mit "F3" die Suche und tippen den Programmnamen ein (auch wenn der Cursor links oben blinkt, erfolgt die Eingabe unten rechts). htop sucht schon während der Eingabe einen passenden Prozess heraus. Mit "F3" und "Umschalt+F3" springen Sie zur nächsten beziehungsweise vorherigen Fundstelle. Die Suchfunktion gerät allerdings an ihre Grenzen, wenn der problematische Prozess nur kurz anläuft und sich dann wieder beendet.
Wichtige Tastenkürzel im Überblick
Tastenkürzel
Bedeutung/Aktion
Pfeiltasten
Navigiert in der Prozessliste
Bild auf und Bild ab
Blättert in der Prozessliste hoch und runter
Pos1
Springt an den Anfang der Prozessliste
Ende
Springt an das Ende der Prozessliste
+ oder -
Zweig in der Baumansicht ein- und ausklappen
F1 oder H
Hilfe aufrufen
F2 oder Umschalt+C oder Umschalt+S
Grundeinstellungen
F3 oder /
Prozess suchen
F4 oder \
Prozesse filtern
F5 oder T
Umschalten zwischen Baum- und Listenansicht
F6 oder > oder .
Sortierreihenfolge der Prozesse ändern
F7 oder [
Priorität in Form des Nice-Wertes erhöhen (nur Root erlaubt)
F8 oder ]
Priorität in Form des Nice-Wertes verringern
F9 oder K
Schießt den markierten Prozess ab
F10 oder Q
Beendet eine Funktion oder htop
A
CPU-Affinity setzen
E
Zeigt die Umgebungsvariablen
I
Setzt die I/O-Priorität
L
Zeigt die vom Prozess geöffneten Dateien (via lsof)
M
Blendet Merged Commands ein und aus
P
Blendet den Programmpfad ein und aus
S
Zeichnet die Syscalls eines Prozesses auf (via strace)
U
Zeigt nur noch Prozesse des gewählten Nutzers
W
Zeigt nur das komplette Kommando an
X
Zeigt File Locks an
Z
Prozessliste aktualisieren ein/aus
Leertaste
Markiert einen Prozess
Umschalt+H
Blendet Userland-Threads ein und aus
Umschalt+I
Dreht die Sortierreihenfolge um
Umschalt+K
Blendet Kernel-Threads ein und aus
Umschalt+N
Sortiert Prozesse nach ID
Umschalt+P
Sortiert Prozesse nach CPU-Auslastung
Umschalt+M
Sortiert Prozesse nach Speicherauslastung
Umschalt+T
Sortiert Prozesse nach Zeit
Umschalt+U
Hebt die Markierung auf
Datenflut reduzieren
Sie sind in der Lage, unwichtige Einträge auszublenden. So erscheinen in den Listen standardmäßig auch Threads. Auf diese Weise können Sie zwar schnell die von einer Datenbank gezündeten Threads verfolgen, sie fluten aber auch die Liste mit Einträgen. Per "Umschalt+K" sowie "Umschalt+H" verstecken Sie die Kernel- beziehungsweise User-Mode-Threads und sorgen so bei Bedarf für weitere Übersicht.
Wenn Sie wissen, dass der Prozess unter dem Benutzerkonto "nginx" läuft, drücken Sie "U" und htop zeigt dann nur noch die Prozesse des gewählten Nutzers an. Die Liste dient dabei nicht nur zur Auswahl, Sie können in ihr auch ablesen, welche Benutzerkonten bislang Prozesse gestartet haben. Findet sich in der Aufstellung ein Ihnen unbekannter oder eigentlich inaktiver User, sollten Sie umgehend seine Prozesse begutachten und so einen Angriff ausschließen.
Den Prozessdschungel lichten Sie weiter mit "F4". Sobald Sie jetzt einen Begriff eintippen, zeigt htop nur noch die dazu passenden Prozesse an. Bei "snap" erscheinen beispielsweise nur noch Prozesse mit "snap" im Namen – unter Ubuntu also alle Prozesse des Snap-Daemons. Mit der Eingabetaste bleibt der Filter bestehen. Um wieder zur Liste mit allen Prozessen zu gelangen, drücken Sie "F4" und dann "Esc".
Wenn Sie eine Process-ID (PID) in einer Logdatei gefunden haben und jetzt den Verursacher benötigen, tippen Sie die PID in htop direkt über die Zifferntasten ein. Bei der Eingabe markiert das Werkzeug automatisch den nächsten passenden Prozess. Wenn Sie sich vertippt haben, drücken Sie "Pos1" und springen so wieder an den Anfang der Prozessliste.
Prozesse analysieren
Haben Sie den Problemprozess entdeckt, sollten Sie ihn zunächst mit "Umschalt+F" verfolgen. Andernfalls besteht nach einer Aktualisierung der Anzeige die Gefahr, dass er wieder aus dem Blickfeld verschwindet. Anschließend können Sie ihn noch etwas genauer unter die Lupe nehmen. So verrät die Spalte "S", was der Prozess gerade treibt. Die dabei möglichen Buchstaben erklärt die Tabelle "Zustände der Prozesse".
Zustände der Prozesse
 Zustand
Bedeutung
D
Disk Sleep: Der Prozess schläft, wobei er auf einen Systemaufruf wartet (meist eine I/O-Operation)
R
Running: Der Prozess läuft
S
Sleeping: Der Prozess schläft, wobei er auf etwas wartet (wie etwa eine Benutzereingabe)
T
Tracing: Der Prozess wurde gestoppt, etwa von einem Debugger
Z
Zombie: Der Prozess hat sich beendet, befindet sich aber noch im Speicher
Starten Sie ein Skript mit "sh service.sh", kommt anstelle der alten SH meist automatisch eine modernere Shell zum Einsatz. Um die wahre Shell zu identifizieren, drücken Sie "M", dann enthüllt htop die sogenannten Merged Commands und somit den kompletten Pfad zur tatsächlich laufenden Shell.
Via "L" holen Sie die vom Prozess geöffneten Dateien auf den Schirm. Das ist nützlich, wenn der Prozess die Festplatte mit Logdaten vollschreibt und Sie den Speicherort wissen möchten. htop benötigt für diese Information allerdings die Hilfe des Tools lsof. Damit nicht mehrere Programme gleichzeitig in eine Datei schreiben und somit ein Chaos entsteht, blocken einige Prozesse den Zugriff (File Locking). Welche Dateien ein abgestürzter Prozess noch in seinen Fängen hält, verrät "X".
Sind strace und ltrace installiert, können Sie per "S" und "Umschalt+L" die System- und Bibliotheksaufrufe verfolgen. Das hilft vor allem beim Debuggen von eigenen Diensten. Mit "E" holen Sie noch die Umgebungsvariablen auf den Schirm. Damit haben Sie die Option, zumindest Teile der Konfiguration zu prüfen.
Prozesse steuern
Um den nervenden Prozess schließlich abzuschießen, drücken Sie "F9", woraufhin Ihnen htop jetzt zahlreiche Signale offeriert, die Sie dem Prozess senden können. Darunter finden sich etwa "SIGSTOP" und "SIGCONT", die den Prozess anhalten beziehungsweise später wieder fortsetzen. Das bereits vorgeschlagene "SIGTERM" fordert den Prozess auf, sich zu beenden, "SIGKILL" bricht ihn sofort ab. Eine Liste [3] mit allen Signalen und ihrer Bedeutung hält unter anderem Wikipedia bereit.
Linux kann wichtigen Prozessen bevorzugt Rechenleistung zugestehen. Die entsprechende Priorität liefert die Spalte "PRI". Beeinflussen lässt sie sich über den Nice-Wert aus der Spalte "NI". Je niedriger der Nice-Wert, desto mehr Rechenleistung gesteht der Kernel dem Prozess zu. Möglich sind dabei Werte zwischen "-20" für die höchste und "19" für die niedrigste Priorität. Mit "F7" und "F8" erhöhen beziehungsweise verringern Sie den Nice-Wert. Letzteres gelingt allerdings nur, wenn Sie htop mit Root- beziehungsweise Systemverwalterrechten gestartet haben – etwa über ein vorangestelltes "sudo".
Analog steuern Sie den Zugriff auf Ein- und Ausgabegeräte wie Festplatten. Dazu drücken Sie "I" und wählen dann eine Priorität aus. Im Fall von "Idle" darf der Prozess nur dann auf die Festplatte zugreifen, wenn gerade sonst kein anderer Prozess die Festplatte benötigt. Wenn Sie eine mit "Realtime" gekennzeichnete Priorität wählen, kann der Prozess immer sofort auf die Festplatte zugreifen, auch wenn gerade im System noch andere Dinge passieren. Der "Realtime"-Parameter bietet sich daher nur in seltenen Fällen an – etwa bei einer Datenbank, die alleine auf dem Server vor sich hin werkelt. Die übrigen "Best-Effort"-Prioritäten sorgen hingegen für ausgewogene Zugriffe. In jedem Fall gilt: Je geringer die Zahl, desto höher ist die Priorität.
Unter Linux dürfen Sie einen Prozess auch gezielt auf einen oder mehrere Prozessorkerne festnageln (CPU Affinity). Dazu drücken Sie "A" und wählen dann mit der Leertaste die gewünschten Kerne aus. Auf allen mit einem "X" markierten Exemplaren darf der Prozess nach einem Druck auf die Eingabetaste noch laufen.
Anzeige maßschneidern
Sie sind mit htop in der Lage, zu den Prozessen noch weitaus mehr Daten zu erhalten, wie etwa ihre jeweiligen Arbeitsverzeichnisse. Diese Informationen holen Sie über "F2" hinzu. Unter "Meters" wählen Sie jetzt die Informationen aus, die oben links ("Left column") und oben rechts ("Right column") erscheinen. Die verfügbaren Statistiken finden Sie ganz rechts, ihre Beschreibungen sollten selbsterklärend sein, "Date and Time" blendet etwa das Datum und die Uhrzeit ein. Um sie der rechten Spalte hinzuzufügen, fahren Sie mit den Pfeiltasten ganz nach rechts, dann zum Punkt "Date and Time" und drücken die Eingabetaste. Sortieren Sie mit den Pfeiltasten die Zeit in die passende Spalte und an die passende Position. Mit "Del" entfernen Sie das Element, mit der Eingabetaste bestätigen Sie die Position.
Nach dem gleichen Prinzip fügen Sie der Prozessliste weitere Spalten hinzu: Fahren Sie in den Einstellungen hinter "F2" in der Spalte "Setup" zum Punkt "Columns". Die vorhandenen Spalten unter "Active columns" ergänzen Sie wieder mit den Pfeiltasten und der Eingabetaste aus dem Angebot ganz rechts. Die Anzeige des Arbeitsverzeichnisses finden Sie ganz unten ("CWD, Current Working Directory"). Überflüssige Spalten entfernen Sie per "Entf" und via "Esc" verlassen Sie die Einstellungen. Das Tool wendet alle Änderungen immer sofort an und merkt sie sich auch über einen Neustart hinaus in der Konfigurationsdatei "~/ .config/htop/htoprc".
Fazit
Möchten Sie lediglich wissen, welcher Prozess gerade die CPU auffrisst, genügt weiterhin das gute alte top. Die Installation von htop lohnt sich vor allem für Admins, die Prozesse auf einem Server dauerhaft im Blick behalten und komfortabel steuern möchten. Der sehr nützliche Filter sowie die weiteren Funktionen erschließen sich allerdings erst nach dem Auswendiglernen der Tastenkürzel.
(jp)
Link-Codes
[3] Wikipedia: Signal (Unix): https://de.wikipedia.org/wiki/Signal_(Unix)