terça-feira, 6 de dezembro de 2011

Gerenciamento de memória no Linux


O Linux gerencia memória de uma forma bastante interessante. O sistema Linux não necessita de muita memória para suas operações e conforme os programas vão sendo abertos, mais memória vai ser alocada, mas de forma mais eficiente. O sistema trabalha bem nos casos de sobras de memória, utilizando os MBytes livres dos módulos principalmente o cache de disco. Cache de disco é a porção da memória RAM usadas por arquivos e bibliotecas lidos diretamente do HD que têm uma maior probabilidade de serem acessados, uma espécie de Prefetch (O pré-fetch ( fetch = busca) é uma busca antecipada, ou seja, uma técnica que deixa os dados disponíveis antes de você precisar deles), o que aumenta o desempenho do sistema.
É fácil verificar a eficiência o cache de disco: abrindo qualquer programa no sistema; você notará que o primeiro carregamento é demorado, se fechar o programa e abrir-lo posteriormente sem reiniciar o computador vai notar que levará menos tempo para carregar o mesmo programa que foi aberto anteriormente. Esse recurso o Windows também possui e no Vista ele foi melhorado.
Para analisar a utilização da memória no Linux existem vários meios gráficos e modo texto, um exemplo de aplicação gráfica para fazer isso é o Ksysguard presente no KDE, temos o Monitor do sistema no Gnome para monitoramento desse recurso no sistema.
Via terminal existe os comandos top e o free. O top detalha os processos em execução real time (em tempo real) além de outras informações como o estado dos processos, memória consumida por cada um, uptime do sistema e recursos de memória.
Já o free (com o parâmetro -m exibe as informações em MBytes) exibe informações precisas sobre o uso dos recursos de memória do sistema.

No comando top observe que a memória é gerenciada com muita qualidade de forma que o sistema não deixa estourar facilmente a memória convencional, mesmo com a quantidade de processos alocando a mesma, mas se for preciso o sistema lança mão do arquivo de paginação que é a swap.
Repare que a forma de gerenciamento da é muito refinado, conforme mais memória é requisitada, o sistema passa a abrir mão do cache de disco e passa a mover arquivos e bibliotecas não usadas há algum tempo da memória RAM para a memória virtual ou swap, liberando memória física para os aplicativos.
Há um pequeno impasse no uso de memória SWAP no Linux. O Swap é visto com maus olhos por causa do Windows 98, que gerencia a memória virtual de forma totalmente errádica. No 98, mesmo com memória física sobrando o sistema teima em fazer swap, que é feito no arquivo Win386.swp, prejudicando o desempenho do sistema.
O Linux possui algoritmos refinados que administram o uso de memória SWAP somente quando necessário, especialmente a partir do Kernel 2.6. Numa máquina com 512MB ou mais o uso de SWAP não é requisitado o tempo todo, o que não acontece numa máquina com 256 MB. Mesmo assim em algumas distros fazem o uso do SWAP em máquinas com fartura de memória, mesmo que em pequena quantidade. No caso dos dados movidos para o SWAP sejam de repente requisitados, haverá uma pequena demora na leitura, pois como já dito, a leitura no HD é mais demorada do que o acesso na memória física.

"...Ainda assim (ao usar uma distribuição com o Kernel 2.6), você pode configurar o comportamento do sistema em relação à memória SWAP através de um parâmetro do Kernel, definindo através do arquivo "/proc/sys/vm/swappiness". Este arquivo contém um número de 0 a 100, que determina a predisposição do sistema a usar swap. Um número baixo faz com que ele deixe para usar swap apenas em situações extremas (configuração adequada a micros com muita RAM), enquanto um número mais alto faz com que ele use mais swap, o que mantém mais memória RAM livre para uso do cache de disco, melhorando o desempenho em micros com pouca memória.

Se você tem um micro com 1 GB de RAM e quer que o sistema quase nunca use swap, use:

# echo "20" > /proc/sys/vm/swappiness

Em micros com 256 MB ou menos, aumentar o uso de swap mantém mais memória disponível para abrir novos aplicativos e fazer cache de disco. O programa que está sendo usado no momento e novos programas abertos ficam mais rápidos mas, em troca, programas minimizados a muito tempo são movidos para a swap e demoram mais para responder quando reativados. Para aumentar o uso de swap, use:

# echo "80" > /proc/sys/vm/swappiness

Para tornar a alteração definitiva, adicione o comando em algum arquivo de inicialização do sistema, como o "/etc/rc.d/rc.local" ou "/etc/init.d/bootmisc.sh".
..."

É recomendado o uso de uma partição SWAP, mesmo que seja de 512MB para uso em casos de falta de memória, principalmente para as máquinas usadas em aplicações pesadas como edição de áudio, vídeo e imagem. Claro que em situações de fartura, digamos a partir de 1GB, a partição de SWAP pode ter 256 a 512MB reservados. Nos casos de máquinas que possuam menos de 512MB, recomendo o uso de SWAP com tamanho a partir de 1GB para que o sistema tenha para onde correr no caso de falta de memória física, já que na falta de memória RAM para os aplicativos e a ausência de uma partição SWAP, o sistema não terá para onde recorrer e os programas começarão a serem fechados por falta de memória; na pior das hipóteses o travamento do sistema nestas condições é inevitável.

Para criar uma partição SWAP, é possível criar um arquivo de SWAP na raiz do sistema. Digamos que você queira 512MB de memória SWAP, abra um terminal como root e digite:

# dd if=/dev/zero of=/swap bs=1024 count=524288
# mkswap /swap
# swapon /swap

O valor de "count" não precisa ser exato (524288 equivalem a 512MB), poderia ser o valor 500000 (500000 = ~488MB). Esta é uma solução temporária e menos eficiente, já que estamos criando um arquivo de swap que funciona de forma semelhante ao que é encontrado no Windows, embora de forma mais eficiente.
Uma partição SWAP já é organizada especificamente para a tarefa de memória virtual.

Bibliográfia:
Livro: Linux Ferramentas Técnicas 2ª Edição - pág 112, do livros do Carlos E. Morimoto, 2007.