Por que o Linux está relatando estranhamente memória "livre"?


44

Esta é uma pergunta canônica sobre como os sistemas operacionais Unix relatam o uso de memória.
Perguntas semelhantes:

Eu tenho um servidor de produção executando o Debian 6.0.6 Squeeze

#uname -a

Linux debsrv 2.6.32-5-xen-amd64 #1 SMP Sun Sep 23 13:49:30 UTC 2012 x86_64 GNU/Linux

Todos os dias o cron executa o script de backup como root:

#crontab -e

0 5 * * * /root/sites_backup.sh > /dev/null 2>&1

#nano /root/sites_backup.sh

#!/bin/bash
str=`date +%Y-%m-%d-%H-%M-%S`
tar pzcf /home/backups/sites/mysite-$str.tar.gz /var/sites/mysite/public_html/www
mysqldump -u mysite -pmypass mysite | gzip -9 > /home/backups/sites/mysite-$str.sql.gz
cd /home/backups/sites/
sha512sum mysite-$str* > /home/backups/sites/mysite-$str.tar.gz.DIGESTS
cd ~

Tudo funciona perfeitamente, mas noto que o gráfico de memória de Munin mostra aumento de cache e buffers após o backup.

Então, basta baixar arquivos de backup e excluí-los. Após a exclusão, o gráfico de memória de Munin retorna o cache e os buffers ao estado anterior ao backup.

Aqui está o gráfico de Munin:

A imagem hospedada externamente era um link morto.


3
Parabéns, esta questão foi canonizado (é como a 6ª um hoje perguntando sobre isso, e acontece de ter o exemplo mais interessante e mais bonita :-)
voretaq7

Respostas:


27

Esse é o mesmo "problema" que o servidor se recusa a usar a partição swap e algumas outras perguntas semelhantes neste site. ( Alto uso de memória no servidor Linux , uso de memória no LINUX , servidor Web com pouca memória , etc.)

Preste atenção ao fato de que o consumo de memória é do cache . Isso significa que ele mantém um arquivo na memória. A memória em cache é a memória "livre". Em vez de deixar o bloco de memória vazio, seu sistema operacional mantém os arquivos lidos recentemente nesse espaço. Se um aplicativo precisar dessa memória, ela será usada pelo aplicativo. Até lá, há uma chance de evitar que você precise ler um arquivo do disco novamente, se for mencionado com frequência.

De acordo com este gráfico, seu consumo efetivo de memória não mudou durante toda a duração do gráfico.


É possível instruir o servidor para não armazenar em cache esses arquivos? Acho que devo executar sync; echo 3 > /proc/sys/vm/drop_cachesapós o backup?

13
@ stan31337 Sim, é possível, não, você não deve fazer isso. Ter esse arquivo na memória não custa nada. Se você limpar todos os seus caches, todos os arquivos armazenados em cache e que precisarão ser lidos novamente a partir do disco apenas tornarão seu sistema lento. Deixe fazer o que foi projetado para fazer.
Jeff Ferland

2
@ stan31337 Quando você exclui seu arquivo de backup, o sistema operacional o expulsa automaticamente do cache (é por isso que sua memória livre salta novamente após a exclusão) - o Linux é inteligente o suficiente para saber que um arquivo que não está aberto e não pode ser alcançado a partir da árvore do sistema de arquivos nunca será acessado novamente. Como Jeff disse que você definitivamente não quer despejar seu cache FS todo (o sistema só vai ter que re-ler e re-cache que os dados do disco, que vai realmente fazer o seu servidor mais lento por um tempo)
voretaq7

61

Você está enfrentando o problema Linux Ate My Ram .

Não entre em pânico.

Isso não é um problema.

Seu sistema está funcionando como projetado.

O problema não é o seu sistema operacional - o problema é sua compreensão do que é a memória "livre".


Os sistemas Unix usam memória para mais do que apenas executar programas. A memória pode ser usada para:

  • Programas em execução (ativos / usados)
  • Buffer de dados em trânsito (buffers)
  • Cache de dados recentemente lidos / gravados no disco (cache)
  • Absolutamente nada (grátis)

A seguir, é apresentado um breve tour (e amplamente incompleto) sobre como os sistemas Unix modernos relatam o uso da RAM.

O que é memória livre (a definição do SO) ?

Quando um sistema Unix está relatando RAM como Livre , significa "Não estou usando esta RAM para nada".
A RAM livre é efetivamente inútil - não está tornando o sistema mais rápido, apenas fica "livre", caso algo precise. Que algo poderia ser um dos outros três itens que mencionei acima.

O que são memória cache e buffer?

Memória cache e buffer são RAM que o sistema operacional está usando para acelerar seu sistema.
Como essa memória não é necessária para a execução de programas no momento , seu sistema operacional está usando-a para armazenar dados de que precisa com freqüência - por exemplo, a biblioteca C (necessária para praticamente todos os programas em execução) é quase sempre mantida na cachememória. O sistema não precisa ir ao disco para encontrar as instruções necessárias para imprimir "Hello World" na tela.
Na verdade, é muito mais complicado do que isso - há memória compartilhada , memória com fio etc. - mas, para nossos propósitos, essa explicação simples é adequada.

O que é memória ativa?

A memória ativa faz parte do que entendemos como memória "usada" - RAM que os aplicativos estão usando para o que quer que eles façam - classificando planilhas, servindo páginas da web, editando gráficos etc.
A memória "ativa" está "ativa" recentemente - - o programa que alega ter feito uso de seu conteúdo (leitura ou escrita) e não é considerado um bom candidato para a troca.

O que é memória inativa?

