Ich muss die Mem-Nutzung VIRT und RES zur Laufzeit meines Programms abrufen und anzeigen.
Was ich bisher versucht habe:
getrusage ( http://linux.die.net/man/2/getrusage )
int who = RUSAGE_SELF;
struct rusage usage;
int ret;
ret=getrusage(who,&usage);
cout<<usage.ru_maxrss;
aber ich bekomme immer 0.
Antworten:
Unter Linux habe ich noch nie eine ioctl () -Lösung gefunden. Für unsere Anwendungen haben wir eine allgemeine Dienstprogrammroutine codiert, die auf dem Lesen von Dateien in / proc / pid basiert . Es gibt eine Reihe dieser Dateien, die unterschiedliche Ergebnisse liefern. Hier ist die, auf die wir uns geeinigt haben (die Frage wurde mit C ++ markiert, und wir haben E / A mit C ++ - Konstrukten behandelt, sie sollte jedoch bei Bedarf leicht an C i / O-Routinen anpassbar sein):
quelle
why 1024.0?
- Der Compiler wird angewiesen, zuerst in double zu konvertieren und dann zu teilen, um das doppelte Ergebnis zu erhalten. Die andere Wahl:vm_usage = vsize / 1024;
würde zuerst die Division durchführen (die Genauigkeit verlieren, wie @DonWakefield andeutet) und dann in double konvertieren.David Robert Nadeau hat eine gute eigenständige Multi-Plattform-C-Funktion hinzugefügt, um die prozessresidente Satzgröße (physische Speichernutzung) auf seiner Website zu ermitteln:
Verwendung
Weitere Informationen finden Sie auf der Website. Dort finden Sie auch eine Funktion zum Abrufen der physischen Speichergröße eines Systems .
quelle
#pragma comment(lib, "psapi.lib")
zum#if defined(_WIN32)
Umfang hinzufügen .Alt:
Neu: Es scheint, dass das oben Genannte nicht funktioniert, da der Kernel die meisten Werte nicht ausfüllt. Was funktioniert, ist, die Informationen von proc zu erhalten. Anstatt es selbst zu analysieren, ist es einfacher, libproc (Teil von procps) wie folgt zu verwenden:
Kompilieren Sie mit "
gcc -o getrusage getrusage.c -lproc
"quelle
#include <proc/readproc.h>
Lösung hat unter Ubuntu hervorragend funktioniert. Ich musste das Paket installierenlibproc-dev
.usage.vm_data
ist eine Annäherung an das, was ich brauchte. Ihre Wahl der Speicherstatistik ist hier dokumentiert:/usr/include/proc/readproc.h
Diejenigen, die ich ausprobiert habe, scheinen alle in Bytes und nicht in Seiten zu sein. Ich glaube nicht, dass mein Prozess 46 Millionen Seiten verwendet hat. Kommentare, dass diese Lösung unter Linux nicht funktioniert, scheinen falsch zu sein.Wenn Sie sich unter Linux die Laufzeitkosten (für das Debuggen) leisten können, können Sie valgrind mit dem massif-Tool verwenden:
http://valgrind.org/docs/manual/ms-manual.html
Es ist schwer, aber sehr nützlich.
quelle
Ein eleganterer Weg für die Don Wakefield-Methode:
quelle
Die vorhandenen Antworten sind besser, um den richtigen Wert zu erhalten, aber ich kann zumindest erklären, warum getrusage bei Ihnen nicht funktioniert.
Mann 2 getrusage:
quelle
Zusätzlich zu Ihrer Methode können
Sie den Befehl system ps aufrufen und die Speichernutzung aus der Ausgabe abrufen.
oder lesen Sie Informationen aus / proc / pid (siehe PIOCPSINFO-Struktur)
quelle
Auf Ihrem System befindet sich eine Datei mit dem Namen
/proc/self/statm
. Das proc-Dateisystem ist ein Pseudo-Dateisystem, das eine Schnittstelle zu Kernel-Datenstrukturen bietet. Diese Datei enthält die Informationen, die Sie benötigen, in Spalten mit nur Ganzzahlen, die durch Leerzeichen getrennt sind.Spalten-Nr.:
= Gesamtprogrammgröße (VmSize in / proc / [pid] / status)
= residente Satzgröße (VmRSS in / proc / [pid] / status)
Weitere Informationen finden Sie im LINK .
quelle
Ich benutze andere Wege, um das zu tun und es klingt realistisch. Was ich tue, ist, dass ich die PID des Prozesses durch die Funktion getpid () erhalten habe und dann die Datei / proc / pid / stat verwende. Ich glaube, die 23. Spalte der Statistikdatei ist die vmsize (siehe Don-Beitrag). Sie können die vmsize aus der Datei lesen, wo immer Sie sie im Code benötigen. Wenn Sie sich fragen, wie viel ein Code-Snippet möglicherweise Speicherplatz beansprucht, können Sie diese Datei einmal vor und einmal danach lesen und sie voneinander subtrahieren.
quelle
Basierend auf der Lösung von Don W mit weniger Variablen.
quelle
Ich suchte nach einer Linux-App, um den maximal verwendeten Speicher zu messen. valgrind ist ein ausgezeichnetes Werkzeug, gab mir aber mehr Informationen als ich wollte. tstime schien das beste Werkzeug zu sein, das ich finden konnte. Es misst die "Hochwasser" -Speicherauslastung (RSS und virtuell). Siehe diese Antwort .
quelle