Recentemente, houve algumas perguntas perguntando por que o Ubuntu aparentemente está usando mais memória do que o contabilizado por processos/serviços - aqui e aqui .
No entanto, eu tenho a situação exatamente oposta. No meu servidor, a memória usada por todos os processos parece ser maior que a memória total usada. Deixe-me fornecer as evidências.
Saída de free -m
:
total used free shared buff/cache available
Mem: 64277 15014 34424 31 14837 48530
Swap: 8191 0 8191
Saída de arcstat
:
time read miss miss% dmis dm% pmis pm% mmis mm% size c avail
09:38:57 0 0 0 0 0 0 0 0 0 9.8G 9.8G 41G
Saída de ps aux | awk '{sum +=$6}END{print sum}'
:
6351512
Então, o que isso significa para mim é:
free -m
relata um total de 15,0 GB de memória usada (a memória compartilhada é insignificante). Subtraia desses 9,8 GB relatados por arcstat
para ZFS ARC Cache. O resultado restante é de cerca de 5,2 GB de memória usada "real". Mas a soma da coluna 6 em ps aux
(RSS - tamanho do conjunto residente) totaliza 6,35 GB. Isso significaria que a memória relatada usada por todos os processos é 1,15 GB maior do que realmente é mostrada por free -m
.
Gostaria de saber se existe uma maneira de calcular corretamente a memória usada por todos os processos, de modo que corresponda à memória usada (depois que o cache ZFS e os ramdisks compartilhados são subtraídos)?
Portanto, como muitos provavelmente sabem, as estatísticas de memória relatadas por
ps
(e a própria métrica RSS) não são totalmente precisas por causa das páginas de memória compartilhada.Existe outra ferramenta chamada
smem
, que informa corretamente o tamanho do conjunto proporcional para cada processo - ou seja, o consumo de memória de cada processo, onde a memória compartilhada é dividida de maneira sã entre os processos.De
man smem
:No entanto, existem alguns truques úteis para instalar e configurar
smem
para relatar facilmente a memória real usada por todos os processos.Instalando e configurando
smem
Primeiro, se você deseja instalar o
smem
, precisa ter o repositório Universe ativado. Certifique-se de que esta linha não seja comentada/etc/apt/sources.list
(para o Ubuntu 22.04):Quando você está tentando instalar normalmente
smem
, ele quer instalar uma tonelada de dependências (pouco mais de 100 pacotes), porque tem uma dependência recomendadapython3-matplotlib
para gerar gráficos gráficos.Como não preciso disso (e provavelmente qualquer pessoa com um servidor também não precisa), é possível instalar apenas o pacote básico com este comando:
Observe o traço depois
python3-matplotlib
- isso indica que esses pacotes não devem ser instalados. Outra opção é usar:Isso tem o mesmo resultado, que apenas instalará o
smem
pacote.O truque final é corrigir as colunas, para que você possa usar corretamente
awk
ou exportar as métricas de forma que você possa confiar nas colunas. Para fazer isso, precisamos mover acommand
coluna para o local mais à direita, pois ocommand
campo pode incluir espaços adicionais que não podemos controlar.Para corrigir o layout e tamanho da coluna,
smem
deve-se executar com estas opções:Além disso, para incluir todos os processos, ele deve ser executado como
sudo
. Eu defini o seguinte alias parasmem
:Portanto, a seguir, quando digito o comando
smem
, ele de fato executa o comando com as opções acima.Comparação
smem
eps
métricasAgora podemos comparar corretamente as métricas de
ps aux
esmem
. Eu esperava uma memória usada "real" de 5,2 GB, masps aux
relatei 6,35 GB usados. Abaixo estão os resultados desmem
.Contagem de RSS de
smem
:Contagem de PSS de
smem
:Agora está claro que o RSS reportado é mais ou menos semelhante (um pouco acima de
smem
). Mas também está claro que o tamanho do conjunto proporcional (PSS) corresponde mais corretamente ao uso de memória esperado entre os processos - 5,2 GB.Portanto, para medir corretamente o uso total de memória do processo, a métrica PSS de
smem
parece fornecer o resultado mais significativo.