Servidor CentOS 6.5 - Consumo de memória não diminui nunca

Pessoal, acabei de montar um pequeno servidor para uma única aplicação.

CentOS 6.5, Php 5.4.26, MySql 5.5, 1GB de Ram.
Sempre usei o ubuntu server, mas aproveitei a oportunidade para aprender um pouco sobre essa distribuição.
Tenho notado algo que acho estranho, talvez por não conhecer tão bem o sistema.

Quando reinicio o servidor, a memória livre está em torno de 750MB.
Quando o sistema está em uso, por 4 ou 5 usuários no maximo, a memória livre cai para míseros 16MB. Mesmo assim o sistema não fica lento nem dá erro de falta de memória.

O problema é que, quando não tem ninguém usando, o sistema não libera memória, ficando sempre com a memória livre em torno de 16MB livres.

Um exemplo do top:
top - 10:50:09 up 16:17, 1 user, load average: 0.09, 0.04, 0.05
Tasks: 110 total, 1 running, 109 sleeping, 0 stopped, 0 zombie
Cpu(s): 9.5%us, 0.3%sy, 0.0%ni, 90.0%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1030452k total, 1013836k used, 16616k free, 72044k buffers
Swap: 2097144k total, 500k used, 2096644k free, 200864k cached

Tenho acompanhado a manhã inteira e esses valores não mudam quase nada.
O que mais varia é o “CPU us”: de 0 a 15% e o “CPU id”: de 80 a 95%
O restante praticamente não muda.

Pergunta: Não há um modo do sistema otimizar melhor a memória livre, liberando recursos quando não está em uso?

Você usou o instalador da netmake ou configurou manual o ambiente?

Veja estas duas situações:

  1. O gnu/linux usa a memória de um jeito diferente do windows: http://www.thiagoelias.org/site/posts/ler/63

  2. Seu servidor esta dimensionado errado http://www.scriptcase.com.br/forum/index.php/topic,5689.msg41378.html#msg41378

As vezes você acha que esta alto o consumo de memória no gnu/linux, mas é somente cache como o thiagoelias explicou.
Você tem que se preocupar e quando o gnu/linux começa a usar o swap. Ai sim o consumo de memória está alto.

Oi Alexandre, bom dia.

Fiz instalação manual via yum e configurando os arquivos necessários manualmente.

O servidor só tem 1 GB de RAM, mas são 3 usuários usando direto e mais 2 esporadicamente.

No momento, o top tá assim:
top - 10:40:12 up 1 day, 16:07, 1 user, load average: 0.00, 0.02, 0.04
Tasks: 109 total, 2 running, 107 sleeping, 0 stopped, 0 zombie
Cpu(s): 14.8%us, 0.7%sy, 0.0%ni, 82.6%id, 1.8%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 1030452k total, 977508k used, 52944k free, 17896k buffers
Swap: 2097144k total, 84440k used, 2012704k free, 61052k cached

De ontem a tarde pra cá começou a usar o swap, mas não chegou em 100MB ainda.

Mesmo ele começando a usar o swap, o sistema está bem rápido e estável. Nenhuma reclamação até agora, e olha que as meninas que usam ligam pra mim por qq detalhe diferente.

Se o bicho pegar eu adiciono mais 1 GB. É o limite pra VM no provedor daqui.

Eu poderia listar aqui um ps aux pra vc dar uma olhada se tem como eliminar algo que eu não use?

EDIT: Esse link do blog tiagoelias.org não abre. O site inteiro tá fora.

Posto aqui o texto do thiago elias:

Gerenciamento de memória no Linux
Após ouvir vários usuários reclamando do alto consumo de memória apresentado no Linux, resolví escrever este post para esclarecer melhor o gerenciamento de memória neste sistema operacional.

O consumo exibido, nem sempre reflete o consumo real de memória em seu computador, pois o Linux gerencia de forma inteligente seus recursos.

O que acontece, é que o Linux utiliza grande parte da memória ociosa para cache, afim de agilizar processos, que é o que chamamos de uso inteligente de memória.

Durante o período de ociosidade, o sistema operacional irá utilizar a memória, mas tão logo o usuário precise do recurso, o Linux imediatamente irá liberá-lo, e então o processo que foi iniciado passará a utilizar a memória necessária sem nenhum problema.

Na imagem abaixo, podemos ver um mini-aplicativo do superkaramba exibindo a quantidade livre de memória:

Na imagem, temos apenas 111mb de memória livre em um sistema com 882Mb de ram. Ou seja, consumo de 771Mb com poucos processos em execução, o que é realmente absurdo e faz com que qualquer usuário, pense que até o Windows Vista é mais leve que o Slackware Linux 12.

No entanto, o consumo exibido acima, reflete apenas o total em uso, contando o que realmente está sendo utilizado mais o cache.

Agora, através do console, iremos executar o comando “free -m”, que indicará de forma bem simples, as informações de consumo de memória em Mb.

Temos agora muito mais detalhes, e enfim, podemos observar que o Linux está fazendo cache de 402Mb de Ram.
Na segunda linha, abaixo de “free”, temos a quantidade de memória que realmente temos livre, que no caso é 592mb.

O Linux, deixará de fazer cache, quando o usuário realmente utilizar a memória em sua totalidade, e a partir daí, os processos utilizados pelo usuário e ou pelo sistema podem também utilizar a memória de troca (swap) conforme for necessário.

O ideal, é sempre estar atento ao consumo de memória nas aplicações que mostrem realmente o quanto você ainda dispõe de memória, como o “free”, que utilizamos neste artigo, e também o “top”, que mostram exatamente o quanto de memória está uso pelos aplicativos e pelo sistema operacional.

Podemos então afirmar com certeza, que o Linux gerencia de forma muito inteligente a memória disponível, já que em vez de apenas deixá-la livre, irá utilizá-la para melhorar o desempenho de alguns processos.

Legal!

Somente a título de curiosidade. Sobre o htop
fonte:
http://linuxpoison.blogspot.com.br/2009/10/what-is-difference-among-virt-res-and.html

Cito:

What is the difference among VIRT, RES, and SHR in top output
Posted by Nikesh Jauhari
VIRT stands for the virtual size of a process, which is the sum of memory it is actually using, memory it has mapped into itself (for instance the video card’s RAM for the X server), files on disk that have been mapped into it (most notably shared libraries), and memory shared with other processes. VIRT represents how much memory the program is able to access at the present moment.

RES stands for the resident size, which is an accurate representation of how much actual physical memory a process is consuming. (This also corresponds directly to the %MEM column) This will virtually always be less than the VIRT size, since most programs depend on the C or other library.

SHR indicates how much of the VIRT size is actually sharable memory or libraries. In the case of libraries, it does not necessarily mean that the entire library is resident. For example, if a program only uses a few functions in a library, the whole library is mapped and will be counted in VIRT and SHR, but only the parts of the library file containing the functions being used will actually be loaded in and be counted under RES.

Boa Alexandre!