Speicherauslastung eines Programms ermitteln

L I V E Stammtisch ab 20:30 Uhr im Chat
  • 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

    Code
    apt-get install procps


    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:

    Code
    ps aux -H


    die ProcessID steht dabei in der 2.Spalte

    Dort seht ihr dann zum Beispiel folgendes:

    Code
    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:

    Code
    pmap -d 1744

    Da kriegt ihr jetzt ziemlich viel angezeigt. Aber eigentlich interessiert uns nur "writeable/private" in der letzte Zeile:

    Code
    mapped: 20956K    writeable/private: 5056K    shared: 64K

    Wer das in einem Script nutzen möchte kann folgenden Befehl nutzen um nur die für uns wichtige Information (real-ram) zu erhalten:

    Code
    pmap -d $PID | grep "writeable/private:" | awk {'print $4'} | tr -d "K"

    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

    Code
    root      1744  0.0  0.7  20956  6336 ?        Ss   08:47   0:00 /usr/sbin/apache2 -k start

    Der Code für diese Zeile bzw dem Teil was uns davon interessiert sähe in bash so aus:

    Code
    ps aux | grep -v grep | grep -m1 $PID | awk {'print $5'}

    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:

    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


  • :thumbs1: erst mal Danke für deine tollen Anleitungen, ich bin ja in Software eine Niete.

    Eine Frage muss man das je nach OS berücksichtigen ? Mit welchem OS darf man das machen ?
    Ich erinnere mich dunkel das z.B. raspbmc gerne zickt, das ist eine stand allone Installation wo man eben nicht mal so einfach Pakete nachinstallieren darf, ich habe mir so schon öfter mein raspbmc zerschossen (z.B. bei BT Pakete)

    vielen Dank

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (27. Oktober 2013 um 11:24)

  • Mit Raspbmc darf man das ;)

    Nur bei OpenELEC kann man das so nicht machen da das keinen Paketmanager besitzt


    Das Paket ' procps ' beinhaltet nur Tools, keine Dienste oder ähnliches:

    http://procps.sourceforge.net

    Zitat

    procps is the package that has a bunch of small useful utilities that give information about processes using the /proc filesystem. The package includes the programs ps, top, vmstat, w, kill, free, slabtop, and skill.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!