CLI AI

Den Prozess finden, dessen Speicher ständig wächst

2026-05-08

„Viel Speicher nutzen" und „Speicher verlieren" sind unterschiedliche Probleme. Ein Leak ist ein Prozess, dessen RSS stetig steigt und nie mehr sinkt, auch wenn die Maschine im Leerlauf ist. Ein einzelner Schnappschuss zeigt das nicht — man braucht zwei, mit Abstand aufgenommen.

1. Wer ist gerade am größten

clai
$ clai liste Prozesse sortiert nach Speicherverbrauch→ ps -eo pid,comm,rss,%mem --sort=-rss | head -4    PID COMMAND           RSS %MEM 218979 firefox       2089376  3.1 269458 verba         1257196  1.9 727108 telegram      1249824  1.9

RSS wird in Kilobyte angegeben und ist die entscheidende Zahl: tatsächlich belegter physischer Speicher. Das ist deine Liste der Verdächtigen, nicht die Antwort.

2. Einen Prozess über die Zeit beobachten

clai
$ clai miss den Speicher von PID 269458 alle 10 Sekunden, 6 Mal→ pidstat -r -p 269458 10 6

Das ist der eigentliche Test. Steigendes RSS über alle sechs Messungen bei gleichbleibender Last bedeutet ein Leak. Steigen und dann Abflachen bedeutet einen Cache, der sich füllt — normal, das hört von selbst auf.

3. Günstiges Messen ohne zusätzliche Pakete

clai
$ clai protokolliere den Speicher dieses Prozesses jede Minute in eine Datei→ while sleep 60; do printf '%s %s\n' "$(date +%T)" "$(grep VmRSS /proc/269458/status)"; done | tee mem.logVmRSS:	  1257196 kB

pidstat steckt im Paket sysstat und ist nicht immer installiert. /proc/<pid>/status gibt es immer. Lass es eine Stunde laufen, dann wird die Form der Antwort klar.

4. Wohin im Prozess der Speicher ging

clai
$ clai zeig die Speicherkarte von PID 269458 sortiert nach Größe→ sudo pmap -x 269458 | sort -k3 -rn | head

Eine einzelne anonyme Zuordnung, die zwischen zwei pmap-Läufen wächst, ist der Heap. Viele kleine Zuordnungen, die sich ständig vermehren, bedeuten meist ausgelaufene Thread-Stacks oder nicht geschlossene mmap-Dateien.

5. Erst den Datei-Cache ausschließen

clai
$ clai zeig den Speicherverbrauch ohne Cache und Puffer→ free -h               total        used        free      shared  buff/cache   availableMem:            62Gi        18Gi       2.1Gi       1.2Gi        42Gi        43Gi

Schau auf available, nicht auf free. Linux füllt freien RAM absichtlich mit Seiten-Cache und gibt ihn bei Bedarf zurück. „Nur 2 GB frei" bei 43 GB available ist ein gesundes System, kein Leak.

6. Bestätigen, dass es der Prozess ist, nicht die Maschine

clai
$ clai prüfe, ob der Kernel Prozesse wegen Speichermangel beendet hat→ sudo dmesg -T | grep -i 'killed process'

Wenn der OOM-Killer zugeschlagen hat, nennt der Kernel den gewählten Prozess und dessen Speicher zum Zeitpunkt. Das ist die stärkste Bestätigung, die du bekommen kannst, und sie ist schon aufgeschrieben.

Stolpersteine

  • RSS zählt gemeinsam genutzten Speicher doppelt. Zwei Prozesse, die eine Bibliothek teilen, melden beide deren Seiten. Für eine ehrliche Zahl pro Prozess nutze PSS aus smem oder /proc/<pid>/smaps_rollup.
  • Ein Neustart ist ein Workaround, keine Diagnose. Er setzt den Graphen zurück und versteckt die Beweise. Erst messen, dann neu starten.
  • Container-Limits sind von innen unsichtbar. Ein Prozess im Container sieht in free den gesamten Speicher des Hosts; die echte Grenze steht in /sys/fs/cgroup/memory.max.

Verwandte Fragen

Wie viel Wachstum ist ein Leak? Jede anhaltend steigende Kurve bei gleichbleibender Last. Ein Prozess, der 50 MB pro Stunde gewinnt und nie hergibt, trifft irgendwann auf den OOM-Killer, egal wie viel RAM man hinzufügt.

Ist hoher Speicherverbrauch unter Linux schlecht? Nicht von sich aus. Ungenutzter RAM ist verschwendeter RAM — der Kernel nutzt ihn als Cache und holt ihn sich bei Bedarf zurück. Achte stattdessen auf available und die Swap-Aktivität.

Welches Tool findet die leckende Codezeile? Valgrind (--leak-check=full) für C und C++, oder der Heap-Profiler der eigenen Sprache. Die Befehle hier finden welchen Prozess; das Beheben ist ein anderes Werkzeug.

Siehe auch

Sag, was du messen willst, und CliAI schreibt den pidstat-Aufruf, den du sonst nachschlagen müsstest. In einer Zeile installieren.