Logo Hardware.com.br
N0625
N0625 Super Zumbi Registrado
7.1K Mensagens 785 Curtidas

Como funciona o gerenciamento de memória no Linux

#1 Por N0625 05/08/2007 - 12:21
Fala, galera!!

Ultimamente estou errando tanto em postar tópicos em área errada que fiquei com receio, mas não achei um local mais adequado, então desde já peço desculpas se estou postando em local errado.


Vou mostrar neste artigo como funciona o gerenciamento de memória no Linux, inclusive com dicas para administrar a memória SWAP. ^^

O Linux tem uma forma bastante interessante de gerenciar a memória. O sistema de fato não necessita de muita memória para sua operação e conforme os programas vão sendo abertos, mais memória vai sendo alocada de forma mais eficiente. O sistema lida bem em casos de sobras de memória, utilizando os MBytes livres dos módulos como cache de disco. Cache de disco são porções da memória RAM usadas por arquivos e bibliotecas lidos do HD que têm uma maior probabilidade de serem acessados, uma espécie de Prefetch, o que melhora o desempenho do sistema. É fácil comprovar a eficiência o cache de disco: abra um programa como o Firefox ou o OpenOffice; o primeiro carregamento é demorado, certo? Agora feche o programa e abra-o novamente: levou muito menos tempo, né? Esse recurso está presente também no Windows e no Vista ele foi melhorado. Por isso não se assuste se no Ksysguard do KDE você verificar que sua memória RAM estiver quase que totalmente ocupada, mesmo com poucos programas abertos: é o cache de disco que está em ação usando parte da memória livre que você dispõe.

Além do Ksysguard, temos o Monitor do sistema no Gnome como programas gráficos de monitoramento dos recursos do sistema. Via terminal temos o top e o free. O top detalha os processos em execução 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. O free (o parâmetro -m exibe as informações em MBytes) exibe informações precisas sobre o uso dos recursos de memória do sistema. Vamos ver ele na prática, no meu caso tenho 2,25GB de RAM física, 2 GB de espaço em disco para a partição SWAP e poucos programas abertos. A distribuição usada é o Debian Etch Kernel 2.6.18-4.

Imagem

No momento que foi tirada esta SS, 591MB de memória física estavam sendo utilizados, mas na verdade eu não tinha 591MB utilizados pelos programas abertos e pelo sistema em geral. 347 MB estavam sendo cacheados, ou seja, sendo usados para cache de disco (cached) e 51MB estavam sendo usado para buffers de memória. Fazendo as contas, descontando os buffers e cache do sistema, a memória utilizada para o uso e manutenção do funcionamento do sistema no momento era de 193 MB:

591 (memória física utilizada) - 398 (buffers + cache) = 193 MB

Se eu abrir o Monitor do sistema do Gnome (um front-end para o comando top), serão reportados 193MB em uso pelo sistema.

Imagem

Ao contrário do Ksysguard, o Monitor do sistema do Gnome reporta a memória em uso, não incluindo a memória utilizada como cache de disco.

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, já que a leitura dos dados da memória SWAP (que é feita em um arquivo no HD no caso do Windows) é mais morosa do que a leitura na memória RAM. Era possível corrigir essa deficiência com a instrução "ConservativeSwapfileUsage=1" no System.ini, mas mesmo assim o Windows 98 (e Me) é péssimo para gerenciar a memória. Na família NT o gerenciamento de memória é mais eficiente e o uso do arquivo de SWAP é mais racional, aliás no Windows NT4/2000/XP/2003/Vista e 2008 o arquivo de paginação (pagefile.sys) é utilizado também para uso interno do sistema, como as informações de despejo de memória.

O Linux possui algoritmos refinados que administram o uso de memória SWAP somente quando necessário, especialmente no 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.

Vou transcrever aqui um trecho de um dos livros do Carlos E. Morimoto que ensina como administrar o uso do SWAP apenas quando necessário.

