Speicher erschöpft: OOM-Killer, Befehl „free“ und Erstellung einer Auslagerungsdatei

Linux 4 Min. Lesezeit

Wenn MariaDB, PHP-FPM oder ein anderer Dienst auf dem Server unerwartet ausfällt und die Website einen Fehler bei der Datenbankverbindung anzeigt, ist eine häufige Ursache, dass der Arbeitsspeicher erschöpft ist. In diesem Fall wählt der sogenannte OOM-Killer (Out-of-Memory-Killer) des Linux-Kernels einen Prozess aus, der viel Speicher belegt, und beendet ihn, damit das gesamte System funktionsfähig bleibt. Meistens handelt es sich dabei gerade um den Datenbankserver.

Wie viel freier Speicher ist verfügbar?

free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       2.9Gi       150Mi        45Mi       800Mi       650Mi
Swap:             0B          0B          0B

Ein niedriger Wert in der Spalte „free“ ist an sich kein Problem: Linux nutzt den freien Speicher als Cache (buff/cache) und gibt ihn bei Bedarf wieder frei. Der tatsächlich verfügbare Speicher wird in der Spalte „available“ angezeigt. Wenn dieser Wert dauerhaft unter einige Prozent des Gesamtspeichers fällt und kein Swap vorhanden ist (Swap: 0B), ist der Server dem OOM-Killer ausgesetzt.

Spuren des OOM-Killers

Ob ein Prozess vom OOM-Killer beendet wurde, lässt sich anhand der Kernel-Meldungen feststellen:

sudo journalctl -k | grep -i -E "out of memory|killed process"
sudo dmesg -T | grep -i -E "out of memory|killed process"

Ein tatsächlicher Auszug von einem Testrechner mit 2 GB Arbeitsspeicher und ohne Swap-Partition, auf dem während eines umfangreichen System-Updates der Befehl „dnf“ den gesamten Arbeitsspeicher beanspruchte:

Out of memory: Killed process 16943 (dnf) total-vm:1802676kB, anon-rss:1486780kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:3104kB oom_score_adj:0

In Klammern steht der Name des beendeten Programms, „anon-rss“ gibt den tatsächlich belegten Speicher an (hier ca. 1,4 GB). „dmesg“ kann als normaler Benutzer nicht gelesen werden („read kernel buffer failed: Operation not permitted“), führen Sie den Befehl daher mit „sudo“ aus.

Weitere Informationen zum Auslesen von Logdateien finden Sie hier: Logdateien unter Linux auslesen.

Was beansprucht den Arbeitsspeicher?

ps aux --sort=-%mem | head -n 15

Die Spalten „%MEM“ und „RSS“ (in Kilobyte) zeigen an, wie viel Speicherplatz der jeweilige Prozess belegt. Sie können dies interaktiv mit den Befehlen „top“ oder „htop“ verfolgen (mit der Taste „M“ können Sie die Anzeige nach Speicherplatz sortieren); siehe: Überwachung von Prozessen mit den Befehlen „top“ und „htop“.

Die häufigsten Ursachen:

  • MariaDB/MySQL: Der Wert für „innodb_buffer_pool_size“ ist im Verhältnis zum Arbeitsspeicher des Servers zu hoch eingestellt. Auf kleineren VPS-Servern sollten Sie ihm höchstens 40–50 % des gesamten Arbeitsspeichers zuweisen, wenn der Webserver ebenfalls auf demselben Rechner läuft.
  • PHP-FPM: Der Wert für „pm.max_children“ ist zu hoch. Jeder PHP-Prozess kann 50 bis 150 MB Speicher belegen, sodass 20 parallele Prozesse leicht mehrere Gigabyte beanspruchen können.
  • Ein außer Kontrolle geratenes Skript, ein Speicherleck oder ein plötzlicher Anstieg des Datenverkehrs (Bot, Angriff).

Erstellen einer Auslagerungsdatei

Der Swap ist ein Bereich auf der Festplatte, in den der Kernel selten genutzte Speicherbereiche auslagern kann (siehe: Was ist der Swap unter Linux?). Er ist langsamer als der Arbeitsspeicher und kann daher einen Mangel an RAM nicht ausgleichen, verschafft jedoch bei plötzlichen Spitzenlasten etwas Zeit und kann verhindern, dass der OOM-Killer die Datenbank herunterfährt.

Bitte überprüfen Sie, ob bereits Swap-Speicher vorhanden ist:

swapon --show

Sollte der Befehl keine Ausgabe anzeigen, erstellen Sie beispielsweise eine 2-GB-Swap-Datei:

sudo dd if=/dev/zero of=/swapfile bs=1M count=2048 status=progress
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Damit die Einstellung auch nach einem Neustart erhalten bleibt, fügen Sie sie in die Datei „/etc/fstab“ ein:

echo '/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab

Überprüfung:

swapon --show
free -h
NAME      TYPE SIZE USED PRIO
/swapfile file   2G   0B   -2

Im Test lief nach der Einrichtung der oben genannten 2-GB-Auslagerungsdatei dasselbe Update, das zuvor vom OOM-Killer unterbrochen worden war, fehlerfrei ab, und die Auslagerungsdatei blieb auch nach dem Neustart aktiv.

Wie groß sollte der Swap-Speicher sein? Auf einem VPS mit 1–4 GB Arbeitsspeicher reichen in der Regel 1–2 GB Swap-Speicher aus. Vergewissern Sie sich zuvor mit dem Befehl „df -h /“, dass genügend freier Speicherplatz auf der Festplatte vorhanden ist.

Swappiness

Der Wert „vm.swappiness“ (0–100) legt fest, inwieweit der Kernel den Swap-Speicher gerne nutzt. Der Standardwert hängt von der Distribution und dem eingestellten Profil ab: Auf einem Rechner, der aus einem AlmaLinux 9-Cloud-Image installiert wurde, lag dieser Wert im Test bei 30 (sysctl vm.swappiness). Auf einem Server empfiehlt es sich, diesen Wert niedrig einzustellen, damit der Swap-Speicher nur bei tatsächlichem Bedarf genutzt wird:

echo 'vm.swappiness = 10' | sudo tee /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf

Wenn der Swap-Speicher ständig belegt ist

Wenn laut „free -h“ der Swap-Speicher dauerhaft voll ist und der Server langsam läuft (der „wa“-Wert in der „top“-Ausgabe ist hoch), verfügt der Server über zu wenig Arbeitsspeicher. Reduzieren Sie in diesem Fall die Speicherauslastung der oben genannten Dienste oder wechseln Sie zu einem größeren Paket (siehe: Wie kann ich die Ressourcen meines VPS-Pakets erweitern?).

Bei Shared Hosting wird der Arbeitsspeicher pro Konto durch CloudLinux begrenzt; das Erreichen dieser Speichergrenze führt in der Regel zu einem Fehler 500 oder 503, siehe: CloudLinux-Ressourcenbeschränkungen.

Zurück: Linux-Artikel (62)