NYC Steam - https://www.flickr.com/photos/dok1/2312556913 (CC BY 2.0)

Wie ausgelastet ist mein Server? Von Zombies und Waisen

Ihr Root-Server ist manchmal mehr und manchmal weniger ausgelastet. Verglichen mit der Dampflokomotive im Bild ist es gar nicht so einfach zu sagen, wie ausgelastet das System nun ist. Bei der Lokomotive sieht man den Dampf, bei Ihren PC zuhause hören Sie vielleicht den Lüfter surren, aber bei einem Root-Server in einem Rechenzentrum?

Um einen Überblick über die aktuelle Auslastung zu bekommen gibt es zwei Kommandos: ps und top.

Heute schauen wir uns ps an.

ps

Das Kommando ps erzeugt eine Liste von Prozessen. Der Name ps ist die Abkürzung von process status.

Stellt sich die Frage: Was ist überhaupt ein Prozess?

Zunächst mal ist ein Prozess ein Vorgang, der durch ein Programm kontrolliert wird, das zur Ausführung einen Prozessor benötigt. Zu einem Prozess gehören auch die notwendigen Daten im zugewiesenen Adressraum, die Inhalte von CPU Registern, wenn der Prozess ausgeführt wird und die Systemdaten (Metadaten), die das Betriebssystem aus seiner Sicht über den Prozess speichert, beispielsweise die laufende Nummer des Prozesses, die Startzeit, die verbrauchte CPU Zeit und den aktuellen Status des Prozesses. Das Kommando ps kann alle Metadaten aller Prozesse anzeigen.

Zu den laufenden Prozessen, die von ps angezeigt werden, gehören auch sogenannte Zombie Prozesse. Ein Zombie Prozess ist ein beendeter Prozess, der aber trotzdem noch in der Prozesstabelle auftaucht und Systemressourcen belegt.

Beispiel für einen Zombie Prozess:

Wenn Sie Ihren Apache Webserver automatisch bei einem Neustart des Rechners starten lassen, aber beim TLS Zertifikat ein Passwort verlangen, das per Hand eingeben werden muss, so führt dies zu einem Zombie Prozess. Der Webserver versucht zu starten, kann aber nicht, weil das Passwort fehlt. Sie können die Aufforderung nicht sehen, weil Sie die Konsolenmeldungen normalerweise nicht sehen.

Ausser den Zombie Prozessen gibt es noch verwaiste Prozesse.

Ein Prozess kann einen neuen Prozess starten. Man nennt diese Kombination Eltern-Kind Prozesse.

Beispiel für einen verwaisten Prozess:

Wir bleiben beim Apache Webserver. Wenn der Webserver gestartet wird startet damit normalerweise ein einzelner Steuerprozess. Wenn nun viele Besucher die Websites besuchen, die der Apache Webserver ausliefert, startet dieser Steuerprozess zusätzliche Kind-Prozesse um mehr Systemressourcen verwalten zu können und schneller auf Anfragen zu reagieren. Wenn die Last nachlässt und/oder der Webserver neugestartet wird, müssen alle Kind-Prozesse wieder beendet werden. Normalerweise klappt das gut, aber manchmal bleibt einer der Kind-Prozesse aus unterschiedlichsten Gründen erhalten. Dieser Waise hat keinen Eltern-Prozess mehr und kann zu erheblichen Problemen im System führen, weil einfach nicht berechenbar ist, was passieren kann.

Aber lassen Sie uns zunächst die Ausgaben des Befehls etwas näher ansehen.

Parameter

Das Kommando ps kann mit unterschiedlichen Parametern aufgerufen werden. Diese Parameter können auch kombiniert werden.

l – Langes Format

novatrend@server1:~$ ps l
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  2352  2351  20   0  26912  7980 wait   Ss   pts/0      0:00 -bash
0  1000  2450  2449  20   0  12676  1220 wait   Ss+  pts/1      0:00 bash -c cd /srv/pump.io; npm start
0  1000  2451  2450  20   0 964624 35396 ep_pol Sl+  pts/1      0:00 npm
0  1000  2457  2451  20   0   4448   660 wait   S+   pts/1      0:00 sh -c ./bin/pump
0  1000  2458  2457  20   0 674584 37712 ep_pol Sl+  pts/1      0:00 node ./bin/pump
0  1000  2460  2458  20   0 859432 66768 ep_pol Sl+  pts/1      0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
0  1000  4642  2352  20   0  10240  1004 -      R+   pts/0      0:00 ps l

u – User Format (Mit User und Startzeit)

novatrend@server1:~$ ps u
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
novatre+  2352  0.0  0.3  26912  7980 pts/0    Ss   11:00   0:00 -bash
novatre+  2450  0.0  0.0  12676  1220 pts/1    Ss+  11:01   0:00 bash -c cd /srv/pump.io; npm start
novatre+  2451  0.0  1.7 964624 35396 pts/1    Sl+  11:01   0:00 npm
novatre+  2457  0.0  0.0   4448   660 pts/1    S+   11:01   0:00 sh -c ./bin/pump
novatre+  2458  0.0  1.8 674584 37712 pts/1    Sl+  11:01   0:00 node ./bin/pump
novatre+  2460  0.0  3.2 859432 66768 pts/1    Sl+  11:01   0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
novatre+  4651  0.0  0.0  18672  1212 pts/0    R+   15:47   0:00 ps u

