Hier mal eine kurze Anleitung wie ihr herausfinden könnt, wieviel RAM ein Programm wie zB mysql oder apache2 verbraucht.
Wer nämlich nur über top o.ä. nachguckt kriegt nur Prozentuale Anteile angezeigt...
Es gibt 2 Arten von RAM-Auslastungen:
- Total
- Real
Total bedeutet das dort auch Libs usw inbegriffen sind die aber ggf auch noch von anderen Programmen genutzt werden.
Real bedeutet das damit wirklich nur der RAM-Verbrauch angezeigt wird exklusive Libs also tatsächlich nur das Programm
Erst das benötigte Paket installieren um das Tool pmap nutzen zu können
Dann müsst ihr die PID (Process ID) des jeweiligen Programms herausfinden - ein Programm hat aber meistens mehrere sog. Child Prozesse also Threads. Das Hauptprogramm ist die Mutter (mother) und die Instanzen die dadurch ausgeführt werden sind die Kinder (child)...
Eine gute Übersicht erhaltet ihr durch folgenden Befehl:
die ProcessID steht dabei in der 2.Spalte
Dort seht ihr dann zum Beispiel folgendes:
root 1744 0.0 0.7 20956 6336 ? Ss 08:47 0:00 /usr/sbin/apache2 -k start
www-data 1845 0.0 0.5 21060 4512 ? S 08:47 0:00 /usr/sbin/apache2 -k start
www-data 1846 0.0 0.4 20980 3972 ? S 08:47 0:00 /usr/sbin/apache2 -k start
www-data 1847 0.0 0.4 20980 3964 ? S 08:47 0:00 /usr/sbin/apache2 -k start
www-data 1849 0.0 0.4 20980 3964 ? S 08:47 0:00 /usr/sbin/apache2 -k start
www-data 1850 0.0 0.4 20980 3964 ? S 08:47 0:00 /usr/sbin/apache2 -k start
www-data 2773 0.0 0.4 20980 3964 ? S 09:46 0:00 /usr/sbin/apache2 -k start
Also gibt es einen Hauptprozess mit der PID 1744 und 6 Child Prozesse...
Nun führt ihr folgenden Befehl aus um genauere Informationen zur RAM Auslastung zu kriegen:
Da kriegt ihr jetzt ziemlich viel angezeigt. Aber eigentlich interessiert uns nur "writeable/private" in der letzte Zeile:
Wer das in einem Script nutzen möchte kann folgenden Befehl nutzen um nur die für uns wichtige Information (real-ram) zu erhalten:
Der Prozess mit der PID 1744 hat also einen Realen RAM Verbrauch von 5056kB umgerechnet ca. 4,94MB (kB / 1024 = MB)
Den Totalen RAM Verbrauch kriegt man dahingegen einfacher heraus, dafür ist kein pmap notwendig - einfach auf die 5.Spalte vom Befehl ps aux (oder ps aux -H) achten
Der Code für diese Zeile bzw dem Teil was uns davon interessiert sähe in bash so aus:
Die 5. Spalte wäre also: 20956 und auch diese Angabe ist wieder in kilobyte also wäre das ca. 20,46MB die apache2 aufgrund der ganzen Libs, die man bei pmap aufgelistet bekommen hat, von dem Programm beantsprucht werden...
Bei pmap wurde dieser Wert aber auch schon angezeigt, wenn ihr das mal Vergleicht steht die gleiche Zahl nämlich auch schon hier: mapped: 20956K
Jeder Child Prozess verbraucht aber natürlich auch RAM, also kämen weitere 21060 + 20980 + 20980 + 20980 + 20980 + 20980 = 125960 kB = 123MB theoretisch dazu... Aber die nutzen eben alle die selben Libs..
Um nun also den tatsächlichen RAM Verbrauch aller Instanzen zu ermitteln bedarf es einer Zusammenrechnung des Realen Speicherverbrauchs der zB so aussehen könnte:
#!/bin/bash
[ -z $1 ] && echo "Usage: $0 <programm-name>" && exit 1
RealRAM=0
for PID in $(ps aux | grep -v grep | grep $1 | awk {'print $2'}); do
RR=$(pmap -d $PID | grep "writeable/private:" | awk {'print $4'} | tr -d "K")
[ -n "$RR" ] && RealRAM=$(( $RealRAM + $RR ))
done
echo "$1 real ram usage: $RealRAM kB = $(($RealRAM / 1024)) MB"
exit 0
Alles anzeigen
Ergebnis wäre dass bei mir der apache2 insgesammt 35 MB Ram exklusive Libs verbraucht..
Aber OB die Libs tatsächlich auch alle von anderen Programmen mit genutzt werden oder eben nicht, weiss man so erstmal nicht, man kann aber grob sagen das 50% speziell nur von diesem Programm genutzt werden aber sowas wie zB libc oder libssl eine allgemeine Lib ist die auch von anderen Programmen mit genutzt werden würde und somit diese Lib nicht mehrfach den RAM verbraucht sondern eben nur ein mal
Und an dieser Stelle auch noch was zum lesen bezüglich Speicherauslastung unter Linux: http://wiki.debianforum.de/LinuxSpeichermanagement