Speicher-Monitoring: Aufzeichnung und Visualisierung
Zwei Python-Skripte zum langfristigen Erfassen und Visualisieren des RAM-Verbrauchs
aller laufenden Programme auf einem Linux-System.
Warum
Standardtools wie top oder htop zeigen nur den aktuellen Moment.
Wer wissen will, welches Programm über Stunden oder Nächte hinweg am meisten
Speicher frisst – oder ob es regelmäßige Peaks gibt – braucht eine Zeitreihe.
Das Setup hier löst genau das: minutengenaue Aufzeichnung im Hintergrund,
danach ein Diagramm auf Knopfdruck.
Skripte
| Datei | Aufgabe |
|---|---|
ps_mem_record.py |
Aufzeichnung – liest /proc/*/smaps, schreibt CSV |
plot_memory.py |
Auswertung – findet Top-N-Programme, erzeugt PNG |
Technischer Hintergrund
ps_mem_record.py basiert auf dem bewährten ps_mem-Tool (v3.16) und liest
direkt aus dem Linux-Kernel-Interface /proc/<pid>/smaps.
Genutzte Messmethode: PSS (Proportional Set Size)
- Private-Speicher: gehört exklusiv dem Prozess
- Shared-Speicher (PSS): geteilte Bibliotheken werden anteilig zugerechnet
(z. B. eine von 4 Prozessen genutzte Lib zählt mit 1/4) - Total = Private + Shared (PSS)
Das ist deutlich genauer als RSS, das geteilten Speicher mehrfach zählt.
Bei mehreren Prozessen mit identischer Speicherkarte (z. B. Fork-Modell wie bei
postgres) wird der Shared-Anteil korrekt nur einmal gezählt.
Benötigt Root – /proc/<pid>/smaps ist für fremde Prozesse nur als root lesbar.
Setup
Aufzeichnung starten
nohup sudo python3 ./ps_mem_record.py \
--record /var/log/memory_24h.csv \
--interval 300 &
| Parameter | Bedeutung |
|---|---|
--record <datei> |
Zieldatei für die CSV-Daten |
--interval <sekunden> |
Messabstand (Standard: 300 = 5 Minuten) |
Der Prozess läuft im Hintergrund und schreibt alle 5 Minuten einen Snapshot
in die CSV-Datei.
Aufzeichnung stoppen
sudo kill <PID> # SIGTERM → sauberer Abschluss + Abschlussbericht
# oder
sudo pkill -f ps_mem_record.py
Beim Beenden gibt das Skript automatisch einen Textbericht auf stdout aus
(Top-15-Programme mit Durchschnitt, Min, Max).
Autostart via systemd (optional)
# /etc/systemd/system/memory-record.service
[Unit]
Description=RAM-Aufzeichnung
[Service]
ExecStart=/usr/bin/python3 /opt/scripts/ps_mem_record.py \
--record /var/log/memory_24h.csv --interval 300
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl enable --now memory-record.service
CSV-Format
timestamp,program,private_kiB,shared_kiB,total_kiB,process_count
2026-05-07T19:48:04.592031,ruby,4823040,614400,5437440,12
2026-05-07T19:48:04.592031,java,1698816,14336,1713152,52
...
2026-05-07T19:48:04.592031,TOTAL,,,10219520,
- Jeder Messzeitpunkt enthält eine Zeile pro Programm + eine
TOTAL-Zeile process_count: Anzahl der Prozesse, die unter diesem Namen zusammengefasst wurden- Alle Größen in KiB
Visualisierung
# Standard: Top 4
./plot_memory.py
# Top 6
./plot_memory.py -t 6
# Top 10
./plot_memory.py -t 10
Das Skript:
- liest
memory.csv(im selben Verzeichnis) - ermittelt automatisch die Top-N-Programme nach Durchschnitt über den gesamten Zeitraum
- erzeugt
memory_topN.pngvia gnuplot
Jedes Programm erhält eine farbige Linie; der jeweilige Peak ist als gestrichelte
horizontale Linie eingezeichnet und beschriftet.
Ausgabe-Beispiel (Top 4, ~13h Aufzeichnung)
| Programm | Durchschnitt | Peak |
|---|---|---|
| ruby | 5.414 MiB | 5.625 MiB |
| java | 1.710 MiB | 1.714 MiB |
| bundle | 816 MiB | 848 MiB |
| prometheus | 481 MiB | 619 MiB |
Abhängigkeiten
# gnuplot (Debian/Ubuntu)
apt install gnuplot
# Python-Standardbibliothek – keine weiteren Pakete nötig
Typischer Workflow
# 1. Aufzeichnung starten (z. B. abends)
nohup sudo python3 ./ps_mem_record.py --record /var/log/memory_24h.csv --interval 300 &
# 2. Am nächsten Tag: Aufzeichnung stoppen
sudo pkill -f ps_mem_record.py
# 3. CSV ins Arbeitsverzeichnis kopieren
cp /var/log/memory_24h.csv .
# 4. Diagramm erzeugen
./plot_memory.py -t 6
# 5. Ergebnis ansehen
xdg-open memory_top6.png
Hinweise
- Die Messgenauigkeit hängt vom Kernel ab. Mit
smaps_rollup(Kernel ≥ 4.14)
ist die Messung schneller;smaps(ältere Kernel) ist langsamer, aber gleichwertig. - Bei sehr kurzen Intervallen (< 60 s) auf Systemen mit vielen Prozessen kann
die Messung selbst spürbar CPU verbrauchen. - Die CSV-Datei wächst mit der Zeit: ~50 KB/h bei 5-Minuten-Intervall und ~60 Programmen.