"...

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".

..."
Linux Ferramentas Técnicas 2ª Edição - pág 112.

Pessoalmente, recomendo 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 uns 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.

Caso você tenha se arrependido em não ter criado uma partição SWAP e agora se vê numa situação delicada, é 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.

See ya! wink.png
angeloshimabuko
angeloshimab... Veterano Registrado
933 Mensagens 67 Curtidas
#16 Por angeloshimab...
28/08/2007 - 10:45
sifion disse:
mto bom!!! parabens!!!

alguém sabe me dizer, que diretivas o sistema usa para a alocação de memória swap? quer dizer, se o sistema já está utilizando toda a memória física e mais uma parte da swap... q critérios o sistema utiliza para decidir qual informação vai para a swap e qual vai para a memória física?

abraço...


Primeiro, para facilitar o entendimento, seja a seguinte nomenclatura: (i) a memória física principal (RAM) é dividida em blocos chamados molduras de página (page frames); (ii) o espaço ocupado por um processo é dividido em blocos chamados páginas (pages). Assim, uma página pode ou não estar contida em uma moldura, i.e., pode ou não estar na memória principal.

No Linux, o algoritmo utilizado para atender às solicitações de memória feitas pelos processos (aplicações) chama-se page frame reclaiming algorithm - PFRA. Esse algoritmo foi desenhado para permitir a alocação de molduras de página em várias situações: muita memória disponível, pouca memória disponível e situação crítica (quando não é possível alocar molduras para um determinado processo). Como o jqueiroz já citou, esse algorimo baseia-se numa método chamado LRU (least recently used - menos recentemente usado).

Simplificadamente, método LRU é implementado usando-se duas listas encadeadas: (i) inactive_list e (ii) active_list. Quando uma página, ao ser varrida pelo gerenciador de memória (mm), é identificada como inativa, uma marca (flag) é colocada na respectiva tabela de páginas; se receber duas marcas, irá para a lista inactive_list. Quando o gerenciador de memória (normalmente um serviço do kernel denominado kswapd) necessita de memória, irá escolher as molduras que estão no fim da lista para transferir seu conteúdo para o espaço de troca (swap space).

O algoritmo PFRA leva em consideração vários fatores para paginação, tais como se a página está compartilhada entre vários processos, se pertence ao buffer ou à cache, se é reservada, etc.

Se uma condição crítica ocorre, i.e., não é possível alocar uma moldura de página para um processo, e o espaço de troca também está totalmente ocupado, o kernel utiliza uma função chamada out of memory killer, que irá escolher um processo e matá-lo, para liberar suas páginas. Essa escolha não é aleatória, e utiliza certos parâmetros, como: não pode ser uma kernel thread, o processo init (pid 1) ou o swapper (pid 0); não deve ser um processo que esteja acessando determinados tipos de hardware, como o servidor X; não deve ser um processo iniciado pelo root; e assim por diante.

Em condições normais o processo kswapd irá tentar manter um certo número de molduras disponíveis - esse número normalmente estará entre dois valores - pages_low e pages_high - calculados a partir de outro valor, chamado pages_min (pages_low = (5/4) * pages_min e pages_high = (3/2) * pages_min) que é determinado na inicialização do kernel e que depende da quantidade de memória física instalada.
sifion
sifion Membro Senior Registrado
243 Mensagens 12 Curtidas
#17 Por sifion
06/09/2007 - 12:51
eu esperando um comentário simples, e vem logo um tuto sobre o assunto...

valeu!!!

fica tb a sugestão para adicionar essas informações no post original, acho q acrescenta bem ao tema...

abraço...
Asus A7V8X-X | Sempron 2200+ @1800MHz | Nvidia FX5200 128MB | Ram DDR400 512MB

Debian lenny netinst + xfce4 | Kernel 2.6.22-sifion-1

Linux não é windows!!!

resolveu seu problema? edite o título do post adicionando um [resolvido]

