Como medir a memória sem copiar-sobre-escrever páginas?
8
Como medir a memória RSS total ocupada por um conjunto de processos (bifurcados), sem contar duas vezes as páginas compartilhadas e a cópia na gravação?
Pergunta muito interessante, +1 - deve ser possível uma análise mais profunda dos /proc/*/maparquivos, apesar de eu nunca encontrar uma ferramenta que possa fazer isso. O principal problema é que as estruturas de dados a seguir são muito mais complexas quanto parecem. Se você não receber uma resposta legal aqui, talvez você também possa experimentar o Unix SE.
Eu o executei init(pid 1) para testes e o total relatado é aproximadamente igual ao uso físico de ram (conforme htop), então acho que é um pouco correto.
Não há uma maneira claramente definida de determinar em qualquer ferramenta que eu conheça quais processos compartilham quais mapas sem iterar através de todos os mapeamentos e comparar endereços.
No entanto, o linux oferece uma estimativa razoável, conhecida como tamanho do conjunto proporcional . Isso é relatado em / proc / [pid]> / maps.
Este valor é o tamanho do mapeamento dividido pelo número de irmãos / processos-pai com o mesmo mapeamento aberto.
Portanto, com um programa que possui um mapeamento de 1MiB aberto, mais um 1MiB compartilhado com outros 4 processos, o tamanho proporcional do conjunto é 1MiB + (1Mib / 4) ou 1.250 MiB. O RSS nesse caso seria 2MiB.
Existe um patch para o htop flutuando em torno do qual usará o PSS para calcular uma 'boa estimativa' da memória real em uso.
/proc/*/map
arquivos, apesar de eu nunca encontrar uma ferramenta que possa fazer isso. O principal problema é que as estruturas de dados a seguir são muito mais complexas quanto parecem. Se você não receber uma resposta legal aqui, talvez você também possa experimentar o Unix SE.Respostas:
Acabei escrevendo meu próprio utilitário para isso: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca
Eu o executei
init
(pid 1) para testes e o total relatado é aproximadamente igual ao uso físico de ram (conforme htop), então acho que é um pouco correto.Exemplo de uso:
fonte
Não há uma maneira claramente definida de determinar em qualquer ferramenta que eu conheça quais processos compartilham quais mapas sem iterar através de todos os mapeamentos e comparar endereços.
No entanto, o linux oferece uma estimativa razoável, conhecida como tamanho do conjunto proporcional . Isso é relatado em / proc / [pid]> / maps.
Este valor é o tamanho do mapeamento dividido pelo número de irmãos / processos-pai com o mesmo mapeamento aberto.
Portanto, com um programa que possui um mapeamento de 1MiB aberto, mais um 1MiB compartilhado com outros 4 processos, o tamanho proporcional do conjunto é 1MiB + (1Mib / 4) ou 1.250 MiB. O RSS nesse caso seria 2MiB.
Existe um patch para o htop flutuando em torno do qual usará o PSS para calcular uma 'boa estimativa' da memória real em uso.
fonte