Por que o Red Hat Linux reporta menos memória livre no sistema do que realmente está disponível?

9

Eu tenho um servidor Red Hat Linux doméstico relativamente pequeno (cerca de 8 GB de RAM). Não o uso apenas para executar alguns aplicativos criados em casa para acompanhar várias coisas. As únicas coisas reais em execução na caixa são um banco de dados e um servidor web.

Notei que, ao verificar os contadores do sistema usando ferramentas como NMON e TOP, a memória livre total do sistema é relativamente baixa (da ordem de algumas centenas de MB), enquanto a memória ativa do banco de dados e do servidor da Web ainda é baixa (apenas consumir 3 GB combinados). Mesmo ao incluir todos os outros processos em execução, o total de memória consumida é inferior a 4 GB.

Por que o Red Hat Linux relata menos memória livre que a memória total menos a soma total da memória usada dos processos em execução?

Aaron K
fonte

Respostas:

19

Não confunda memória livre com memória não utilizada. Memória livre, no mundo unix, é uma página de memória física que não possui dados lógicos mapeados para ela. A memória não utilizada possui alguns dados mapeados, mas atualmente não está em uso ativo por um processo em execução.

% free -m
             total       used       free     shared    buffers     cached
Mem:           997        942         55          0         71        366
-/+ buffers/cache:        504        492
Swap:         2015        618       1397

O Linux (e todos os sistemas operacionais Unix) tentam ter o mínimo de memória livre possível. Em vez disso, eles usam memória que não é mapeada ativamente para processos no sistema operacional em execução, como cache de arquivos e buffers para várias operações de transferência de E / S.

Outra coisa que pode confundir você é que você não pode simplesmente adicionar a memória em uso por todos os processos em execução para obter uma figura total de memória em uso. Se você tentasse isso, descobriria rapidamente que seus aplicativos parecem estar usando mais memória do que realmente existe na máquina. Isto é por duas razões

  1. A memória pode ser compartilhada entre vários processos, através da alocação de memória Copy-On-Write , E / S mapeada na memória e bibliotecas dinâmicas compartilhadas .
  2. O sistema operacional tem a liberdade de prometer mais memória para o aplicativo do que realmente forneceu. A teoria é que a maioria dos criadores de aplicativos prefere pedir grandes quantidades de memória de uma só vez, para evitar sobrecarga, e pode não usar toda essa memória.

Há um artigo recente no lwn.net discutindo esse problema .

Dave Cheney
fonte
1
Uma explicação simples também é fornecido aqui: linuxatemyram.com
Steven T. Snyder
4

O Linux armazenará em cache ativamente os acessos do sistema de arquivos na memória para oferecer tempos mais rápidos de acesso ao disco. Não é nada para se preocupar.

Executar free -m na caixa dará uma idéia melhor de onde a memória está sendo usada.

Abaixo está a saída retirada de uma das minhas caixas. A memória livre é 147Meg com quase 4G em cache para solicitações de acesso ao sistema de arquivos.

free -m
             total       used       free     shared    buffers     cached
Mem:          6035       5888        147          0         77       4116
-/+ buffers/cache:       1693       4341
Swap:         4722          0       4722
Ryaner
fonte
1

Você também está incluindo os campos "em buffer" e "em cache"?

jj33
fonte
1

Com o linux, veja Committed_AS em / proc / meminfo, essa é a quantidade de memória (real + swap) que o kernel realmente prometeu executar os processos.

O Linux usa a memória com muita eficiência, quaisquer blocos não prometidos para algum processo são usados ​​para armazenar em cache arquivos acessados ​​recentemente / com freqüência. Portanto, é típico do Linux usar 90% de toda a memória física disponível, não muito tempo após a inicialização.

Veja o que o kernel se comprometeu a fornecer .. e uso sujo (troca), isso fornece uma visão geral melhor.

Se você precisar ajustar esse comportamento, atualize sua pergunta :)

Este é o MO padrão para Linux. Algumas distribuições ajustam o gerenciamento de memória para atender às suas necessidades via sysctl. No entanto, o que você relata é bastante típico entre todos.

Tim Post
fonte
1

Que tipo de kernel você está executando no sistema? Um kernel de 32 bits reportará apenas cerca de 3,6 GB de memória, a menos que compilado com o PAE ativado.

Dizendo que, se esta é uma versão moderna do Redhat Enterprise Linux (ou CentOS) - v3 em diante -, o kernel padrão de 32 bits terá isso ativado.

Se você puder postar a saída do comando 'free' detalhado acima, poderemos ver se esse é o problema.

Mike Pountney
fonte