Zum Hauptinhalt springen
Zurück zur Kategorie

Speicherleck erkennen und beheben

Speicherlecks auf Linux-Servern erkennen, den RAM-verbrauchenden Prozess identifizieren und kurz- sowie langfristige Lösungen anwenden.

Lesezeit: 13 min Fehlerbehebung
speichermemory leakRAMvalgrindsmemlinuxperformance

Inhaltsverzeichnis

Einführung

Ein Speicherleck tritt auf, wenn eine Anwendung verwendeten Speicher nicht ordnungsgemäß freigibt, wodurch die RAM-Nutzung im Laufe der Zeit kontinuierlich ansteigt. Schließlich geht dem System der Speicher aus, der Swap-Bereich füllt sich und der Server verlangsamt sich oder stürzt ab.

Symptome

Typische Anzeichen eines Speicherlecks:

  • RAM-Nutzung steigt kontinuierlich (kehrt nach Neustart zur Normalität zurück)
  • Verfügbarer Speicher in free -h nimmt allmählich ab
  • Swap-Nutzung steigt
  • Anwendung verlangsamt sich im Laufe der Zeit
  • OOM-Killer aktiviert sich und tötet Prozesse

Schritt 1: Aktuellen Speicherstatus prüfen

hljs bash
# Allgemeiner Speicherstatus
free -h

# Detaillierte Speicherinfo
cat /proc/meminfo

# OOM-Killer-Protokolle
dmesg | grep -i 'oom\|killed process\|out of memory'

Schritt 2: Welcher Prozess verbraucht am meisten Speicher?

hljs bash
# Nach Speichernutzung sortieren
ps aux --sort=-%mem | head -20

# Echtzeit-Überwachung mit top
top
# 'M' drücken zum Sortieren nach Speicher

# Detailliertere Speicheranalyse mit smem
sudo apt install smem -y
smem -r -k | head -20

Schritt 3: Speicherleck bestätigen

hljs bash
# PID eines bestimmten Prozesses finden
pgrep -f app_name

# Speichernutzung alle 30 Sekunden protokollieren
while true; do
    echo "$(date): $(cat /proc/PID/status | grep VmRSS)"
    sleep 30
done

Schritt 4: Anwendungsspezifische Lösungen

Node.js Speicherleck

hljs bash
# Node.js Speicherlimit setzen
node --max-old-space-size=512 app.js

# PM2 Auto-Neustart bei Speicherlimit
pm2 start app.js --max-memory-restart 500M

PHP-FPM Speicherleck

hljs bash
# /etc/php/8.x/fpm/pool.d/www.conf
# pm.max_requests = 500
# memory_limit = 256M

Schritt 5: Notfalllösungen

hljs bash
# Seiten-Cache leeren (sicher)
sync && echo 1 > /proc/sys/vm/drop_caches

# Dienst neu starten
sudo systemctl restart service_name

# Speicherlimit mit systemd
# [Service]
# MemoryMax=512M

# Swap-Datei erstellen
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

Fazit

Um Speicherlecks zu beheben, identifizieren Sie zunächst mit ps aux und smem, welcher Prozess Speicher verbraucht, und bestätigen Sie das Leck durch Überwachung des Wachstums im Zeitverlauf. Kurzfristig starten Sie den lecken Dienst neu und wenden Sie ein Speicherlimit mit systemd an. Für eine dauerhafte Lösung untersuchen Sie den Quellcode der Anwendung mit Tools wie Valgrind (C/C++), heapdump (Node.js) oder jmap (Java).