Muito alto uso de buffers de RAM após o redimensionamento / reinicialização da instância

3

Ontem à tarde, redimensionamos uma das instâncias do Linode (CentOS 5.7, 64 bits) de uma instância de 4 GB para 12 GB. Imediatamente após essa reinicialização, notei que o uso de memória para buffers foi insanamente alto - maior do que eu já vi em qualquer máquina que toquei. Mesmo nos meus servidores mais usados, raramente vejo o uso do buffer exceder ~ 200MB. Neste servidor, o uso atual do buffer é duas ordens de magnitude maior do que antes de redimensionarmos e reinicializarmos.

Aqui está o gráfico de memória munin com dados pré e pós-migração:

Osdadosexibidospormuninsãocorroboradospelasaídade"free":

[erik@host ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:         11967      10146       1820          0       7374       1132
-/+ buffers/cache:       1639      10327
Swap:          255          0        255

Agora, estou bem ciente do uso do kernel de memória não utilizada para cache, mas meu entendimento dos buffers é que os buffers são diferentes. Eles são usados para armazenar temporariamente gravações até que tenham sido confirmadas no disco. Isso é um entendimento correto? Este servidor tem pouquíssimo disco IO (é um servidor web apache / php, o banco de dados está em outro lugar, portanto apenas IO de substância são access_logs) e, como tal, eu esperaria que o uso do buffer fosse bem baixo.

Este é um gráfico de tráfego de rede para o mesmo período de tempo:

Comovocêpodever,nãoháalteraçõessubstanciaisnotráfegoantesedepoisdoredimensionamento.

Duranteareinicialização,trêscoisasmudaramqueeuconheço:

  1. Pegamos4núcleosadicionaisqueoLinodeforneceunoiníciodestasemana,levandoototaldenúcleospara8.
  2. Estamosnokernel"Latest 64 bit", que é agora 3.7.10-x86_64-linode30. Anteriormente estávamos no 3.0.18 eu acredito.
  3. Passamos de 4 GB de RAM para 12 GB.

Dessas mudanças, meu palpite é que foi o novo kernel que está causando o aumento do uso do buffer. Infelizmente, no momento, não podemos fazer mais um tempo de inatividade para fazer o downgrade para um kernel anterior, embora isso possa ser necessário se eu não conseguir resolver esse uso do buffer.

Com isso, tenho algumas perguntas:

  1. Algum de vocês está executando o kernel 3.7.10 e, em caso afirmativo, você viu uma mudança semelhante?
  2. Quais ferramentas estão disponíveis para inspecionar os buffers do kernel e seus tamanhos?
  3. Presumo que, assim como o cache, o kernel liberará essa memória quando outros aplicativos precisarem dela. Isso está correto?
por EEAA 21.03.2013 / 19:35

1 resposta

1

Para esclarecer este ponto:

[Buffers are] used to temporarily store writes until they've been committed to disk. Is that a correct understanding?

Não, isso não está certo.

Você parece entender o conceito de memória cache. Quando um arquivo é lido do disco, o arquivo é mantido na memória como cache. Se um aplicativo precisar acessar esse arquivo novamente, o acesso vem da RAM, que é rápido, ao contrário de acessar o arquivo novamente a partir do disco, que é lento.

Se um aplicativo precisar gravar nesse arquivo, a gravação será executada no arquivo em RAM, que é rápido, e o kernel marcará essas páginas de memória como "sujas". No que diz respeito ao aplicativo, a gravação está completa e o aplicativo pode voltar a fazer o que fizer.

O kernel lida com a limpeza de páginas sujas no disco mais tarde. Você pode forçar um flush de todas as páginas sujas com o comando sync , ou você verá os daemons de flushing (pdflush ou bdflush) acordarem de tempos em tempos.

Você pode ver a quantidade de memória suja a qualquer momento com cat /proc/meminfo | grep Dirty .

Para corrigir o seu entendimento, tanto o pagecache limpo (arquivos que foram lidos) quanto o pagecache sujo (arquivos esperando para serem gravados no disco) são contados como "cache" pelo Linux.

O cache de arquivos pode ser liberado se os processos solicitarem mais alocações de memória virtual. Segmentos de memória compartilhada e tmpfs também são relatados como "cache", mas eles não podem ser liberados como o cache de arquivos pode.

Normalmente, os "buffers" são alocações de memória executando processos. Dê uma olhada em top -a ou similar e veja qual processo está ocupando a maior parte da RAM.

    
por 14.05.2013 / 13:14