Como posso determinar a memória usada por um processo bifurcado (Linux)?

5

Na sequência de esta questão . Debian, se isso importa.

Eu entendo que alguma memória é compartilhada entre processos bifurcados. Como então posso determinar quanta memória é usada por um processo / conjunto de processos bifurcados?

Usando a ferramenta smem recomendada em esta pergunta semelhante , recebo valores como:

Command                         Swap      USS      PSS      RSS 
/usr/sbin/spamd --create-pr        0    16820    24974    41628
spamd chil                         0    19388    27581    44176
spamd chil                         0    32328    40038    55708

Eu entendo a coluna de troca, e a coluna RSS é o que é normalmente reportado (por exemplo, em ps). A partir da leitura da documentação do smem, parece que o USS é a memória especificamente para esse filho, e o PSS é uma parte da memória compartilhada entre os processos. No entanto, adicionar o USS ao PSS fornece valores mais altos do que o RSS, e achei que o compartilhamento significaria menos (por isso, presumo que eu esteja interpretando incorretamente).

Eu não estou amarrado à ferramenta smem. Eu gostaria apenas de uma maneira de obter um número de "uso de memória" que reflita de maneira um pouco exata a quantidade de memória real que o processo está usando.

    
por Tony Meyer 05.05.2009 / 00:04

2 respostas

2

O tamanho do conjunto proporcional é provavelmente a melhor figura de uso de memória por processo disponível. É o tamanho único do conjunto + (as páginas compartilhadas / # de compartilhamento de processos).

Portanto, um processo utilizou 44176 páginas, das quais 19388 são exclusivas desse processo. Isso significa que 24788 são compartilhados com outras pessoas.

Olhando para o PSS como USS + (peso compartilhado). O peso nesse caso é 8193, que é a proporção de páginas de memória compartilhada (24788) atribuíveis a esse processo. Quanto mais instâncias de um aplicativo você tiver compartilhando páginas, menor será o peso de cada processo.

Você pode somar o PSS em vários processos e não contará as páginas compartilhadas mais de uma vez. Você não pode, no entanto, somar USS e PSS e esperar RSS porque o PSS já inclui o USS.

    
por 05.05.2009 / 17:06
0

Pelo que entendi (mas alguém, por favor, me corrija se eu estiver errado), apenas o segmento do programa é compartilhado quando um processo se bifurca - os segmentos de dados ficam separados.

Assim, o executável (binário) e quaisquer bibliotecas compartilhadas carregadas serão compartilhadas entre os processos.

Cada processo receberá sua própria cópia (*) de qualquer memória alocada antes da bifurcação, mas qualquer memória alocada subsequentemente será exclusiva para esse processo.

(*) um O / S realmente inteligente poderia evitar ter de realmente alocar segmentos de dados para a cópia da criança usando um algoritmo copy on write , de modo que a memória só é alocado se um dos processos tentar alterá-lo. Veja aqui.

    
por 05.05.2009 / 00:43