Proportional Set Size (PSS) eines Prozeses ermitteln.
Hallo Gruppe,
ich habe hier (Red Hat EL 7.9) die Aufgabe, den realen Speicherverbrauch der Prozesse zu ermitteln; sowohl den aktuellen Wert als auch den Verlauf des Verbrauches.
Hintergrund: irgendwelche -Nagios ähnliche- Überwachung meldet "Speicher voll" obwohl es noch Speicher frei ist, was Fehlalarme auslöst.
Bei meinen Recherchen habe ich gefunden, dass der normale ps Befehl den Speicherverbrauch falsch schätzt:
"Resident Set Size (RSS) : The standard measure of physical memory (it typically shared among multiple applications) usage known as resident set size (RSS) will significantly overestimate memory usage."
(
https://www.2daygeek.com/smem-linux-memory-usage-statistics-reporting-tool/)
Als alternative wurde auf dieser Seite smem gepriesen. Leider ist smem in der Standard RHEL Repository nicht enthalten;
in EPEL wäre es vorhanden, aber leider ist EPEL Einsatz im Hause nicht erlaubt :(
Daher suche ich nach alternativen, wie ich PSS Wert eimes Prozesses ermitteln kan; am besten mit Shell-Mitteln oder Perl (installiert ist v5.16.3) oder python (v2.7).
==> Hat jemand eine Idee oder sogar eine Lösung, die er/sie/d mal programmiert hatte?
Nachfolgend liste ich vollständigkleitshalber die (anfäglichen) Versuche meines Vorgängers, um der Aufgabe zu genügen (hat aber nichts mit PSS zu tun), für den Fall, dass ihr dazu evtl. Kommetare / Hinweise habt (wenn nicht schonn für smem).
Vielen Dank schon mal,
Celal
memchecker.sh
#!/bin/bash
echo -e "USER Memory(%) Process TOTALUSEDMEMORY(MB) TOTALFREEMEMORY(MB) TOTALMEMORY(MB)" |sed 's/ /\| /g'
for i in {1..50};do
echo `ps aux|egrep 'app1adm|app2adm'|sort -rnk 4 |head -$i|tail -1|awk '{print $1,$4,$11}'` `free -m |grep ^M|awk '{print $3,$4,$2}'` |sed 's/ /\| /g'
done
---
memtest.sh
#!/bin/bash
function report_utilisation {
echo
echo Memory eaters :
cat /tmp/mem_usage.$$ |
awk '
{ process[$1]+=$2; }
END{
for(i in process)
{
printf("%-20s %sn",i, process[i]) ;
}
}' | sort -nrk 2 | head
rm /tmp/mem_usage.$$
exit 0
}
trap 'report_utilisation' INT
SECS=900
UNIT_TIME=10
STEPS=$(( $SECS / $UNIT_TIME ))
echo Watching Memory usage... ;
# Collect data in temp file
for((i=0;i<$STEPS;i++)); do
ps -eocomm,pmem | egrep -v '(0.0)|(%MEM)' >> /tmp/mem_usage.$$
sleep $UNIT_TIME
done
report_utilisation
----
memmap.sh
!/bin/bash
printf "%-10s%-15s%-15s%s\n" "PID" "OWNER" "MEMORY" "COMMAND"
function sys_main {
RAWIN=$(ps -o pid,user,%mem,command ax | grep -v PID |grep -v root| sort -bnr -k3 |
awk '/[0-9]*/{print $1 ":" $2 ":" $4}')
for i in $RAWIN
do
PID=$(echo $i | cut -d: -f1)
OWNER=$(echo $i | cut -d: -f2)
COMMAND=$(echo $i |cut -d: -f3)
MEMORY=$(pmap $PID |tail -n 1 |awk '/[0-9]K/{print $2}')
printf "%-10s%-15s%-15s%s\n" "$PID" "$OWNER" "$MEMORY" "$COMMAND"
done
}
sys_main | sort -bnr -k3 |head -n 50