%20un%20proceso%20en%20Linux.png)
Sé que si un proceso hace algo malloc()
pero en realidad no escribe en esta memoria, Linux considera que esta memoria está libre y puede ser utilizada por otros procesos (sobrecompromiso).
De todos modos, ¿hay alguna manera de saber cuánta memoria fue malloc()
eliminada por un proceso determinado? (incluso si no se usa)
Esta información existe en todo el sistema en /proc/meminfo
, pero me gustaría saberla para un proceso específico.
Investigué /proc/<PID>/{smaps,stat,statm}
pero no estoy seguro de que muestre esta información.
Respuesta1
Llamadas malloc()
que hacen que el tamaño del segmento de datos cambie (es decir, que no reutilizan la memoria previamente asignada, por lo que las asignaciones que resultan en llamadas a sbrk()
o mmap()
) aparecen en /proc/$PID/statm
y /proc/$PID/stat
.
En statm
, el primer campo muestra el tamaño total del programa y el sexto campo muestra el número de páginas de datos; Ambos reflejan asignaciones de memoria (incluso cuando no se utilizan).
En stat
, el campo a mirar es vsize
(el campo 23 actualmente).
(Ver tablas 1-3 y 1-4 en elproc
documentación.)
Tenga en cuenta que estos muestran el uso total de la memoria y los tamaños totales de los segmentos de datos, por lo que no puede distinguir entre la memoria que se ha malloc()
editado y otro uso de la memoria.
Puedes ver esto en acción con el siguiente programa:
#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;
}
(Excelente manejo de errores como siempre). Entonces
$ ./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
andres henle señaló malloc_info(3)
, y puedes usarlo en prácticamente cualquier proceso. Usando el programa de ejemplo anterior,sin ninguna información de depuración(solo para mostrar que no es necesario):
$ gdb ./356532
> break free
(esto configura un punto de interrupción en la llamada a free
en el programa; en realidad, cualquier llamada a free
, pero primero presionaremos "la nuestra"; probar esto con malloc
no será tan útil porque el código de inicio usa malloc
)
> run
Cuando gdb
llega a un punto de interrupción, puede llamar malloc_info
así:
> call malloc_info(0, stdout)
Esto volcará la malloc
información.