Veja quanta memória foi reservada com malloc () por um processo no Linux

3

Eu sei que se um processo faz um malloc() mas não escreve realmente nesta memória, o Linux considera que esta memória é livre e pode ser usada por outros processos (overcommit).

De qualquer forma, existe uma maneira de saber quanta memória foi malloc() ed por um determinado processo? (mesmo que não seja usado)

Essa informação existe em todo o sistema em /proc/meminfo , mas eu gostaria de saber sobre um processo específico.

Eu cavei em /proc/<PID>/{smaps,stat,statm} , mas não tenho certeza de que ele exibe essas informações.

    
por Totor 07.04.2017 / 10:57

1 resposta

5

Chama para malloc() que causa a alteração do tamanho do segmento de dados ( ie , que não reutiliza memória alocada anteriormente - portanto, alocações que resultam em chamadas para sbrk() ou mmap() ) aparecem em /proc/$PID/statm e /proc/$PID/stat .

Em statm , o primeiro campo mostra o tamanho total do programa e o sexto campo mostra o número de páginas de dados; ambos refletem alocações de memória (mesmo quando não usadas).

Em stat , o campo a ser observado é vsize (o 23º campo atualmente).

(Veja as tabelas 1-3 e 1-4 na % documentação deproc . )

Observe que eles mostram o uso total de memória e o total de tamanhos de segmento de dados, por isso você não pode distinguir entre a memória que foi malloc() ed e o restante uso de memória.

Você pode ver isso em ação com o seguinte 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 tratamento de erros como sempre).

$ ./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 apontou malloc_info(3) , e você pode realmente usar isso em praticamente qualquer processo. Usando o programa de exemplo acima, sem informações de depuração (apenas para mostrar que não é necessário):

$ gdb ./356532
> break free

(isso configura um ponto de interrupção na chamada para free no programa - na verdade, qualquer chamada para free , mas vamos acessar "nosso" primeiro; tentar isso com malloc não será tão útil porque o código de inicialização usa malloc )

> run

Quando gdb atinge um ponto de interrupção, você pode chamar malloc_info assim:

> call malloc_info(0, stdout)

Isso despejará as informações malloc .

    
por 07.04.2017 / 11:13