Speicherleck erkennen und beheben
Speicherlecks auf Linux-Servern erkennen, den RAM-verbrauchenden Prozess identifizieren und kurz- sowie langfristige Lösungen anwenden.
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 -hnimmt 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
# 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?
# 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
# 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
# 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
# /etc/php/8.x/fpm/pool.d/www.conf
# pm.max_requests = 500
# memory_limit = 256M
Schritt 5: Notfalllösungen
# 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).
Verwandte Artikel
SSH-Verbindungsproblem: Keine Verbindung zum Server möglich
Anleitung zur Behebung von SSH-Verbindungsproblemen: Path.net Firewall-Regeln, Default Block, Filterregel für SSH-Port erstellen und Fehlerbehebungsschritte.
RDP-Verbindungsproblem: Keine Verbindung zu Windows Server
Anleitung zur Behebung von RDP-Verbindungsproblemen: Path.net Firewall-Regeln, Default Block, Filterregel für RDP-Port erstellen und Fehlerbehebungsschritte.
MTR-Test durchführen und Ergebnisse an Support senden
Anleitung zum Netzwerktest mit WinMTR und Linux MTR, ICMP-Filterregel erstellen und Ergebnisse an das Support-Team senden. Paketverlust und Latenz diagnostizieren.