Speicherverbrauch ermitteln



  • Ich möchte den Speicherverbrauch von meinen Programm ermitteln.

    Ich hab mich bisher noch nie mit Linux-Kram beschäftigt, deshalb wäre es nice, wenn mir jemand eine Komplett-Lösung posten könnte. Vielleicht ist ja jemand so nett mir zu helfen.

    Danke im Voraus


  • Mod

    Definiere "Speicherverbrauch"! Ist dir überhaupt klar, dass es da unterschiedliche Definitionen für geben kann?

    Google kennst du?



  • Bei Google hab ich auf die schnelle nichts gefunden, sonst hätte ich keinen Thread eröffnet.

    Unter Speicherverbrauch verstehe ich den dynamisch allokierten Speicher meines Programms sowie die Verwaltungsstrukturen vom Betriebssystem für malloc/new/etc.

    Es kommt hier nicht auf hohe Genauigkeit an. Wenn z.B. 700 MB belegt sind, bin ich auch mit allen Werten zwischen 650 und 750 zufrieden.



  • ok, hab eine Lösung gefunden:

    #include <ios>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <unistd.h>
    size_t process_mem_usage()
    {
       using std::ios_base;
       using std::ifstream;
       using std::string;
    
       // 'file' stat seems to give the most reliable results
       //
       ifstream stat_stream("/proc/self/stat",ios_base::in);
    
       // dummy vars for leading entries in stat that we don't care about
       //
       string pid, comm, state, ppid, pgrp, session, tty_nr;
       string tpgid, flags, minflt, cminflt, majflt, cmajflt;
       string utime, stime, cutime, cstime, priority, nice;
       string O, itrealvalue, starttime;
    
       // the two fields we want
       //
       unsigned long long vsize;
       long rss;
    
       stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
                   >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
                   >> utime >> stime >> cutime >> cstime >> priority >> nice
                   >> O >> itrealvalue >> starttime >> vsize >> rss; // don't care about the rest
    
       stat_stream.close();
    
       return vsize;
    }
    

    Nicht besonders schön, aber es funktioniert.

    Quelle: http://stackoverflow.com/questions/669438/how-to-get-memory-usage-at-run-time-in-c


  • Mod

    Dann lies mal man: proc(4). Dateien, die hier nahe liegen sind maps, smaps (wenn vorhanden), stat, statm und status des aktuellen Prozesses (also /proc/self/DATEINAME), je nachdem, welchen Wert und Format du davon genau haben möchtest. Da du keine Sprache nennst, kann ich dir das auch nicht vormachen. Aber eine Datei bekommst du alleine ausgelesen, oder? 🙂

    Der Wert, der am ehesten zu dem passt, was du beschreibst, ist der erste Wert von statm. Achtung: Das ist in der Einheit von Speicherseiten. In der Regel 4kiB, aber wie man sich den Wert zur Sicherheit selber holen kann, bekommst du mit dem Tipp weiter unten bestimmt selber raus.

    Alternativ gibt es noch Bibliotheken, die das eventuell komfortabler machen. Z.B. libproc für Zugriff auf alles was in so in /proc steht.

    Bei Google hab ich auf die schnelle nichts gefunden, sonst hätte ich keinen Thread eröffnet.

    🙄
    Wie man so etwas findet:

    linux was du willst programmiersprache
    

    (natürlich auf Englisch)
    Die Programmiersprache kann man oft auch weglassen. Beispiel:
    Google: linux get process memory usage c++
    Google: linux get process memory usage c
    Beide liefern exzellente Resultate (inhaltlich meiner Antwort entsprechend, teilweise auch weiterführend), viele auch mit konkretem Beispielcode.

    War das so schwer, da drauf zu kommen? Das einzige, was man hier kennen muss ist der Begriff "process" als Verwaltungseinheit für ein "laufendes Programm" in Linux. Sollte bekannt sein, oder? Ansonsten geht es bestimmt auch mit einer Umschreibung in Alltagssprache:
    Google: linux get program memory usage c++
    Google: linux get prpgram memory usage c
    Liefert genau die gleichen Ergebnisse, vermutlich weil Google so schlau ist und weiß, dass hier das Wort "process" eine passende Ersetzung für "process" ist.

    Damit bekommst du bestimmt auch raus, wie man an die Speicherseitengröße kommt, falls du den Weg über statm wählst (in einigen der anderen Dateien ist der belegte Speicher bereits in Byte angegeben).



  • Mir ist folgendendes Problem aufgefallen:

    Insbesondere wenn man kleine Speicherstücke allokiert und wieder freigibt (z.B. durch std::deque), bleibt der RSS-Wert weiterhin hoch.

    Gibt es eine Möglichkeit, dass der freigegebene Speicher nicht mitgezählt wird? Ich vermute mal nein, weil das Betriebssystem-intern halt so verwaltet wird. Aber ich wollte trotzdem mal nachfragen.


  • Mod

    Auch wenn du Speicher freigibst, so gibt die Laufzeitumgebung deines Programms diesen oft nicht endgültig an das OS zurück. Das gilt besonders bei kleinen Stücken, da die kleinste Einheit mit der das Programm und das OS Speicher austauschen, die Speicherseite ist, und da dieser Austausch recht aufwändig ist.


Anmelden zum Antworten