GambiWare Total!!piscadela.png
wuemura
wuemura Tô em todas Registrado
1.1K Mensagens 83 Curtidas
#18 Por wuemura
21/09/2007 - 00:18
Não sei como funciona nas outras distribuições, mas em distribuições baseadas em Red Hat não é necessário fazer o comando echo "20" > /proc/sys/vm/swappiness, que é uma herança do 2.2 e 2.4 big_green.png

Todas as opções estão disponíveis via sysctl, por exemplo:
[root@tompc etc]# sysctl -A|grep swappiness
vm.swappiness = 10
Agora adicione o comando no /etc/sysctl.conf, ex:
vm.swappiness = 10
AMD Phenom X4 9950+ - ASUS M4A78 PRO - 2GB DDR2 800 OCZ Platinum - 800GB Barracuda SATA2 (RAID 0)
ATI Radeon HD3200 - LG FLATRON W2353V
emtudo
emtudo Super Participante Registrado
851 Mensagens 4 Curtidas
#19 Por emtudo
21/11/2007 - 00:11
ótima dica...
so me trouxe confusao no topico se era uma pergunta ou uma dica, se vc editar e colocar "[dica]" antes no titulo do topico fica mais facil de entender?

mas ficou otimo, bom eu gostei...

eu tenho 2025 Giga de memoria fisica, e o meu arquivo tinha um valor de 60, foi bom, pq eu tinha estranhando uma certa vez ele usar a swap ao inves de deletar arquivos do cache. mas agora eu acho que entendi, coloquei apenas 20 neste arquivo, para diminuir a prioridade da swap
----->HENRIQUE<-----
Linux User #444017 - Linux Machine #350904
Ubuntu 10.04 - Pentium Dual-COre E5400 2.7Ghz - 2hdx500GB - 2x2GiB RAM - GeForce 9400 GT 1GiB compiz
mahapra
mahapra Novo Membro Registrado
4 Mensagens 0 Curtidas
#20 Por mahapra
23/02/2008 - 01:01
Pessoal desculpem colocar mais uma pergunta aqui após 95 dias de inatividade deste tópico mas é que acho que vai completar este assunto se pudermos encerrar falando algo sobre os buffers e também sobre o comando vmstat.

Abaixo mostro a saida de um comando "vmstat" o qual exibe 03 situações da RAM em intervalos de 1 segundo.

Tenho 512MB/RAM com 1GB de partição de swap. Podemos ver que 209,232MB esta sendo usado como cache (cache de disco). Como já foi explicado acima, isso é útil pois agiliza muito a recarga de programas usados recentemente, caso contrário teriam que ser lidos novamente no disco ou na partição de swap.

A questão é : Pra que serve aquela parte destinada a buffers ?
seriam por acaso buffers de arquivos abertos? ou o que mais?



:$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 209020 15028 209232 0 0 36 9 378 185 3 0 96 1
0 0 0 209020 15028 209232 0 0 0 0 359 237 1 0 99 0
0 0 0 209020 15036 209224 0 0 0 12 354 212 0 0 100 0

Descrição dos campos:
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.

swpd: quantidade de memória virtual usada
free: quantidade de memória livre
buff: quantidade de memória usada como buffers
cache: quantidade de memória usada como cache
inact: quantidade de memória inativa (exibido com a opção -a)
active: quantidade de memória ativa (exibido com a opção -a)

si: "swapped in" quantidade de memória trazida do swap em disco.
so: "swapped out" quantidade de memória armazenada no swap em disco.



Outro teste: Eu judiei, abri trocentas janelas de aplicativos pra ver se o bicho abria o bico... mas mesmo assim, é muito difícil ver alguma indicação de uso da área de swap, parece que os 512MB dão conta do recado sem precisar recorrer ao swap em disco!!!
" Êta gerenciamento bão! " cap_feceiro.png:

agradeço a todos!
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal