Zum Hauptinhalt springen
Zurück zur Kategorie

Diagnose von hoher CPU- und RAM-Auslastung

Anleitung zur Diagnose hoher CPU- und RAM-Auslastung auf Servern mit top, htop, ps-Befehlen, OOM-Killer-Mechanismus, Prozessanalyse und Ressourcenoptimierung.

Lesezeit: 15 Min. Fehlerbehebung
cpuramtophtoppsoom-killerspeicherleistung

Inhaltsverzeichnis

Einführung

Hohe CPU- oder RAM-Auslastung auf Ihrem Server kann zu Leistungseinbußen, Dienstunterbrechungen und sogar dazu führen, dass der Server nicht mehr reagiert. In dieser Anleitung untersuchen wir die Tools und Methoden zur Identifizierung ressourcenintensiver Prozesse und zur Lösung des Problems.

Schnelle Statusprüfung

top-Befehl

top ist das grundlegendste Tool zur Echtzeit-Überwachung von Systemressourcen:

hljs bash
top

Wichtige Felder:

  • %CPU: Prozessorauslastung in Prozent
  • %MEM: Speicherauslastung in Prozent
  • RES: Physische RAM-Nutzung
  • VIRT: Virtuelle Speichernutzung
  • TIME+: Gesamte CPU-Zeit

Nützliche Tastenkürzel:

  • P — Nach CPU-Auslastung sortieren
  • M — Nach Speicherauslastung sortieren
  • k — Prozess beenden (PID eingeben)
  • 1 — Jeden CPU-Kern einzeln anzeigen
  • c — Vollständige Befehlszeile anzeigen

htop-Befehl

htop ist eine erweiterte und benutzerfreundlichere Version von top:

hljs bash
# Installation
sudo apt install htop -y

# Ausführen
htop

htop-Vorteile:

  • Farbige visuelle Oberfläche
  • Mausunterstützung
  • Horizontales und vertikales Scrollen
  • Baumansicht (F5)
  • Filterung (F4) und Suche (F3)

Einmalige Statusansicht

hljs bash
# Top 10 Prozesse nach CPU-Auslastung
ps aux --sort=-%cpu | head -11

# Top 10 Prozesse nach RAM-Auslastung
ps aux --sort=-%mem | head -11

# Prozesse eines bestimmten Benutzers
ps -u www-data --sort=-%cpu

# Prozessbaum-Ansicht
ps auxf

CPU-Auslastungsanalyse

Identifizierung von CPU-intensiven Prozessen

hljs bash
# Echtzeit-CPU-Auslastung
mpstat -P ALL 1 5

# CPU-Auslastung pro Prozess (5-Sekunden-Intervalle)
pidstat -u 5 3

# CPU-Auslastung eines bestimmten Prozesses
pidstat -p PID_NUMMER 1

CPU-Auslastungsverlauf

hljs bash
# Historische CPU-Daten mit sar
sar -u 1 10

# CPU-Auslastung der letzten 24 Stunden
sar -u -f /var/log/sysstat/sa$(date +%d)

# Load-Average-Prüfung
uptime
cat /proc/loadavg

Der Load-Average-Wert sollte mit Ihrer CPU-Kernanzahl verglichen werden. Auf einem 4-Kern-Server bedeutet ein Load Average von 4,0 eine 100%ige CPU-Auslastung. 8,0 bedeutet Überlastung.

Analyse CPU-intensiver Prozesse

hljs bash
# Detaillierte Prozessinformationen
ps -p PID_NUMMER -o pid,ppid,user,%cpu,%mem,etime,cmd

# Offene Dateien eines Prozesses
lsof -p PID_NUMMER

# Systemaufrufe eines Prozesses
strace -p PID_NUMMER -c

# Prozess-Threads
ps -T -p PID_NUMMER

RAM-Auslastungsanalyse

Speicherstatusprüfung

hljs bash
# Allgemeiner Speicherstatus
free -h

# Detaillierte Speicherinformationen
cat /proc/meminfo

# Speichernutzungsübersicht
vmstat 1 5

free -h Ausgabe lesen:

              total        used        free      shared  buff/cache   available
Mem:           16Gi       8.2Gi       1.1Gi       256Mi       6.7Gi       7.2Gi
Swap:          4.0Gi       512Mi       3.5Gi

