Obtendo informações sobre o uso de memória de um processo em / proc / pid / smaps

43

Para um determinado processo em /proc/<pid>/smaps , para uma determinada entrada de mapeamento, quais são:

  1. Shared_Clean
  2. Shared_Dirty
  3. Private_Clean
  4. Private_Dirty

Shared_Clean + Shared_Dirty é a quantidade de memória compartilhada com outros processos? Então é como RSS compartilhado?

Da mesma forma, Private_Clean + Private_Dirty é a quantidade de memória que está disponível apenas para um processo ? Então é como RSS privado?

O valor do PSS é = PrivateRSS + (SharedRSS / número de processos que o compartilha)?

Mais algumas perguntas depois de ler este link: LWN

Agora vamos falar sobre o processo como um todo, cuja entrada de smaps estamos olhando.

Percebi que, se eu faço Shared_Clean + Shared_Dirty + Private_Clean + Private_Dirty para cada entrada de smaps para o processo, recebo o RSS do processo como reportado por ps , o que é muito legal. Por exemplo,

ps -p $$ -o pid,rss

Irá dar-me o mesmo valor (aprox) para rss como a soma de cada entrada Shared_Clean , Shared_Dirty , Private_Clean , Private_Dirty em / proc / $$ / smaps.

Mas e o PSS para todo o processo? Então, a partir do exemplo acima, como obtenho o PSS para $$? Posso apenas adicionar a entrada do Atendimento Microsoft para cada mapeamento de smaps e chegar ao Atendimento Microsoft para $$?

E o USS para todo o processo? Novamente, tomando o exemplo acima, acredito que posso chegar ao USS por US $, somando apenas as entradas do Private_ * para cada entrada de smaps por US $, certo?

Notas:
PSS = Tamanho do conjunto proporcional.
USS = tamanho de conjunto exclusivo.

    
por abc 04.03.2012 / 09:28

1 resposta

47

Páginas limpas são páginas que não foram modificadas desde que foram mapeadas (normalmente, as seções de texto das bibliotecas compartilhadas são lidas somente a partir do disco (quando necessário), nunca modificadas, portanto, elas estarão em páginas limpas e compartilhadas). br> Páginas sujas são páginas que não são limpas (ou seja, foram modificadas).

As páginas privadas estão disponíveis apenas para esse processo, as páginas compartilhadas são mapeadas por outros processos * .

RSS é o número total de páginas, compartilhadas ou não, atualmente mapeadas no processo. Portanto, Shared_Clean + Shared_Dirty seria a parte compartilhada do RSS (ou seja, a parte do RSS que também é mapeada em outros processos) e Private_Clean + Private_Dirty da parte privada do RSS (ou seja, apenas mapeada neste processo).

PSS (tamanho de compartilhamento proporcional) é como você descreve. As páginas privadas são somadas como estão e o tamanho de cada mapeamento compartilhado é dividido pelo número de processos que o compartilham.
Portanto, se um processo tivesse 100k páginas privadas, 500k páginas compartilhadas com outro processo e 500k compartilhado com quatro outros processos, o PSS seria:

100k + (500k / 2) + (500k / 5) = 450k

Outras leituras:

Com relação às somas do processo:

  • RSS pode ser (aproximadamente + ) obtido pela soma das entradas Rss: em smaps (você não precisa adicionar as entradas compartilhadas / privadas compartilhadas / sujas).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Você pode somar Pss: valores da mesma maneira, para obter o processo global PSS .
  • USS não é reportado em smaps , mas, na verdade, é a soma dos mapeamentos privados, portanto, você também pode obtê-lo da mesma forma

* Observe que uma página "compartilhável" é contada como um mapeamento privado até que seja realmente compartilhada. ou seja, se houver apenas um processo atualmente usando libfoo , a seção de texto dessa biblioteca aparecerá nos mapeamentos private do processo. Ele será contabilizado nos mapeamentos compartilhados (e removido dos privados) somente se / quando outro processo começar a usar essa biblioteca.
+ Os valores não adicione exatamente para todos os processos. Não sei exatamente por que ... desculpe.

    
por 04.03.2012 / 10:15