Sehen Sie, wie viel Speicher von einem Prozess unter Linux mit malloc() reserviert wurde

Sehen Sie, wie viel Speicher von einem Prozess unter Linux mit malloc() reserviert wurde

Ich weiß, dass wenn ein Prozess dies tut, malloc()aber nicht wirklich in diesen Speicher schreibt, Linux davon ausgeht, dass dieser Speicher frei ist und von anderen Prozessen verwendet werden kann (Übervergabe).

Gibt es trotzdem eine Möglichkeit herauszufinden, wie viel Speicher malloc()von einem bestimmten Prozess verbraucht wurde? (auch wenn er nicht genutzt wird)

Diese Information ist systemweit in verfügbar /proc/meminfo, ich möchte sie aber für einen bestimmten Prozess wissen.

Ich habe mich damit befasst, /proc/<PID>/{smaps,stat,statm}bin mir aber nicht sicher, ob diese Informationen angezeigt werden.

Antwort1

Aufrufe, malloc()die eine Änderung der Datensegmentgröße bewirken (dh, die zuvor zugewiesenen Speicher nicht wiederverwenden – daher werden Zuweisungen, die zu Aufrufen von sbrk()oder führen, in und mmap()angezeigt ./proc/$PID/statm/proc/$PID/stat

In statmzeigt das erste Feld die gesamte Programmgröße und das sechste Feld die Anzahl der Datenseiten. Beide spiegeln die Speicherzuordnungen wider (auch bei Nichtgebrauch).

In statist das zu betrachtende Feld vsize(derzeit das 23. Feld).

(Siehe Tabellen 1-3 und 1-4 improcDokumentation.)

Beachten Sie, dass hier die gesamte Speichernutzung und die Gesamtgröße der Datensegmente angezeigt werden. Sie können also nicht zwischen belegtem Speicher malloc()und sonstiger Speichernutzung unterscheiden.

Sie können dies mit dem folgenden Programm in Aktion sehen:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char **argv) {
  void *buf;
  puts("Waiting before allocating...");
  sleep(20);
  buf = malloc(10*1024*1024*1024L);
  puts("Sleeping after allocating...");
  sleep(20);
  free(buf);
  return 0;
}

(Wie immer eine ausgezeichnete Fehlerbehandlung.) Dann

$ ./356532&
[1] 4239
Waiting before allocating...
$ cat /proc/4239/statm
1043 172 154 1 0 81 0
$ cat /proc/4239/stat | awk '{print $23}'
4272128
Sleeping after allocating...
$ cat /proc/4239/statm
2622484 172 154 1 0 2621522 0
$ cat /proc/4239/stat | awk '{print $23}'
10741694464

Andrew Henle wies darauf hin malloc_info(3), und Sie können das eigentlich auf so ziemlich jeden Prozess anwenden. Mit dem obigen Beispielprogramm,ohne Debuginformationen(nur um zu zeigen, dass es nicht notwendig ist):

$ gdb ./356532
> break free

(dadurch wird ein Haltepunkt beim Aufruf von freeim Programm eingerichtet – eigentlich bei jedem Aufruf von free, aber wir werden zuerst „unseren“ erreichen; dies mit zu versuchen, mallocist nicht so sinnvoll, weil der Startcode verwendet malloc)

> run

Wenn gdbein Haltepunkt erreicht wird, können Sie malloc_infowie folgt aufrufen:

> call malloc_info(0, stdout)

Dadurch werden die mallocInformationen gelöscht.

verwandte Informationen