Überblick im Prozess-Dschungel

Prozessverwaltung unter Linux

Oliver Hamel

Für den produktiven Umgang mit dem Betriebssystem, ist das Verständnis des Ablaufs zum Umgang mit Prozessen essenziell. Ein Prozess ist zunächst nichts anderes als ein Programm während seiner Ausführung. Vom Starten, Anhalten und Fortführen über das Priorisieren und Beenden. Im Folgenden lernen Sie, Ihr System effektiv zu kontrollieren und interne Abläufe zu verstehen. Im ersten Teil stelle ich Ihnen das proc-Dateisystem vor, darauf folgen Programme zur Überwachung und Steuerung von Systemprozessen und Werkzeuge zum Einstellen der grundlegenden Systemeigenschaften. Im letzten Teil lernen Sie lsof, das Kommandozeilentool zur Diagnose von Unixsystemen, kennen.

Das virtuelle proc-Dateisystem [Das proc-Dateisystem ist im Archiv des Linux Kernel unter Documentation/filesystems/proc.txt dokumentiert.] stellt eine Schnittstelle zum Kern des Betriebssystems, dem Linux Kernel dar. Virtuell bedeutet, dass es zur Laufzeit erstellt wird und damit die Informationen „on the fly“ (zum Zeitpunkt des Zugriffs) erzeugt werden. Im Gegensatz zu Dateisystemen, die dem Abspeichern von Dateien dienen, belegt das proc-Dateisystem keinen Speicherplatz auf der Festplatte. Es hält Prozess- und Systeminformationen vor und stellt somit eine Verbindung zu den internen Strukturen des Kernels bereit. Die Darstellung erfolgt, wie bei anderen Dateisystemen, in hierarchischen Katalogen. Der Kernel täuscht quasi das Vorhandensein von Dateien vor, wie sie auf einem Massenspeicher abgelegt werden.

Allgemein

In einem Linux-System wird das proc-Dateisystem beim Systemstart durch den Befehl mount über das Verzeichnis /proc in das bestehende Dateisystem eingebunden. Unterhalb dieses Verzeichnisses finden sich Informationen zu laufenden Prozessen sowie Hard- und Software-Ressourcen. Aus der Sicht des Benutzers verhält sich das proc-Dateisystem wie jedes andere Dateisystem. Verzeichniswechsel können mit cd vorgenommen, Verzeichnisinhalte mit ls angezeigt, Inhalte von Dateien mit more, less, cat oder sysctl [Procps] ausgegeben und Werte, sofern möglich, mit echo oder sysctl verändert werden. Durch das Ändern von Werten während der Laufzeit kann das Verhalten des Betriebssystems direkt beeinflusst werden. Diese Anpassungen sind nur temporär und damit nach einem Neustart des Systems nicht mehr vorhanden. Um bestimmte Werte dauerhaft zu setzen, können Sie diese in der Datei /etc/sysctl.conf festlegen. Die meisten Linux-Distributionen liefern eine Konfigurationsdatei mit vielen praktischen Beispielen aus. Ein Blick in diese Konfigurationsdatei gibt einen Überblick über vielfältige Anpassungsmöglichkeiten des Laufzeitverhaltens. Die Manualpages zu sysctl (8) und sysctl.conf (8) beschreiben die Funktionsweise des Programms und die Syntax der Konfigurationsdatei.

Quelle der Informationen

Das proc-Dateisystem dient vielen Programmen, die Prozess- und Systeminformationen anzeigen und verarbeiten, als Informationsquelle. Der Speicher eines Linux-Systems wird zum Beispiel durch die Datei /proc/meminfo repräsentiert. Der Befehl free [Procps], der den Speicherplatzverbrauch im System anzeigt, greift auf diese Datei zu und gibt die Informationen aufbereitet aus. Listing 1 stellt dieses dar.

Zusätzlich zu der Anzeige des gesamten (MemTotal), freien (MemFree) und gepufferten (Cached) Arbeitsspeicher werden auch Informationen zu aktivem und inaktivem Speicher, Auslagerungsspeicher (Swap) und vielem mehr angezeigt.

Listing 1
-----------------------------------------------------------
# cat /proc/meminfo
        total:         used:         free:          shared:        buffers:       cached:
