Precisa de explicação sobre o tamanho do conjunto de residentes / tamanho virtual

52

Descobri que pidstat seria uma boa ferramenta para monitorar processos. Eu quero calcular o uso médio de memória de um processo específico. Aqui está um exemplo de saída:

02:34:36 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:34:37 PM      7276      2.00      0.00  349212 210176   7.14  scalpel

(Isso faz parte da saída de pidstat -r -p 7276 .)

Devo usar as informações Tamanho do conjunto de residentes (RSS) ou Tamanho virtual (VSZ) para calcular o consumo médio de memória? Eu li algumas coisas na Wikipedia e em fóruns, mas não tenho certeza de entender completamente as diferenças. Além disso, parece que nenhum deles é confiável. Então, como posso monitorar um processo para obter seu uso de memória?

Qualquer ajuda sobre este assunto seria útil.

    
por Flanfl 27.03.2012 / 16:10

1 resposta

56

RSS é quanta memória este processo tem atualmente na memória principal (RAM). VSZ é quanta memória virtual o processo tem no total. Isso inclui todos os tipos de memória, tanto na RAM quanto trocados. Esses números podem ficar distorcidos porque também incluem bibliotecas compartilhadas e outros tipos de memória. Você pode ter quinhentas instâncias de bash em execução e o tamanho total de sua memória ocupada não será a soma de seus valores RSS ou VSZ.

Se você precisar ter uma ideia mais detalhada sobre o footprint de memória de um processo, terá algumas opções. Você pode passar por /proc/$PID/map e eliminar as coisas que não gosta. Se forem bibliotecas compartilhadas, o cálculo pode ficar complexo dependendo de suas necessidades (o que eu acho que me lembro).

Se você se preocupa apenas com o tamanho de heap do processo, pode sempre analisar apenas a entrada [heap] no arquivo map . O tamanho que o kernel alocou para o heap do processo pode ou não refletir o número exato de bytes que o processo pediu que seja alocado. Há detalhes minuciosos, internos do kernel e otimizações que podem eliminar isso. Em um mundo ideal, ele será o máximo que o processo precisa, arredondado para o múltiplo mais próximo do tamanho da página do sistema ( getconf PAGESIZE dirá o que é - em PCs, provavelmente é 4.096 bytes).

Se você quiser ver quanta memória um processo tem alocado , uma das melhores maneiras é abrir mão das métricas do lado do kernel. Em vez disso, você instrumenta as funções de alocação de memória (de) de heap da biblioteca C com o mecanismo LD_PRELOAD . Pessoalmente, eu ofereço um pouco de valgrind para obter informações sobre esse tipo de coisa. (Observe que a aplicação da instrumentação exigirá a reinicialização do processo).

Por favor, note que você também pode testar tempos de execução, que valgrind irá tornar seus programas um pouco mais lentos (mas provavelmente dentro de suas tolerâncias).

    
por 27.03.2012 / 16:46