Como interpretar a saída do comando 'top' do Linux?

27

Após uma discussão feita AQUI sobre como PHP-FPMconsumir memória, acabei de encontrar um problema ao ler a memória em topcomando. Aqui está uma captura de tela do meu toplogo após reiniciar PHP-FPM. Tudo é normal: cerca de 20 PHP-FPMprocessos, cada um consumindo 5,5 MB de memória (0,3% do total).

insira a descrição da imagem aqui

Aqui está o servidor antigo logo antes da reinicialização de PHP-FPM(um dia após a reinicialização anterior). Aqui, ainda temos cerca de 25 PHP-FPMcom uso de memória dupla (10 MB indicando 0,5% do total). Portanto, a memória total usada deve ser de 600 a 700 MB. Então, por que 1,6 GB de memória foi usada?

insira a descrição da imagem aqui

Googlebot
fonte
@hemhemient não, não é o caso aqui. Eu verifiquei todas essas coisas. Isso é algo conectado ao PHP-FPM, e a memória será liberada reiniciando apenas o PHP-FPM. De qualquer forma, os valores de Mem e buffer / cache freesão idênticos.
Googlebot
6
Parece que você está executando uma "VM" do Virtuozzo. Todas as apostas acontecem no que diz respeito à contabilidade de memória.
Womble
Querida senhora e efémera: roubei as duas respostas! cackles #
Wesley

Respostas:

34

TL; DR 1

Seu servidor está dentro de algum tipo de contêiner virtuozzo / openvz / virtualization-du-jour . Tentar entender o uso da memória está inclinado nos moinhos de vento.

TL; DR 2

Linux comeu sua RAM! Mas tudo bem, isso faz com todos.


A Longa História

Vamos dividir!

Na Mem:seção, temos:

  • $n total: a quantidade de RAM física em sua máquina
  • $n used: quanta memória está sendo consumida pelo Linux, não apenas a soma dos processos.
  • $n free: Quanta RAM não está sendo consumida pelo Linux. Isso não leva em consideração que a memória armazenada em cache e em buffer é essencialmente "livre".
  • $n buffers: espaço no buffer é onde os blocos de E / S do disco que foram lidos ou aguardando uma gravação são armazenados. Um buffer é uma representação de RAM de um único bloco de disco.

Na Swap:seção, temos:

  • $n total: Auto-explicativo. Quantidade de espaço em disco disponível para troca de páginas.
  • $n used: Auto-explicativo. Quanto espaço de troca de disco é usado.
  • $n free: Herp Derp.
  • $n cache: Intimamente relacionado aos buffers acima. Na verdade, faz parte do cache da página e não possui espaço no disco físico. Não se preocupe com os detalhes desta conversa.

A parte interessante vem quando você corre free -m. Você verá três linhas e todos os números se correlacionarão com o topo. Vou dar meu próprio PC como exemplo:

             total       used       free     shared    buffers     cached
Mem:          8070       7747        323          0        253       5713
-/+ buffers/cache:       1780       6290
Swap:         5055          0       5055

A linha Mem mostra a RAM total em megabytes ( $n totalna parte superior), quanto é usado ( $n usedna parte superior), quanto é gratuito ( $n freena parte superior), quanto é compartilhado (ignore isso) e agora vem a parte boa! As colunas bufferse estão correlacionadas a, previsivelmente, e . Mas dê uma olhada na segunda linha que começa com isso . A matemática mostra que a quantidade usada é realmente (total) - ((buffers usados) - armazenada em cache). Livre é (total) - (theNewUsed).cachedfree -m$n buffers$n cachefree -m-/+ buffers/cache:

O que tudo isso significa? Isso significa que o Linux comeu sua RAM! A história resumida é que o kernel do Linux consome RAM, pois está disponível para uso em cache de disco. Não há nada que você possa fazer a menos que queira compilar um kernel personalizado. Dica profissional: não.

A RAM está realmente lá e livre para os processos usarem à vontade. É isso que significa a -/+ buffers/cache:linha free -m. No entanto, você está dentro de um contêiner de virtualização sem viseira, o que torna as coisas um pouco estranhas. Você simplesmente não pode fazer um balanço da sua memória com precisão de bytes neste momento. No entanto, você não está vendo nenhum comportamento terrivelmente incomum.

Mantenha a calma e continue. Além disso, obtenha um servidor físico (a menos que você goste de estatísticas de memória que se parecem com o Kreskin é o seu SysAdmin).

Wesley
fonte
A quantidade usada não é ((buffers usados) - armazenada em cache)?
mac
1

A parte superior não é a melhor maneira de verificar o uso da memória. No entanto, como minha pergunta foi marcada como duplicada, vou postar minha resolução aqui.

Eu li em um fórum que o ps_mem.py verificará o uso de memória para você.

Repositório: https://github.com/pixelb/ps_mem/

Baixar:

pip install ps_mem

Uso:

ps_mem

Saída:

# ps_mem
 Private  +   Shared  =  RAM used   Program

  4.0 KiB +  15.5 KiB =  19.5 KiB   udevd
  4.0 KiB +  16.0 KiB =  20.0 KiB   mysqld_safe
  4.0 KiB +  25.5 KiB =  29.5 KiB   dbus-daemon
  4.0 KiB +  27.5 KiB =  31.5 KiB   xinetd
 60.0 KiB +  14.5 KiB =  74.5 KiB   epmd
108.0 KiB +  23.0 KiB = 131.0 KiB   init
  8.0 KiB + 135.0 KiB = 143.0 KiB   saslauthd (2)
180.0 KiB +  34.0 KiB = 214.0 KiB   check_scripts.s
796.0 KiB +  41.0 KiB = 837.0 KiB   bash
528.0 KiB + 359.0 KiB = 887.0 KiB   crond (7)
  1.2 MiB + 218.0 KiB =   1.4 MiB   sshd (2)
  1.6 MiB +  45.0 KiB =   1.6 MiB   rsyslogd
  2.0 MiB + 133.0 KiB =   2.1 MiB   beam.smp
  1.3 MiB +   2.3 MiB =   3.6 MiB   httpd (8)
 12.8 MiB + 956.0 KiB =  13.8 MiB   sendmail.sendmail (7)
 53.5 MiB + 114.0 KiB =  53.7 MiB   mysqld
317.6 MiB +   2.3 MiB = 320.0 MiB   python (6)
---------------------------------
                        398.5 MiB
=================================
Do utilizador
fonte