Mem:    1323622400     1212985344    110637056      0              230420480      734011392
Swap:   1998700544     0             1998700544
MemTotal:      1292600 kB
MemFree:        108044 kB
MemShared:           0 kB
Buffers:        225020 kB
Cached:         716808 kB
SwapCached:          0 kB
Active:         581296 kB
Inactive:       455612 kB
HighTotal:      393200 kB
HighFree:         2044 kB
LowTotal:       899400 kB
LowFree:        106000 kB
SwapTotal:     1951856 kB
SwapFree:      1951856 kB

# free
             total       used       free     shared    buffers     cached
Mem:       1292600    1184596     108004          0     225020     716820
-/+ buffers/cache:     242756    1049844
Swap:      1951856          0    1951856
Einfluss auf die Prozessverwaltung

Jeder Prozess erhält beim Start eine numerische ID, die PID (Process Identifier), über die er im System eindeutig identifiziert werden kann. Zu jedem Prozess gibt es im proc-Dateisystem ein Verzeichnis mit der entsprechenden PID. Der Prozess init, welcher als erster beim Systemstart läuft, hat immer die PID 1. Je nach Konfiguration des Kernels bekommen nachfolgende Prozesse die PID sequenziell oder randomisiert zugewiesen. Listing 2 zeigt das zu dem Prozess init gehörige Verzeichnis /proc/1 an. Tipp: Das Programm pgrep ermittelt die PID(s) eines Prozesses anhand seines Namens.

Der Aufbau eines Verzeichnisses zu einem Prozess unter /proc hat immer die gleiche Struktur:

  • cmdline beeinhaltet die Kommandozeile, mit der dieser Prozess gestartet wurde.
  • cwd ist ein Link auf das aktuelle Arbeitsverzeichnis des Prozesses.
  • environ enthält die Umgebungsvariablen, die für diesen Prozess gesetzt sind.

  • exe ist ein Link auf die ausführbare Programmdatei.
  • fd ist ein Verzeichnis, es enthält die geöffneten Filedeskriptoren des Prozesses.
  • maps enthält Informationen zum Adressbereich des Prozesses und der benutzten Bibliotheken.
  • mem kennzeichnet den Speicherbereich des Prozesses.
  • root ist ein Link auf das Wurzelverzeichnis des Prozesses.
  • stat und statm enthalten Statusinformationen, die unter anderem von dem Programm ps ausgelesen werden.
  • status enthält weitere Statusinformationen des Prozesses, wie Benutzer(UID)- und Gruppen(GID)-Identifikation des Benutzers der den Prozess ausführt, den gegenwärtigen Status, die PPID (Parentprozess-ID), die den Prozess gestartet hat und vieles mehr.
Listing 2
-----------------------------------------------------------
# ls -l /proc/1/
total 0
-r--r--r--    1 root     root            0 Apr  4 20:54 cmdline
lrwxrwxrwx    1 root     root            0 Apr  4 20:54 cwd -> /
-r--------    1 root     root            0 Apr  4 20:54 environ
lrwxrwxrwx    1 root     root            0 Apr  4 20:54 exe -> /sbin/init
dr-x------    2 root     root            0 Apr  4 20:54 fd
-r--r--r--    1 root     root            0 Apr  4 20:54 maps
-rw-------    1 root     root            0 Apr  4 20:54 mem
-r--r--r--    1 root     root            0 Apr  4 20:54 mounts
lrwxrwxrwx    1 root     root            0 Apr  4 20:54 root -> /
-r--r--r--    1 root     root            0 Apr  4 20:54 stat
-r--r--r--    1 root     root            0 Apr  4 20:54 statm
-r--r--r--    1 root     root            0 Apr  4 20:54 status
Licht ins Dunkel bringen

Natürlich ist es nicht nötig, die Informationen innerhalb des proc-Dateisystems händisch zu ermitteln, denn die Anzahl der Programme, welche auf das proc-Dateisystem zugreifen, ist groß. Ein wichtiger Bestandteil jeder Linux-Distribution sind die Programmpakete Procps [Procps] und Coreutils. Das Paket Procps enthält unter anderem die Programme sysctl, top, ps, vmstat, kill und pgrep. Die GNU Coreutils, ursprünglich aufgeteilt auf die Pakete fileutils, shellutils und textutils, stellen einen Großteil der Standard-Linux-Programme. Es ließe sich ein ganzes Buch zu dieser Sammlung von Programmen füllen, in punkto Prozess-Handling interessieren uns primär nice und nohup.