a – Alle Prozesse, auch die anderer User

Hier werden auch die TTY-Prozesse angezeigt. TTY bezeichnet das Text-Terminal aus dem der Prozess gestartet wurde. Linux hat normalerweise sechs Text-Terminals, auch virtuelle Konsolen oder Terminalemulationen genannt, an denen man sich anmelden kann.

novatrend@server1:~$ ps a
  PID TTY      STAT   TIME COMMAND
  743 tty4     Ss+    0:00 /sbin/getty -8 38400 tty4
  746 tty5     Ss+    0:00 /sbin/getty -8 38400 tty5
  751 tty2     Ss+    0:00 /sbin/getty -8 38400 tty2
  752 tty3     Ss+    0:00 /sbin/getty -8 38400 tty3
  755 tty6     Ss+    0:00 /sbin/getty -8 38400 tty6
1975 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
2352 pts/0    Ss     0:00 -bash
2450 pts/1    Ss+    0:00 bash -c cd /srv/pump.io; npm start
2451 pts/1    Sl+    0:00 npm
2457 pts/1    S+     0:00 sh -c ./bin/pump
2458 pts/1    Sl+    0:00 node ./bin/pump
2460 pts/1    Sl+    0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
4668 pts/0    R+     0:00 ps a

x – Auch Daemon-Prozesse (Ohne eigene TTY-Leitung)

Daemon Prozesse sind so etwas wie der Webserver Prozess. Diese Prozesse werden normalerweise mit Root-Rechten gestartet und tauchen hier nicht auf. Wenn Sie den Befehl mit root Rechten aufrufen sudo ps x, sehen Sie auch die Daemon Prozesse

novatrend@server1:~$ sudo ps x
[sudo] password for novatrend:
  PID TTY      STAT   TIME COMMAND
    1 ?        Ss     0:01 /sbin/init
    2 ?        S      0:00 [kthreadd]
...
1441 ?        S      0:00 /bin/bash /usr/share/apache2/ask-for-passphrase serverblogger.ch:443 RSA
1918 ?        Ss     0:00 /usr/sbin/apache2 -k start
1975 tty1     Ss+    0:00 /sbin/getty -8 38400 tty1
2303 ?        Ss     0:00 sshd: novatrend [priv]
4129 ?        S<     0:00 [kworker/u3:1]
4800 pts/0    S+     0:00 sudo ps x
4801 pts/0    R+     0:00 ps x

f – Forest (Wald) Format – Der Prozessbaum wird dargestellt

Hier sieht man gut die Eltern und Kind Struktur.

novatrend@server1:~$ ps f
  PID TTY      STAT   TIME COMMAND
2450 pts/1    Ss+    0:00 bash -c cd /srv/pump.io; npm start
2451 pts/1    Sl+    0:00  \_ npm
2457 pts/1    S+     0:00      \_ sh -c ./bin/pump
2458 pts/1    Sl+    0:00          \_ node ./bin/pump
2460 pts/1    Sl+    0:01              \_ /usr/bin/nodejs /srv/pump.io/bin/pump
2352 pts/0    Ss     0:00 -bash
4686 pts/0    R+     0:00  \_ ps f

w – Wide (breite) Ausgabe – Zeilen werden nicht abgeschnitten

Hat in diesem Fall keinen Effekt, da die Zeilen relativ kurz sind

novatrend@server1:~$ ps w
  PID TTY      STAT   TIME COMMAND
2352 pts/0    Ss     0:00 -bash
2450 pts/1    Ss+    0:00 bash -c cd /srv/pump.io; npm start
2451 pts/1    Sl+    0:00 npm
2457 pts/1    S+     0:00 sh -c ./bin/pump
2458 pts/1    Sl+    0:00 node ./bin/pump
2460 pts/1    Sl+    0:01 /usr/bin/nodejs /srv/pump.io/bin/pump
4687 pts/0    R+     0:00 ps w

Ausgabe einschränken

Hier ein Beispiel für alle Prozesse, auch die anderer User und die Daemon Prozesse, mit dem Komando grep gefiltert auf Apache. In diesem erhalten wir keine Überschrift, da nur die Zeile, die den String „apache“ enthalten, ausgegeben werden.

