Während dies wie ein Duplikat aus anderen Fragen aussehen könnte, lassen Sie mich erklären, warum es nicht ist.Wie kann die Menge des zugewiesenen Speichers unter Linux (und OSX) abgefragt werden?
Ich suche, um einen bestimmten Teil meiner Anwendung zu verschlechtern, wenn ein bestimmtes Speicherlimit erreicht wurde. Ich hätte Kriterien verwenden können, die auf dem verbleibenden verfügbaren physischen Speicher basieren, aber dies wäre nicht sicher, da das Betriebssystem den von meiner Anwendung verwendeten Speicher auslagern könnte, bevor die Kriterien erfüllt sind, die glauben, dass noch physischer Speicher vorhanden ist Zuweisen usw. Aus dem gleichen Grund kann ich nicht die Menge an aktuellem Speicher verwenden, die momentan vom Prozess verwendet wird, denn sobald das Betriebssystem mich ausschaltet, würde ich weiterhin den Speicher der OS-Seiten zuweisen, so dass die Nummer würde nicht mehr wachsen.
Aus diesem Grund wählte ich ein Kriterium basierend auf der Menge an Speicher von meiner Anwendung zugewiesen, d. H. Sehr nahe an virtuellen Speichergröße.
Diese Frage (How to determine CPU and memory consumption from inside a process?) bietet großartige Möglichkeiten, die Menge an virtuellem Speicher abzufragen, die vom aktuellen Prozess verwendet wird, was ich dachte, was ich brauchte. In Windows verwende ich GetProcessMemoryInfo()
und das PrivateUsage
Feld, das funktioniert gut
Unter Linux habe ich mehrere Dinge ausprobiert (unten aufgeführt), die nicht funktionierten. Der Grund, warum die Verwendung des virtuellen Speichers bei mir nicht funktioniert, liegt an etwas, das bei der Erstellung von OpenCL-Kontexten auf NVidia-Hardware unter Linux passiert. Der Treiber reserviert einen Bereich des virtuellen Speicherplatzes, der groß genug ist, um den gesamten RAM, den gesamten Tauschspeicher und den gesamten Videospeicher aufzunehmen. Meine Vermutung ist, dass es für einheitlichen Adressraum und alles tut. Das bedeutet aber auch, dass der Prozess große Speichermengen meldet. Auf meinem System zum Beispiel top melden 23,3 GB in der VIRT-Spalte (12 GB RAM, 6 GB Wechsel, 2 GB Videospeicher, die 20 GB durch den NVidia-Treiber reserviert).
Auf OSX, mit task_info()
und dem virtual_size
Feld, bekomme ich auch eine größere als erwartete Anzahl (ein paar GB für eine App, die nicht einmal 1 Gb unter Windows), aber nicht so groß wie Linux.
Also hier ist die große Frage: Wie bekomme ich die Menge an Speicher von meiner Anwendung zugewiesen? Ich weiß, dass dies eine etwas vage Frage ist (was bedeutet „zugewiesenen Speicher“ bedeutet?), Aber ich bin flexibel:
- Ich würde es vorziehen, die Anwendung von statischen Daten, Codeabschnitt und alles umfassen, aber ich kann Leben ohne.
- Ich würde es vorziehen, den Speicher für Stacks zugeordnet, aber ich kann ohne leben.
- Ich würde es vorziehen, den Speicher von gemeinsam genutzten Bibliotheken enthalten, aber ich kann ohne leben.
- Ich interessiere mich nicht wirklich für mmap Zeug, ich kann mit oder ohne an diesem Punkt tun.
- Etc.
Was wirklich wichtig ist, ist, dass die Zahl mit dem dynamischen Zuordnung (neu, malloc, alles) wächst und schrumpft, wenn der Speicher freigegeben wird (was ich weiß, kann abhängig von der Implementierung sein).
Dinge, die ich versucht habe
Hier sind ein paar Lösungen, die ich versucht habe und/oder Gedanken an, aber das wäre für mich nicht.
Lesen von/proc/self/status
Dies ist der Ansatz, wie bestimmen-CPU-und-Speicher-Verbrauch-von-inside-a-Prozess vorgeschlagen ist. Wie oben erwähnt, gibt dies jedoch die Menge an virtuellem Speicher zurück, die für mich nicht funktioniert.
Lesen von/proc/self/statm
Sehr leicht worst: nach http://kernelnewbies.kernelnewbies.narkive.com/iG9xCmwB/proc-pid-statm-doesnt-match-with-status, das Linux-Kernel-Code Bezug nimmt, ist der einzige Unterschied zwischen diesen beiden Werten, die die zweite nicht subtrahieren Sie
reserved_vm
auf die Menge des virtuellen Speichers. Ich hätte gehofft, dassreserved_vm
den vom OpenCL-Treiber reservierten Speicher enthalten würde, aber das tut es nicht.Verwenden
mallinfo()
und dasuordblks
FeldDies scheint nicht alle Zuführungen schließen (Ich vermute, die
new
s fehlen), da für eine + 2Gb Wachstum in einem virtuellen Speicherraum (nach einige speicherlastige Arbeit zu tun und immer noch die Erinnerung halten), sehe ich nur etwa 0,1 GB Wachstum in der Anzahl vonmallinfo()
zurückgegeben.Lesen Sie die [Heap] Abschnittsgröße von/proc/self/smaps
Dieser Wert bei rund 336.760 Kb gestartet und erreichte mit 1.019.496 Kb für Arbeit, die virtuellen Speicherraum um + 2Gb wuchs, und dann es wird nie nach unten, so dass ich bin mir nicht sicher, ob ich nicht wirklich auf dieser Nummer verlassen kann ...
-Monitor alle Speicherzuordnungen in meiner Anwendung
Ja, in einer idealen Welt würde ich habe die Kontrolle über den Abend rybody, der Speicher zuweist. Dies ist jedoch eine Legacy-Anwendung, die viele verschiedene Allokatoren verwendet, einige
malloc
s, einigenew
s, einige OS-spezifische Routinen usw. Es gibt einige Plug-Ins, die tun können, was immer sie wollen, sie könnten mit einem anderen kompiliert werden Compiler, usw. Während dies toll wäre, um wirklich Speicher zu kontrollieren, funktioniert das in meinem Kontext nicht.die virtuelle Speichergröße vor und nach dem Kontext Initialisierung OpenCL Lesen
Zwar ist dies eine „Hacky“ Art und Weise könnte das Problem (und ich könnte es Rückfall muß) zu lösen, würde ich wirklich Ich wünsche mir eine zuverlässigere Möglichkeit, Speicher abzufragen, weil der OpenCL-Kontext irgendwo außerhalb meiner Kontrolle initialisiert werden könnte und andere ähnliche, aber nicht OpenCL-spezifische Probleme auftreten könnten und ich würde nichts davon wissen.
Also das ist so ziemlich alles, was ich habe. Es gibt noch eine Sache, die ich noch nicht ausprobiert habe, denn es funktioniert nur unter OSX, aber es ist die in Why does mstats and malloc_zone_statistics not show recovered memory after free? beschriebene Methode, dh malloc_get_all_zones()
und malloc_zone_statistics()
zu verwenden, aber ich denke, das könnte das gleiche Problem wie mallinfo()
, dh nicht sein alle Zuordnungen berücksichtigen.
Kann also jemand einen Weg vorschlagen, um die Speichernutzung eines bestimmten Prozesses in Linux (und auch OSX, auch wenn es eine andere Methode ist) abzufragen (so vage ein Begriff wie oben, siehe oben für Präzision)?
mallinfo() mit (arena + hblkhd + uordblks) –
@brianbeuning: Laut http://man7.org/linux/man-pages/man3/mallinfo.3.html ist 'arena'' 'uordblks' + 'fordblks', so würde Ihr Vorschlag am Ende zweimal Speicher zählen ... –