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

46

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_Dirtya quantidade de memória compartilhada com outros processos? Então é como RSS compartilhado?

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

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

Mais algumas perguntas depois de ler este link: LWN

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

Percebi que, se eu faço Shared_Clean+ Shared_Dirty+ Private_Clean+ Private_Dirtypara cada entrada de smaps do processo, recebo o RSS do processo, conforme relatado por ps, o que é bem legal. Por exemplo

ps -p $$ -o pid,rss

Vai me dar a (aproximadamente) mesmo valor para rss como a soma de todas Shared_Clean, Shared_Dirty, Private_Clean, Private_Dirtyentrada em / proc / $$ / smaps.

Mas e o PSS para todo o processo? Portanto, no exemplo acima, como obtenho o PSS para $$? Posso apenas adicionar a entrada PSS para cada mapeamento de smaps e chegar ao PSS por $$?

E o USS para todo o processo? Novamente, tomando o exemplo acima, acho que posso chegar ao USS para $$ resumindo apenas as entradas Private_ * para cada entrada de smaps para $$ .. certo?

Notas:
PSS = tamanho proporcional do conjunto.
USS = tamanho único do conjunto.

Ankur Agarwal
fonte

Respostas:

50

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 apenas a partir do disco (quando necessário), nunca são modificadas, portanto estarão em páginas limpas e compartilhadas).
Páginas sujas são páginas que não estão limpas (ou seja, foram modificadas).

Páginas privadas estão disponíveis apenas para esse processo, 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. Então, Shared_Clean+ Shared_Dirtyseria a parte compartilhada do RSS (ou seja, a parte do RSS que também é mapeada em outros processos) e Private_Clean+ Private_Dirtya parte privada do RSS (ou seja, apenas mapeada neste processo).

PSS (tamanho proporcional de compartilhamento) é como você descreve. As páginas privadas são resumidas 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 compartilhadas com outros quatro processos, o PSS seria:

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

Leituras adicionais:

Em relação às somas em todo o processo:

  • RSSpode ser (aproximadamente + ) obtido somando as Rss:entradas smaps(você não precisa adicionar as entradas compartilhadas / privadas compartilhadas / sujas).

    awk '/Rss:/{ sum += $2 } END { print sum }' /proc/$$/smaps
    
  • Você pode resumir Pss:valores da mesma maneira, para obter um processo global PSS.
  • USSnão é relatado smaps, mas, na verdade, é a soma de mapeamentos privados, para que você também possa obtê-lo da mesma maneira

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

Esteira
fonte
Obrigado pela ótima resposta. Aprecie isso. Li o artigo da LWM e isso me inspirou a fazer mais algumas perguntas, então as adicionei à minha pergunta acima.
Ankur Agarwal
Ótimo! é muito muito útil !!
Camino
Ainda estou confuso sobre shared_dirty - a natureza suja disso está impedindo que ele seja compartilhado ainda?
Kevin
@ Kevin: se não fossem compartilhados, não seriam contabilizados Shared_Dirty- você poderia esclarecer sua pergunta?
Mat
meios sujos modificados a partir da origem. processo, certo? que não é assim que passa de ser compartilhado para ser local?
21713 Kevin