Como a memória ativa, a memória inativa é a RAM que os aplicativos estão usando para o que eles fazem. A diferença é que essa memória não é acessada há algum tempo; portanto, se for necessário empurrar, o sistema operacional acha que pode ser trocado para o disco e (com um pouco de sorte) o programa alegando que não a solicitará novamente. nunca vai perceber.

O que é a memória "Usado" (a definição HUMAN)

O que você e eu consideramos como memória "Usado" é, essencialmente, a soma da memória Ativa e Inativa. Toda a RAM atualmente reivindicada pelos aplicativos para uso.
Contanto que você tenha mais RAM instalada do que a soma da memória Ativa e Inativa (além de uma boa margem de segurança, digamos 512 a 1024 MB no topo), você estará em um local adequado: seu sistema operacional provavelmente não estará afetando a troca e prejudicando o desempenho .

O que é memória "Livre" (a definição HUMAN) ?

O que você e eu consideramos como memória "livre" é a memória disponível para executar programas.
Isso é um pouco mais complicado do que apenas a figura "Grátis" que o seu sistema operacional informa. Quando um programa solicita RAM, o sistema operacional tenta obtê-la da maneira menos perturbadora possível:

  • Se houver memória livre disponível (sem fazer nada), a RAM será alocada.
  • Se não houver memória livre disponível, o sistema operacional irá canibalizar o espaço do cache e do buffer: o material acessado menos recentemente / com menos frequência no buffer pool será descartado e a RAM fornecida ao programa.
  • Se não houver RAM de buffer / cache para canibalizar, o trocador examinará a memória inativa e escolherá as regiões que acha que têm menor probabilidade de serem acessadas. Esses dados serão paginados para troca (disco) e a RAM recém-liberada fornecida ao programa.
  • Se toda a RAM inativa tiver sido trocada, o trocador começará a colocar a RAM ativa no disco.
    (É nesse ponto que o desempenho geralmente ocorre: sempre que um programa aciona a CPU, seus bits trocados precisam ser trazidos de volta à RAM, o que significa que a memória ativa de outro programa precisa ser trocada - a alta rotatividade no swap é chamada thrashing )
  • Se o sistema trocou tudo o que pode (e preencheu a partição de troca), ou se você estiver executando um sistema sem uma partição de troca, coisas ruins acontecem. Nesse ponto, uma das duas coisas ocorrerá:
    • malloc()vai falhar. Esse é o comportamento de conformidade com o POSIX - o sistema operacional informará o programa solicitando RAM que não pode atender à solicitação.
      O programa pode pedir menos RAM ou, se não puder se contentar com um pedaço menor de memória, pode limpar e sair. (Se o programa estiver mal escrito, ele simplesmente trava.)
    • Se você estiver em um Linux, o OOM-Killer pode entrar em uma onda de assassinatos, terminando outros processos para tentar liberar RAM suficiente para atender à solicitação.
      Caso você não saiba pela minha descrição aqui e pela resposta à pergunta vinculada, acho que essa é uma maneira terrível de lidar com o problema.

Por que a RAM livre aumenta quando você exclui arquivos?

No exemplo da pergunta aqui, você notou que é possível "libertar" a RAM excluindo o arquivo de backup - a explicação para isso é bastante simples: como nada está usando esse arquivo (nenhum identificador de arquivo aberto) e não é mais acessível a partir de o sistema de arquivos (desvinculado), o sistema operacional sabe que ninguém jamais acessará esses dados novamente e remove os dados do cache do sistema de arquivos.
Isso faz com que o sistema operacional reporte mais memória livre, mas não afeta o desempenho do sistema.


Agora está perfeitamente claro para mim ... Minha experiência com o Linux é de aproximadamente 2 meses, tudo começou com este servidor Debian. Há um mês, instalei o Gentoo no meu laptop em casa e fiquei tão impressionado com o desempenho que mudou completamente de usuário do Windows para usuário do Linux, mesmo no meu computador de trabalho. É ótimo aprender Linux com o Gentoo, e ainda há muito o que aprender.

@ stan31337 Você não é o único a quem não está claro - é especialmente difícil para quem vem de um plano de fundo do Windows, porque, a menos que você o analise, o Windows não relata o uso de memória com esse nível de detalhe - é apenas "Usado" (pelos programas ) e "Grátis" (para a execução de programas). Os usuários de Mac ficam um pouco mais fáceis porque o Activity Monitor é basicamente uma versão gráfica tope relata RAM livre / com fio / ativa / inativa.
voretaq7

Eu costumava trabalhar com o Process Explorer no Windows, ele tinha um monte de coisas memória para show, mas a maioria deles eram tão claro para mim, que eu realmente não olhar para eles ...

2
Além disso, deve-se notar que, embora o Windows normalmente não o mostre com tantos detalhes, ele possui uma configuração muito semelhante.
Joachim Sauer

Você sabe, mesmo no Windows, a leitura da memória é confusa. Isso é algo em que os fabricantes de sistemas operacionais podem querer enfatizar mais, ou melhor, algo com o qual os usuários devem se importar menos do que atualmente.
Gparent

2

Outra coisa para verificar se o acima falhou:

Verifique o uso do cache Slab ( Slab:, SReclaimable:e SUnreclaim:in /proc/meminfo). Este é um cache de estruturas de dados no kernel e é separado do cache da página relatado por free.

Se o cache da laje é responsável por grande parte da "falta de memória", verifique /proc/slabinfopara onde foi. Se é dentries ou inodes, você pode usar sync ; echo 2 > /proc/sys/vm/drop_cachespara se livrar deles.

Você também pode usar a slabtopferramenta para mostrar o uso atual do cache Slab em um formato amigável. cclassificará a lista pelo tamanho atual do cache.

De: https://stackoverflow.com/a/5467207

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.