Ein Wiki privater Natur

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)

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,

Visualisierung

# Standard: Top 4
./plot_memory.py

# Top 6
./plot_memory.py -t 6

# Top 10
./plot_memory.py -t 10

Das Skript:

  1. liest memory.csv (im selben Verzeichnis)
  2. ermittelt automatisch die Top-N-Programme nach Durchschnitt über den gesamten Zeitraum
  3. erzeugt memory_topN.png via 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