Consegui calcular o uso de memória não compartilhada somando mapeamentos anônimos e de pilha, por pmap -x
exemplo
sudo pmap -x $THE_PID |egrep 'anon|stack' | awk '{print $2}' | paste -sd+ | bc
mas não consigo encontrar nenhuma maneira de obter informações semelhantes ps
. top
mostra uma SHR
coluna, mas não parece oferecer uma maneira de classificar por memória não compartilhada. A classificação por RSS não é útil, pois o RSS contém páginas compartilhadas, mas apenas AFAICS as páginas compartilhadas que o processo tocou.
Portanto, se você tiver dois processos, ambos usando o mesmo espaço de endereço compartilhado de 16 GB, eles serão classificados com base em qual deles tocou mais na memória compartilhada. Não por qual alocou mais memória privada (não compartilhada), a menos que ambos tenham tocado a mesma quantidade de shmem ou próximo a ela.
Problemas semelhantes surgem com mapeamentos de leitura/gravação de bibliotecas compartilhadas e com processos fork
ed-but-not- exec
'd que compartilham páginas copy-on-write de seu ancestral.
Isso é... inútil.
Procurei maneiras de classificar top
a saída por expressões. Mas se ele suporta sua sintaxe de classificação, não consigo descobrir.
Isso parece algo tão óbvio, mas o ps nem sequer expõe as informações compartilhadas!
Por favor, me diga que estou faltando alguma coisa.