novatrend@server1:~$ sudo ps ax | grep apache
1441 ?        S      0:00 /bin/bash /usr/share/apache2/ask-for-passphrase serverblogger.ch:443 RSA
1918 ?        Ss     0:00 /usr/sbin/apache2 -k start
1928 ?        S      0:20 /usr/sbin/apache2 -k start
1929 ?        S      0:20 /usr/sbin/apache2 -k start
1988 ?        S      0:19 /usr/sbin/apache2 -k start
2126 ?        S      0:19 /usr/sbin/apache2 -k start
2127 ?        S      0:19 /usr/sbin/apache2 -k start
2129 ?        S      0:19 /usr/sbin/apache2 -k start
2132 ?        S      0:20 /usr/sbin/apache2 -k start
2299 ?        S      0:19 /usr/sbin/apache2 -k start
2300 ?        S      0:19 /usr/sbin/apache2 -k start
2302 ?        S      0:19 /usr/sbin/apache2 -k start
4809 pts/0    S+     0:00 grep --color=auto apache

Die 10 Prozesse, die am meisten Speicher benötigen

ps -auxf | sort -nr -k 4 | head -10

Die 10 Prozesse, die am meisten CPU Zeit benötigen

ps -auxf | sort -nr -k 3 | head -10

Ausgabe verstehen und einordnen

Am Beispiel des u – Parameters (Mit User und Startzeit) gehe ich mal die Ausgabe durch

novatrend@server1:~$ ps u

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
novatre+  2352  0.0  0.3  26912  7980 pts/0    Ss   11:00   0:00 -bash
novatre+  2450  0.0  0.0  12676  1220 pts/1    Ss+  11:01   0:00 bash -c cd /srv/pump.io; npm start
novatre+  2451  0.0  1.7 964624 35396 pts/1    Sl+  11:01   0:00 npm
  • User: Der Benutzername der den Prozess gestartet hat
  • PID: Prozess-ID
  • %CPU: Auslastung der CPU. Der Wert ist die gesamte CPU Zeit geteilt durch die Laufzeit des Prozesses ausgedrückt als Prozentzahl (Auf dem Testserver ist also wenig los 🙂 )
  • %MEM. Das Verhältnis zwischen den vom Prozess genutzen Speicher und dem gesamten Speicher der Maschine ausgedrückt in Prozent
  • VSZ: Die Grösse des virtuellen Speichers in KiloBytes.
  • RSS: Die Grösse des residenten Speichers in KiloBytes.
  • TTY: Terminal von dem aus der Prozess aufgerufen wurde
  • STAT: Der Status des Prozesses. D für uninterruptable sleep (wartet auf Eingabe), R für running (laufend), S für sleeping (schlafend), T für traced (angehalten), X für dead (tot) und Z für einen Zombie-Prozess. In unserem Fall steht da Ss, Ss+ und Sl+. Das grosse S steht dafür, dass diese Prozesse schlafen, das kleine sagt aus, dass diese Prozesse ein session leader Prozesse sind (also potentielle Eltern). Das + Zeichen steht für einen Prozess der im Vordergrund läuft, das l für einen multi-threaded Prozess
  • START: Die Zeit, wann der Prozess gestartet wurde. Je nachdem, wie lange der Zeitpunkt her ist, wird er in Minuten, Stunde oder Tagen angegeben.
  • TIME: Die CPU Zeit, die dieser Prozess bisher „verbraucht“ hat
  • COMMAND: Das ist die Programmzeile, mit der der Prozess aufgerufen worden ist

Die wirklich gute und komplette Übersicht über die einzelnen Parameter, Ausgaben und deren Bedeutungen gibt die die Handbuchseite des Debian Projekts – http://manpages.debian.org/cgi-bin/man.cgi?query=ps

Was kann ich mit den Prozessen machen?

Ich kann mit den Prozessen kommunizieren indem ich Ihnen Signale schicke. Dazu bietet Linux Befehle wie kill, skill, renice und viele andere mehr.

kill

Wie der Name schon andeutet, geht es darum einen Prozess zu beenden. Um ihn zu nutzen, muss ich die Prozess-ID kennen. Allerdings weiss ich als Administrator nicht, wie das Programm auf verschiedene Parameter des kill Befehls reagieren wird, da die Reaktion abhängig von der Programmierung ist. Einzig das Signal 9 ist festgelegt und beendet einen Prozess. Der Befehl, der einen Prozess beendet lautet also

kill -9 [pid]

skill

In diesem Fall brauche ich keine Prozess-ID sondern den Namen von Benutzern, Programmen oder TTY Leitungen.

skill -9 [name]

renice

Der nice Wert gibt die Priorität von Prozessen im Bereich von -20 bis 19 an.

renice 15 -p 5678

verändert beispielsweise die Priorität des Prozesses mit der pid 5678 auf 15.

Interprozesskommunikation

Unter Interprozesskommunikation versteht man alle Methoden zum Informationsaustausch zwischen Prozessen. Da geht es um solche Buzzwords wie Multitasking, Multithreading, Shared memory, Pipes und Datenströme im Allgemeinen.

Im Grunde geht es also um fast alles, was mit Betriebssystemen zu tun hat. Und der Befehl ps listet all diese Prozesse auf. Zum Glück werden Sie vermutlich nur den „kill -9“ Befehl hin- und wieder brauchen


tl;dr: Der Befehl ps bietet Ihnen eine Übersicht über alle Prozesse Ihres Systems.


Beitrag veröffentlicht

in

von

Schlagwörter:

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert