Ein Blog über Code, Hardware und Co

Programmieren und Entwickeln, NAS, Server und Co, Technik und Hardware

Welcher Prozess verbraucht wie viel Swap?

Zuletzt aktualisiert am 14. Januar 2023.

Oder: Was ist Swap und wieso sollten die Prozesse identifiziert werden, die Swap-Speicher nutzen?

Jeder Computer verfügt über Festspeicher (in der Regel Festplatten/HDD) und Arbeitsspeicher (RAM). Der RAM ist sehr schneller, aber teurer Zwischenspeicher, der grundsätzlich eine knappe Ressource darstellt.

Rein technisch würde ein Computer einfrieren, wenn der RAM komplett belegt ist. Damit das nicht passiert, vergrößert man den Zwischenspeicher um einen “Ersatzspeicher”. Die Größe dieses “Swap” lässt sich konfigurieren.

Was ist eigentlich Swapping?
Kurz gesagt ist Swapping eine Methode um schnellen, aber teuren RAM (höhere Speicherebene) und größeren/billigeren, aber langsameren Festplattenspeicher (tiefer Speicherebene) zu verbinden und das beste aus beiden Welten zu vereinen.

Jetzt könnte man auf die Idee kommen, seinen Arbeitsspeicher über Swap-Speicher massiv zu erhöhen. Davon sollte man aber absehen, denn der große Nachteil des Swap-Speichers ist, dass er physich auf dem Festspeicher, also der Festplatte, und nicht dem wesentlich schnelleren (weil belegt) RAM liegt.

Sobald das System nun anfängt zu swappen, wird es durch den langsamen swap-Speicher ausgebremst und wird merklich langsamer und der IOWAIT-Wert steigt in der Regel massiv an.

Swappiness: Wusstest du, dass man konfigurieren kann, wie exzessiv der Swap-Speicher vom System genutzt wird?
Dafür gibt es den swappiness-Parameter, der dem Linux-Kernel, also dem System, sagt, wie häufig der Swap genutzt werden soll.

Der Swappiness-Parameter kann Werte von 0 (kein Swapping) bis 100 (direkt swappen) annehmen.
Deine aktuell Konfiguration kannst du auf der Konsole mit folgendem Befehl auslesen: cat /proc/sys/vm/swappiness 

Anpassen kann man die Swappiness über die Konsole ebenfalls:
sysctl vm.swappiness=10

Es ist also immer die bessere Wahl, den Arbeitsspeicher aufzurüsten – der Swap ist hier nur eine Notlösung.

Aber was, wenn es nun schon soweit ist und das System swappt?

Zunächst müssen wir das herausfinden. Und dafür gibt es zum Glück eine ganze Reihe an Möglichkeiten. Wenn du also das Gefühl hast, dein System reagiert träge, oder der IOWAIT-Wert ist hoch, dann zeigen die die folgenden Befehle, wie viel von deinem Swap-Speicher belegt ist:

free
swapon -s
cat /proc/swaps

Letzterer Befehl ist quasi synonym zu “swapon -s”. Die Ausgabe sollte identisch sein.

Welcher Prozess verbraucht wie viel Swap?

Ok. Jetzt wissen wir im Zweifel, dass unser RAM ausgereizt und viel swap-Speicher genutzt wird. Jetzt kann man natürlich direkt hergehen und den RAM aufrüsten (sofern möglich).

Die sinnvollere Alternative ist, zunächst zu schauen, wieso das System swappt und welche Prozesse dafür verantwortlich sind.

Dafür machen wir uns das proc-Dateisystem eines jeden Linux-Betriebssystems zu Nutze, das die laufenden Prozesse auf einem System repräsentiert und weitere Informationen darüber enthält.

Wir schreiben nun ein kleines Shell-Skript, das die laufenden Prozesse mit der zugehörigen SWAP-Nutzung ausgibt.
Wir gehen auf die Konsole und erstellen unser Shell-Skript mit folgendem Befehl:

touch swapusage

Nun öffnen wir die Datei in einem Editor unsere Wahl (z.B. vi) und füllen sie mit dem folgenden Inhalt:

Limit=10000
  for pid in `ls /proc`;
  do
    VmSwap=`awk '/VmSwa/{print $2}' /proc/${pid}/status`;
    if [ ${VmSwap} -gt ${Limit} ];
    then
      ProcessName=`ps -ef|awk '$2=="'"${pid}"'" {print $8}'`;
      echo "ProzessID ${pid}: ${VmSwap} KB, Anwendung: ${ProcessName}";
    fi;
done 2>/dev/null|sort -u -n -k3
TL;DR
Erklärung des Shellskripts im Detail.

Zeile 1: Wir setzen ein Limit, dass wir nur Prozesse angezeigt bekommen wollen, die mindestens 10.000 KB an Swap belegen.

Zeile 2: Wir öffnen eine for-Schleife. mit der wir über jeden Prozesseintrag im Verzeichnis /proc iterieren.

Zeile 4: Mit awk holen wir uns die entsprechenden Daten zur Swapnutzung des Prozesses aus den Statusdaten

Zeile 5: Mit der if-Bedingung beachten wir nur die Einträge, die mindestens 10.000 KB Swap beinhalten.

Zeile 7: Wenn vorhanden wird der Name des jeweiligen Prozesses bzw. die dahinterstehende Anwendung ausgelesen.

Zeile 8: Ausgabe der Daten.

Zeile 9: “done” beendet die for-Schleife. Die Ausgabe von stderr wird zudem nach /dev/null umgeleitet. Die Ausgabe wird mit “sort” nach der Größe der Swapnutzung sortiert.

Jetzt können wir die Datei direkt auf der Konsole ausführen:

./swapusage

Die Ausgabe sieht dann wie folgt aus:

Bild 1: Ausgabe der Prozesse, die SWAP belegen.

Schreibe eine Antwort