Hi! Ich möchte herausfinden, wie viel RAM/Arbeitsspeicher ein Prozess auf meinem Linux wirklich verbraucht. Als Beispiel der Chromium Browser. Mein erster Versuch war über ps. Die Ergebnisse waren unrealistisch. 

Code:
ps -u $USER -o rss,comm | awk '$NF~/^chromium/ {sum+=$1} END {printf "%.1f MB\n",sum/1024}'

628.1 MB
Das widerspricht sich mit free, laut dem nur knapp 300MB belegt sind. 
Code:
free -h
              total        used        free      shared  buff/cache  available
Mem:          3,7Gi      297Mi      3,0Gi      102Mi      472Mi      3,2Gi
Also kann Chrome ja nicht doppelt so viel verbrauchen... Beim Recherchieren habe ich einen interessanten Blogartikel gefunden der eine Erklärung liefert:
Je nachdem, wie man es betrachtet, meldet ps nicht den tatsächlichen Speicherverbrauch von Prozessen. Vielmehr zeigt es an, wie viel Speicher jeder Prozess tatsächlich beanspruchen würde, wenn er der einzige laufende Prozess wäre. Natürlich laufen auf einem typischen Linux-Rechner zu jeder Zeit mehrere Dutzend Prozesse, was bedeutet, dass die von ps gemeldeten VSZ- und RSS-Zahlen mit ziemlicher Sicherheit falsch sind.
Auf SO habe ich dazu gelesen
Mit ps oder ähnlichen Tools erhalten Sie nur die Anzahl der von diesem Prozess belegten Speicherseiten. Diese Zahl ist korrekt, aber:
- spiegelt nicht die tatsächliche Menge des von der Anwendung verwendeten Speichers wider, sondern nur die Menge des für sie reservierten Speichers
- kann irreführend sein, wenn Seiten gemeinsam genutzt werden, z. B. von mehreren Threads oder durch die Verwendung dynamisch verknüpfter Bibliotheken
Auch da schlägt man pmap vor. Also die PIDs ermitteln und mit pmap schauen (unbedingt sudo nutzen sonst fehlen die Rechte um die Daten auszulesen!). Ich habe ein Skript geschrieben, dass psof mit allen chromium Prozessen aufruft:

Code:
#!/bin/bash
#for pid in $(ps -ax | grep chromium-browser | awk '{print $1}'); do sudo pmap $pid | grep total | awk '{print $2}' | sed 's/K//g'; done
totalMem=0
for pid in $(ps -ax | grep chromium-browser | awk '{print $1}')
do
        mem=$(sudo pmap $pid | grep total | awk '{print $2}' | sed 's/K//g')
        if [ ! -z "$mem" ]; then
                totalMem=$(expr $totalMem + $mem)
                echo "$pid: $mem = $(expr $mem / 1024) MB"
        else
                echo "No memory found for pid $pid"
        fi
done
echo "Total: $totalMem = $(expr $totalMem / 1024) MB"
Leider liefert das noch unrealistische Ergebnisse:
Code:
3926: 461088 = 450 MB
3954: 215924 = 210 MB
3955: 215924 = 210 MB
3959: 215924 = 210 MB
3993: 284300 = 277 MB
4009: 257288 = 251 MB
4038: 307336 = 300 MB
4048: 231076 = 225 MB
4294: 351736 = 343 MB
4511: 339664 = 331 MB
4512: 262728 = 256 MB
4527: 319212 = 311 MB
No memory found for pid 14262
Total: 3462200 = 3381 MB
Es scheint irgendwie was doppelt ausgegeben sein. Laut free sind 302M belegt.
Langsam bin ich mit meinen Latein am Ende, könnt ihr mir helfen wie ich den echten belegten Speicher eines Prozesses rausfinden kann?