Procps

Die Funktion von sysctl und pgrep haben wir im ersten Teil behandelt, was bietet der Rest? Das Programm top ist eine der wichtigsten Anwendungen des Pakets, es stellt eine dynamische Echtzeit-Sicht auf das laufende System dar. Wie aus Listing 3 zu ersehen ist, werden im oberen Teil der Ausgabe Systeminformationen zusammengefasst, der untere Teil listet die Prozesse mit den wichtigsten Informationen auf. Die Ausgabe wird auf den meisten Systemen eine längere Liste von Anwendungen enthalten, in diesem Beispiel ist dem Benutzer „oh“ der Übersicht halber nur der Blick auf Prozesse, die ihm gehören, gewährt.

Die Liste der Prozesse enthält folgende Informationen, für eine ausführliche Beschreibung konsolidieren Sie die Manualpage top (1):

  • PID, die PID des Prozesses.
  • User listet den Besitzer des Prozesses.
  • PR die Priorität der laufenden Anwendung.
  • NI, der Nice-Wert. Negative Werte bedeuten eine höhere Priorität, Positive eine niedrige Priorität. VIRT, RES und SHR stellen den virtuellen, physikalischen und gemeinsam genutzten Speicher des Prozesses dar.
  • Unterhalb der Spalte S findet sich der Status der Anwendung. In der Regel werden Sie hier ein R für „running“ (aktiv) oder ein S für „sleeping“ (passiv) finden.
  • %CPU gibt die Zeit in Prozent aus, die der Prozess im Vergleich zu den anderen Anwendungen aktiv vom Prozessor genutzt hat.
  • %MEM enthält den prozentualen Anteil des benutzten Arbeitsspeichers.
  • TIME+ die gesamte genutzte Prozessorzeit seit dem Start der Anwendung.
  • Unter COMMAND ist der Aufruf des Programms festgehalten.
Listing 3
-----------------------------------------------------------
top - 23:23:54 up 13 days, 13:31,  1 user,  load average: 0.03, 0.19, 0.17
Tasks:   3 total,   2 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0% us,  0.0% sy,  0.0% ni, 100.0% id,  0.0% wa,  0.0% hi,  0.0% si
Mem:   1027440k total,  1009372k used,    18068k free,     6320k buffers
Swap:   995988k total,      184k used,   995804k free,   391548k cached

PID   USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
14869 oh        16   0 29440 1244  716 R    0  0.1   0:00.07 sshd
17249 oh        16   0  9336 1752 1328 S    0  0.2   0:00.00 bash
19156 oh        16   0 10588 1196  928 R    0  0.1   0:00.00 top 

Über das Programm ps können Sie eine Liste der laufenden Prozesse anzeigen. Im Gegensatz zu top werden die Informationen nicht aktualisiert, ps liefert quasi eine Momentaufnahme. Durch zahlreiche Optionen und deren Kombinationen lässt sich die Ausgabe beeinflussen. Wird ps ohne weitere Optionen aufgerufen, listet es die Prozesse innerhalb der aktuellen Shell. Um alle eigenen Prozesse auszugeben, wird ps mit der Option x aufgerufen. Um die Benutzerkennung der Anwendungen einzublenden, wird die Option u übergeben. Die Option a zeigt die Prozesse aller Benutzer auf dem System.

Ein hervorragendes Arbeitsmittel, um Engpässe im System zu ermitteln, ist vmstat. Vmstat fasst Informationen über Prozesse, Arbeits- und Auslagerungsspeicher, IO (Festplattenzugriffe), Interrupts (kurzfristige Unterbrechung eines Programms durch eine von der CPU abzuarbeitenden Befehlssequenz), Context Switches (Statusänderung in der CPU) und Prozessor-Auslastung zusammen.

Geschrieben von
Oliver Hamel
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.