Por que o Linux limpa o cache de memória quando está quase cheio?

14

Aqui está a aparência do gráfico de memória em um VPS executando o CentOS com 512 MB de RAM e nginx / php-fpm / mysqld servindo conteúdo (principalmente estático) a alguns milhares de visitantes por dia.

Gráfico semanal de memória

(esses são dias no eixo x)

Como você pode ver, é bastante irregular na área de cache e buffer. O cache da memória é eliminado em intervalos irregulares (descartando um trabalho cron responsável). Geralmente, mas nem sempre, é eliminado no ponto em que não pode crescer mais. Às vezes, limpa quase inteiramente, outras vezes apenas na metade do caminho.

Estou tentando entender a lógica por trás desses expurgos. Eu esperava que os dados do arquivo fossem armazenados em cache por muito mais tempo e não vi outros programas usando mais memória do que o normal quando o cache da memória é limpo.

Esse comportamento é normal ou estou faltando alguma coisa?

ATUALIZAÇÃO: Uma atualização de memória parece ter estabilizado o gráfico. Ainda estou vendo pequenas quedas, mas em nenhum lugar tão significativo quanto antes da atualização.

Após a atualização da memória

redburn
fonte
Este é um contêiner OpenVZ / Virtuozzo ou uma VM real, como XEN ou KVM?
Jordanm 23/10
1
Não consigo explicar o que são, mas tenho um VPS que exibe o mesmo comportamento. dl.dropbox.com/u/1578899/memory-week.png
EightBitTony
@jordanm É uma máquina virtual baseada em Xen.
Redburn 24/10
@EightBitTony Obrigado por compartilhar. O seu parece um pouco mais "natural", mas vejo claramente um padrão semelhante (mas talvez mais previsível) de quedas no cache de memória.
Redburn 24/10
Eu me perguntei se o Munin 2 estava fazendo gráficos / coletando os dados de maneira diferente o suficiente para resultar em algumas das diferenças (gráfico mais suave no seu), mas mesmo o meu mostra uma queda no meio de um ciclo, em vez de diariamente. É estranho, com certeza.
EightBitTony

Respostas:

3

Poderia ser um monte de coisas. Talvez um dos programas que você está executando esteja ocasional e brevemente usando muita memória RAM. Se são realmente semanas no eixo x, você deve obter uma resolução muito mais alta (por exemplo, uma vez por minuto ou até mesmo um segundo) para obter mais informações sobre o que está acontecendo e que está causando a queda do cache. pse a topsaída (incluindo a carga média) durante esse período também seria útil.

Jim Paris
fonte
Sim, acho que poderíamos teorizar que uma explosão muito curta e repentina no uso da memória, que acontece em um minuto mais ou menos, e não é detectada por Munin, poderia despejar o cache, o que, é claro, é detectado porque persiste.
EightBitTony 25/10/12
O cabeçalho é um pouco confuso, pois mostra realmente uma semana de dados; portanto, são dias no x-as, não semanas. Quanto à frequência das pesquisas: Munin busca dados a cada 5 minutos, e não acho que essa frequência possa ser alterada. Estou executando apenas nginx, mysql, php-fpm e munin-node. Pode ter algo a ver com o cache do mysql, talvez?
22412 redburn
Eu fiz o top (classificado pelo uso da memória) gravar sua saída em um arquivo a cada 5 segundos, depois analisei o arquivo e não encontrei processos que mostrassem comportamento incomum no ponto em que a memória em cache caiu repentinamente. A menos que um processo possa usar tanta memória e ainda escapar dessa janela de 5 segundos, não estou convencido de que essa possa ser a causa. Mas, se não houver processos em execução, o que poderia ser?
Redburn #
Esse encadeamento é um pouco obsoleto, mas uma observação rápida sobre a metodologia: quanto um processo contribui para o cache de memória do sistema não será (facilmente) refletido no topo , pois um processo muito ativo pode empilhar coisas rapidamente no cache sem o seu próprio memória alocada aumentando muito. Por exemplo, lendo um arquivo muito grande em pequenos pedaços para transmissão - embora o processo possa nunca usar mais do que alguns MB alocados , esses poucos MB constantemente mudam e acumulam referências no cache. Portanto, o que deve ser observado na saída superior seria um acúmulo repentino de tempo da CPU.
Goldilocks
Você também pode se interessar por: cognitivedissonance.ca/cogware/plog
goldilocks
2

Uma razão possível seria um arquivo crescente, como um digamos um log, ser removido, compactado ou enviado para outro lugar quando atingir um determinado tamanho.

Nos dois casos, seu tamanho em cache, possivelmente o todo, se não houver pressão de memória no sistema operacional, seria liberado do cache assim que o arquivo original fosse removido.

jlliagre
fonte
Uma ideia interessante, mas os arquivos de log mais ativos raramente excedem um tamanho de arquivo de 25 MB antes de serem girados, e o uso de cache / buffer tende a diminuir em cerca de 200 MB.
Red22