Linux System-Monitoring – CPU, RAM, Disk und Prozesse im Blick behalten
Ein langsamer Server oder ein voll gelaufenes Dateisystem – solche Probleme schnell zu erkennen und zu lösen ist eine Kernkompetenz für jeden Linux-Administrator. Linux liefert dafür exzellente Bordmittel mit, die ohne Installation verfügbar sind.
Dieser Guide zeigt dir, wie du CPU, RAM, Disk, Netzwerk und Prozesse effektiv überwachst und Probleme systematisch eingrenzt.
Schnellübersicht: System auf einen Blick
# Systeminformationen auf einen Blick
uname -a # Kernel-Version
lsb_release -a # Distribution und Version
hostname # Hostname
uptime # Laufzeit und Load Average
Das /proc-Dateisystem
Linux exportiert Systemzustand als Pseudo-Dateisystem:
cat /proc/cpuinfo # CPU-Informationen
cat /proc/meminfo # Speicher-Informationen
cat /proc/loadavg # Load Average
cat /proc/uptime # Uptime in Sekunden
cat /proc/version # Kernel-Version
CPU und Last überwachen
Load Average verstehen
uptime
# 10:30:00 up 5 days, 2:15, 1 user, load average: 0.85, 1.20, 0.95
# 1min 5min 15min
Load Average interpretieren:
- Wert gleich Anzahl der CPU-Kerne = 100% ausgelastet
- Wert größer als Kerne = Überlastung (Prozesse warten)
# Anzahl CPU-Kerne
nproc
# 4
# Load Average 0.85 bei 4 Kernen = ~21% Auslastung ✓
# Load Average 5.2 bei 4 Kernen = 130% = Überlastung ✗
CPU-Details
# CPU-Modell und Kerne
lscpu
lscpu | grep -E "Model name|CPU\(s\)|Thread"
# CPU-Frequenz (live)
cat /proc/cpuinfo | grep "cpu MHz"
# CPU-Temperatur (wenn sensors installiert)
sudo apt install lm-sensors
sensors
CPU-Nutzung per Prozess
# Top-CPU-Prozesse
ps aux --sort=-%cpu | head -10
# CPU-Nutzung live
top
# Dann: 1 (alle Kerne anzeigen), P (nach CPU sortieren)
RAM und Swap analysieren
Freien Speicher anzeigen
# Übersichtliche Darstellung
free -h
# total used free shared buff/cache available
# Mem: 7.7Gi 2.3Gi 1.2Gi 68Mi 4.2Gi 5.1Gi
# Swap: 2.0Gi 0B 2.0Gi
Spalten erklärt:
total– Gesamter RAMused– Aktiv genutzter RAMfree– Wirklich frei (ungenutzter Puffer)buff/cache– Buffer/Cache (vom Kernel genutzt, kann bei Bedarf freigegeben werden)available← Das ist die relevante Zahl! Wie viel kann ein neuer Prozess bekommen?
# Detaillierte Speicherinfo
cat /proc/meminfo | grep -E "MemTotal|MemFree|MemAvailable|SwapTotal|SwapFree|Cached"
# Swap-Nutzung (welche Prozesse nutzen Swap?)
sudo smem -rs swap | head -10
# oder
sudo cat /proc/*/status 2>/dev/null | grep -E "Name:|VmSwap:" | paste - - | awk '$4 > 0'
Speicherhungrige Prozesse
# Top-10 nach RAM-Nutzung
ps aux --sort=-%mem | head -10
# Detailliert (mit Prozessname)
ps aux --sort=-%mem | awk '{printf "%-10s %-6s %-6s %s\n", $1, $2, $4, $11}' | head -10
Swap-Konfiguration
# Swappiness-Wert anzeigen (0=kein Swap, 100=aggressiv)
cat /proc/sys/vm/swappiness
# 60 (Standard)
# Temporär ändern (sofort wirksam)
sudo sysctl vm.swappiness=10
# Dauerhaft (in /etc/sysctl.conf)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
Empfehlung:
vm.swappiness=10für Server mit viel RAM. Swap sollte Notreserve sein, kein Regelbetrieb.
Festplattennutzung prüfen
Übersicht Dateisysteme
# Alle eingehängten Dateisysteme (human-readable)
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 32G 15G 69% /
# /dev/sda2 100G 45G 50G 47% /data
# tmpfs 3.9G 0 3.9G 0% /dev/shm
# Nur echte Dateisysteme (keine tmpfs/devtmpfs)
df -h --type=ext4 --type=xfs --type=btrfs
# Inodes (statt Bytes)
df -i
Achtung: Ein System kann voll sein, obwohl
df -hnoch Platz zeigt – wenn alle Inodes verbraucht sind!
Verzeichnisgrößen
# Größe eines Verzeichnisses
du -sh /var/log
# 2.3G /var/log
# Alle Unterverzeichnisse sortiert nach Größe
du -sh /var/log/* | sort -h
# Top-10 größten Verzeichnisse (gut für Root-Ursachen-Analyse)
du -h /var 2>/dev/null | sort -h | tail -20
# Nur eine Ebene tief
du -h --max-depth=1 /var | sort -h
Platz freimachen
# Log-Dateien komprimieren
sudo journalctl --vacuum-size=500M
sudo journalctl --vacuum-time=4weeks
# Nicht mehr benötigte Pakete
sudo apt autoremove -y
sudo apt autoclean
# APT-Cache leeren
sudo apt clean
# Große Dateien finden
sudo find / -type f -size +100M 2>/dev/null | sort -k5 -h
# oder:
sudo find /var /tmp /home -type f -size +50M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h
# Temp-Dateien
sudo find /tmp -type f -mtime +7 -delete
Prozesse und Ressourcen: top, htop, ps
top – der Klassiker
top
Tastenkürzel in top:
q Beenden
1 Alle CPU-Kerne einzeln anzeigen
M Nach Speicher sortieren (Shift+M)
P Nach CPU sortieren (Shift+P)
k Prozess beenden (PID eingeben)
r Nice-Wert ändern (Priorität)
h Hilfe
htop – interaktiver und übersichtlicher
# Installation
sudo apt install -y htop
htop
htop-Vorteile gegenüber top:
- Farbige, übersichtliche Darstellung
- Maus-Unterstützung
- Prozess-Baum (F5)
- Einfaches Beenden ohne PID (F9)
Tastenkürzel in htop:
F1 Hilfe
F3 Suchen
F4 Filtern
F5 Prozessbaum
F6 Sortierung wählen
F9 Prozess beenden
F10 Beenden
u Nach Benutzer filtern
ps – Snapshot der Prozesse
# Alle Prozesse (ausführlich)
ps aux
# Nach CPU sortiert
ps aux --sort=-%cpu | head -15
# Nach RAM sortiert
ps aux --sort=-%mem | head -15
# Prozessbaum
ps axjf
pstree
# Nur eigene Prozesse
ps ux
# Spezifischen Prozess suchen
ps aux | grep nginx
Prozess-Details
# Alle Details eines Prozesses (nach PID)
cat /proc/1234/status
cat /proc/1234/cmdline | tr '\0' ' '
ls -la /proc/1234/fd | wc -l # Anzahl offener Dateien
# Offene Dateien eines Prozesses
sudo lsof -p 1234
# Prozess-Tree einer PID
pstree -p 1234
Netzwerkverbindungen überwachen
Aktive Verbindungen
# Offene Ports und lauschende Dienste
sudo ss -ltnp
# Alternativ (älterer Befehl):
sudo netstat -ltnp
# Alle aktiven Verbindungen
sudo ss -tnp
# UDP-Ports
sudo ss -lunp
# Statistiken
ss -s
ss-Output verstehen:
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:*
LISTEN= Port offen, wartet auf VerbindungenESTABLISHED= Aktive Verbindung0.0.0.0:80= Lauscht auf allen Interfaces127.0.0.1:3306= Nur lokal erreichbar (gut für DBs!)
Netzwerk-Traffic live
# Installation
sudo apt install -y iftop nethogs
# Traffic nach Interface
sudo iftop -i eth0
# Traffic nach Prozess
sudo nethogs eth0
# Einfache Statistiken
cat /proc/net/dev
Verbindungen nach IP
# Aktive Verbindungen nach IP gruppiert
sudo ss -tn | awk 'NR>1 {print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn
# ESTABLISHED-Verbindungen zählen
sudo ss -tn state established | wc -l
I/O-Performance messen
Disk-I/O live
# iostat installieren
sudo apt install -y sysstat
# I/O-Statistiken anzeigen
iostat -x 2
# Device: r/s w/s rMB/s wMB/s %util
# sda 10.2 45.3 1.20 8.50 45.2
# rrqm = Read Requests Merged
# %util = Auslastung (>80% = Engpass)
# Kompakter
iostat -xm 2 5 # alle 2 Sekunden, 5 Durchläufe
# Nur spezifisches Device
iostat -x sda 2
iotop – I/O nach Prozess
# Installation
sudo apt install -y iotop
# Welcher Prozess macht am meisten I/O?
sudo iotop
sudo iotop -o # nur aktive Prozesse anzeigen
Disk-Schreibgeschwindigkeit testen
# Sequentieller Schreibtest (dd)
sudo dd if=/dev/zero of=/tmp/testfile bs=1G count=1 oflag=direct
# 1073741824 bytes (1.1 GB) copied, 3.4 s, 316 MB/s
# Aufräumen
rm /tmp/testfile
Logs mit journalctl analysieren
# System-Logs der letzten Stunde
journalctl --since "1 hour ago"
# Kernel-Meldungen (OOM-Killer, Hardware-Fehler)
journalctl -k
# Nur Fehler und kritische Meldungen
journalctl -p err
# OOM (Out of Memory) Killer suchen
journalctl -k | grep -i "oom\|killed process"
# Häufigste Fehler
journalctl -p err --no-pager | awk '{print $5, $6, $7}' | sort | uniq -c | sort -rn | head -20
# Logs aller Services des letzten Boots
journalctl -b
# Live-Monitoring aller Logs
journalctl -f
Klassische Log-Dateien
# Authentifizierung (SSH-Logins, sudo)
sudo tail -f /var/log/auth.log # Ubuntu/Debian
sudo tail -f /var/log/secure # Fedora/RHEL
# System-Log
sudo tail -f /var/log/syslog # Ubuntu/Debian
sudo tail -f /var/log/messages # Fedora/RHEL
# Kernel-Meldungen
sudo dmesg | tail -50
sudo dmesg -w # live
Automatisches Monitoring mit watch
watch wiederholt einen Befehl periodisch:
# Speicher alle 2 Sekunden aktualisieren
watch -n 2 free -h
# Festplattennutzung alle 5 Sekunden
watch -n 5 df -h
# Veränderungen hervorheben (-d)
watch -n 2 -d free -h
# Mehrere Werte kombinieren
watch -n 1 'echo "=== CPU ===" && mpstat 1 1 && echo "=== MEM ===" && free -h && echo "=== DISK ===" && df -h /'
Engpass-Diagnose: Schritt für Schritt
Symptom: Server langsam
# 1. Load Average prüfen
uptime
# → Hoch? Weiter mit CPU und I/O-Analyse
# 2. Speicher prüfen
free -h
# → available fast 0? Weiter mit RAM-Analyse
# 3. Top-Prozesse
top # dann M (nach RAM), dann P (nach CPU)
# → Welcher Prozess frisst alles?
# 4. I/O-Engpass?
iostat -x 2
# → %util > 80? I/O-Problem
# 5. Netzwerk?
sudo ss -tn | wc -l
iftop
Symptom: Disk ist voll
# 1. Wo ist der Platz weg?
df -h
# 2. Größtes Verzeichnis finden
sudo du -h --max-depth=1 / 2>/dev/null | sort -h
# 3. In dem vollen Verzeichnis weiter einschränken
sudo du -h --max-depth=1 /var 2>/dev/null | sort -h
# 4. Gelöschte Dateien, die noch von Prozessen gehalten werden
sudo lsof +L1 | grep -v "^COMMAND"
# → Prozess neustarten um Datei wirklich freizugeben
# 5. Journal bereinigen
sudo journalctl --vacuum-size=200M
Symptom: Prozess reagiert nicht
# 1. Prozess-Status
ps aux | grep name
sudo systemctl status dienst
# 2. Was tut der Prozess? (strace zeigt Syscalls)
sudo strace -p PID -e trace=all 2>&1 | head -50
# 3. Offene Dateien und Verbindungen
sudo lsof -p PID
# 4. Logs
journalctl -u dienst --since "10 min ago"
# 5. Sanft neu starten
sudo systemctl restart dienst
# oder kill und neu starten
sudo kill -HUP PID # SIGHUP = neu laden
Nützliche Einzeiler für den Alltag
# Top-10 Speicherfresser
ps aux --sort=-%mem | awk 'NR<=10{printf "%-15s %s MB\n", $11, int($6/1024)}'
# Disk-Zusammenfassung
df -h | awk 'NR>1 && $5+0 > 70 {print "ACHTUNG " $5 " auf " $6}'
# Aktive Netzwerkverbindungen nach Port
sudo ss -tnp | awk 'NR>1{split($4,a,":"); print a[length(a)]}' | sort | uniq -c | sort -rn | head
# Letzte 20 Fehler im System-Log
journalctl -p err -n 20 --no-pager
# Größte Dateien im System
sudo find / -type f -size +500M -printf "%s\t%p\n" 2>/dev/null | sort -rn | head -10 | awk '{printf "%.0f MB\t%s\n", $1/1048576, $2}'
Fazit
Systemmonitoring ist Routine – nicht Panik. Mit diesen Tools analysierst du systematisch:
Problem → uptime (Load?) → free (RAM?) → df (Disk?) → top/htop (Prozesse?) → iostat (I/O?) → journalctl (Logs?)