Unter Linux kann der "freie" Speicher niedrig erscheinen, da das System freien Speicher als Disk-Cache verwendet. Der tatsächlich verfügbare Speicher steht in der Spalte "available".

Identifizierung RAM-intensiver Prozesse

hljs bash
# Sortierung nach RSS (Resident Set Size)
ps aux --sort=-rss | head -11

# Detaillierte Speicheranalyse mit smem
sudo apt install smem -y
smem -t -k -s rss

# Speichernutzung pro Prozess
pmap -x PID_NUMMER

Swap-Nutzungsanalyse

hljs bash
# Prozesse, die Swap verwenden
for file in /proc/*/status; do
  awk '/VmSwap|Name/{printf $2 " " $3}END{print ""}' $file
done | sort -k 2 -n -r | head -10

# Swap-Aktivität überwachen
vmstat 1 10

# Swappiness-Wert
cat /proc/sys/vm/swappiness

# Swappiness setzen (temporär)
sudo sysctl vm.swappiness=10

# Swappiness setzen (permanent)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

OOM-Killer-Mechanismus

Der Linux-Kernel aktiviert den OOM (Out of Memory) Killer, wenn der Speicher erschöpft ist, und beendet den Prozess mit dem höchsten Speicherverbrauch.

OOM-Killer-Logs prüfen

hljs bash
# Nach OOM-Killer-Ereignissen suchen
dmesg | grep -i "oom\|out of memory"

# OOM in Systemlogs
journalctl -k | grep -i oom

# Letzte OOM-Ereignisse
grep -i 'oom' /var/log/syslog

OOM-Score-Prüfung

hljs bash
# OOM-Score eines Prozesses
cat /proc/PID_NUMMER/oom_score

Schutz vor OOM Killer

hljs bash
# Kritischen Prozess vor OOM Killer schützen
echo -1000 > /proc/PID_NUMMER/oom_score_adj

# OOM-Schutz im systemd-Dienst
[Service]
OOMScoreAdjust=-1000

Wenn der OOM Killer einen Prozess beendet, deutet dies auf ein ernstes Speicherproblem auf Ihrem Server hin. OOM-Schutz hinzuzufügen, ohne die Ursache zu finden, löst das Problem nicht.

Prozessverwaltung

Prozesspriorität anpassen

hljs bash
# Mit Nice-Wert starten (-20 höchste, 19 niedrigste Priorität)
nice -n 10 ./lange-aufgabe.sh

# Priorität eines laufenden Prozesses ändern
renice -n 15 -p PID_NUMMER

Prozesse beenden

hljs bash
# Sanftes Beenden (SIGTERM)
kill PID_NUMMER

# Erzwungenes Beenden (SIGKILL)
kill -9 PID_NUMMER

# Nach Name beenden
killall prozess_name
pkill -f "prozess_muster"

Ressourcenüberwachungsskript

hljs bash
#!/bin/bash
CPU_THRESHOLD=90
MEM_THRESHOLD=90
LOG_FILE="/var/log/resource-monitor.log"

while true; do
  TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
  CPU_USAGE=$(top -bn1 | grep 'Cpu(s)' | awk '{print $2}' | cut -d'.' -f1)
  if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
    echo "[$TIMESTAMP] WARNUNG: CPU-Auslastung $CPU_USAGE%" >> $LOG_FILE
    ps aux --sort=-%cpu | head -6 >> $LOG_FILE
  fi
  MEM_USAGE=$(free | grep Mem | awk '{printf("%.0f", $3/$2 * 100)}')
  if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
    echo "[$TIMESTAMP] WARNUNG: RAM-Auslastung $MEM_USAGE%" >> $LOG_FILE
    ps aux --sort=-%mem | head -6 >> $LOG_FILE
  fi
  sleep 60
done

Fazit

Hohe CPU- und RAM-Auslastung sind kritische Probleme, die die Serverleistung direkt beeinflussen. Mit Tools wie top, htop, ps und vmstat können Sie problematische Prozesse identifizieren, Prioritäten mit nice/renice anpassen und Prozesse bei Bedarf beenden. Die regelmäßige Überprüfung der OOM-Killer-Logs ist wichtig für die frühzeitige Erkennung von Speicherproblemen.