Gerenciamento de memória swap no sistema operacional Linux
By Fernando Mariano
- 8 minutes read - 1639 wordsA memória swap ou memória virtual é de uso secundário e provê recursos extras para armazenamento de cache para a memória principal/física (RAM). Seu uso em excesso não é recomendável, pois com certeza seu serviço ou aplicação irá demonstrar lentidão para o usuário final.
Para um definição mais completa e como funciona a memória swap leia esta referência na Wikipédia.
Neste artigo irei abordar algumas dicas rápidas de como gerenciar a memória swap e acompanhar o seu uso:
#1 Como adicionar memória swap em servidores em nuvem em arquivo
Alguns servidores virtuais em nuvem, mais conhecidos como VPS (Virtual Private Network) com baixos recursos de hardware oferecem um número muito limitado de memória RAM e swap. Dependendo do seu uso você não precisa de uma instância maior e gostaria apenas de adicionar mais memória swap.
Uma forma paliativa é adicionar memória swap por meio de um arquivo do sistema operacional. Na prática você gera um arquivo na partição ext3 ou ext4, por exemplo, com o comando dd, configura as permissões necessárias para garantir acesso restrito ao usuário root e depois formata o arquivo com o sistema de arquivos “swap” e ativa-o no boot do sistema operacional.
Ao reiniciar o servidor a memória swap já estará disponível para uso.
# gera o arquivo com tamanho de 1 GB (1 MB \* 1024)
dd if=/dev/zero of=/swapfile bs=1M count=1024
# configura o dono do arquivo para o usuário root
chown root /swapfile
# garante permissão somente para o owner da memória swap
chmod 600 /swapfile
# formata o arquivo como uma partição swap
mkswap /swapfile
# ativa a memória swap
swapon /swapfile
# adicionar no fstab a partição swap para que seja montada no boot do sistema operacional
cat >> /etc/fstab
/swapfile swap swap defaults 0 0
# reiniciar o servidor para validar as configurações
shutdown -r now
Por exemplo, as instâncias menores da Amazon EC2 e Digital Ocean não possuem memória swap configurada por padrão. Veja abaixo:
Digital Ocean
root@test:~# free -m
total used free shared buffers cached
Mem: 490 220 269 0 23 158
-/+ buffers/cache: 38 451
Swap: 0 0 0
Amazon EC2
ubuntu@ip-172-30-0-84:~$ free -m
total used free shared buffers cached
Mem: 992 245 746 0 8 185
-/+ buffers/cache: 51 940
Swap: 0 0 0
#2 Verificar uso de memória swap de um sistema operacional Linux
Os comandos abaixo tem utilidades além das demonstradas abaixo, pois o foco do artigo é demonstrar algumas dicas de gerenciamento de memória swap no Linux.
Visualização da swap em tempo real
Comando vmstat
É utilizado para visualização de dados sobre o uso de memória virtual com informações sobre atividade de CPU, discos, IO de disco, paginação e etc.
O parâmetro 1 significa que a cada um segundo será impresso no console novas informações das estatísticas obtidas pelo comando vmstat. O importante é observar a coluna swap, que mostra os valores de si (total de memória trocados a partir do disco) e so (total de memória trocados para o disco) por segundo.
A primeira linha da saída do comando vmstat exibe uma média das estatísticas obtidas desde o boot do sistema operacional, por isso deve apresentar variações em relações as demais linhas.
Exemplo de um sistema operacional Ubuntu sem uso de memória swap:
mariano@piracaia:~$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 5777144 447092 1780860 0 0 39 39 92 527 6 2 90 2 0
0 0 0 5776888 447092 1780852 0 0 4 0 340 1774 2 1 98 0 0
0 0 0 5775336 447100 1780848 0 0 0 188 354 1910 2 1 96 0 0
0 0 0 5775336 447100 1780856 0 0 0 0 296 1804 1 1 98 0 0
Comando free
mariano@piracaia:~$ free -m
total used free shared buffers cached
Mem: 11964 5901 6062 81 432 1696
-/+ buffers/cache: 3772 8191
Swap: 0 0 0
O comando free -m também mostra o total de memória swap. A última linha exibe o total de memória swap, a quantidade usada e a quantidade livre. Apara acompanhar o uso de memória durante o troubleshooting de um determinado problema você pode combinar o comando free com o comando watch. O watch fará com que a saída do comando free seja repetida em um determinado intervalo de tempo, fazendo com que a impressão seja de monitoração em tempo real do uso de memória RAM e swap.
Experimente o comando watch -n 1 free -m ao ligar um máquina virtual para acompanhar o uso de memória RAM em tempo real na máquina física.
Comando top e htop
O comando top e htop é mais útil para descobrir qual o processo que está consumindo mais memória no sistema operacional. A melhor forma para descobrir é ordenar a coluna de uso de memória por ordem decrescente, assim fica fácil a identificação do processo.
No top o comando para alterar a coluna de ordenação é a combinação das teclas ctrl + > ou ctrl + <, e a alteração entre ordem crescente ou decrescente é a letra R (maiúsculo).
No htop os comandos são parecidos, para escolher a coluna de ordenação digite ctrl + > ou ctrl + < e um menu à esquerda irá surgir para selecionar por qual valor será realizada a ordenação. A ordenação crescente ou decrescente no htop é realizada pela letra I (i maiúsculo).
Verificação do histórico da swap no Linux
Nem só na linha de comando é possível acompanhar o uso de memória RAM e swap no Linux. Existem diversos aplicativos para visualização de acompanhamento de performance gráficos de uso de recursos de hardware.
Applet Ubuntu indicator-multiload - para visualização no painel superior do Ubuntu na interface gráfica do Unity. A instalação é feita pelo comando:
aptitude install indicator-multiload
E para realizar a configuração do aplicativo e mantê-lo na visualização do desktop ao lado do relógio da interface Unity, vá na busca do Dash e procure pelo System Load Indicator. Na figura abaixo é apresentada o uso de CPU, memória RAM, swap e load avarage do meu desktop Ubuntu.
Monitoração gráfica de uso de hardware no Linux / Ubuntu
Monitor de hardware nativo do Ubuntu - este aplicativo já vem instalado por padrão nas distribuições Ubuntu. Para visualizar o uso de recursos em gráficos procure pelo System Monitor na busca do Dash.
Monitoração gráfica de uso de hardware no Linux / Ubuntu
Voltando para a linha de comando é possível verificar o histórico de uso de memória swap através do comando sysstat.
O comando sar aceita o parâmetro S para visualização do uso de memória swap, porém o sar/sysstat é muito mais completo e mais opções de uso podem ser conferidas neste artigo sobre monitoração de performance via linha de comando com o sysstat e sar. O sysstat não costuma vir instalado nas distribuições do Ubuntu/Debian, por isso talvez seja necessária sua instalação. No artigo mencionado anteriormente há os passos necessários para a instalação e ativação.
Um exemplo da visualização da memória swap do dia corrente desde que o computador foi ligado e com marcações quando é reiniciado:
mariano@piracaia:~$ sar -S
Linux 3.13.0-32-generic (piracaia) 27-09-2014 _x86_64_ (8 CPU)
00:00:01 kbswpfree kbswpused %swpused kbswpcad %swpcad
00:05:01 0 0 0,00 0 0,00
00:15:01 0 0 0,00 0 0,00
Average: 0 0 0,00 0 0,00
13:25:56 LINUX RESTART
13:35:01 kbswpfree kbswpused %swpused kbswpcad %swpcad
13:45:01 0 0 0,00 0 0,00
13:55:01 0 0 0,00 0 0,00
14:05:01 0 0 0,00 0 0,00
14:15:01 0 0 0,00 0 0,00
14:25:01 0 0 0,00 0 0,00
14:35:01 0 0 0,00 0 0,00
14:45:01 0 0 0,00 0 0,00
14:55:01 0 0 0,00 0 0,00
Average: 0 0 0,00 0 0,00
Outro exemplo da visualização do uso de memória swap no Linux em um dia determinado é especificado através do parâmetro -f do comando sar:
mariano@piracaia:~$ sar -S -f /var/log/sysstat/sa25
Linux 3.13.0-32-generic (piracaia) 25-09-2014 _x86_64_ (8 CPU)
21:05:25 LINUX RESTART
21:15:01 kbswpfree kbswpused %swpused kbswpcad %swpcad
21:25:01 0 0 0,00 0 0,00
21:35:01 0 0 0,00 0 0,00
21:45:01 0 0 0,00 0 0,00
21:55:01 0 0 0,00 0 0,00
22:05:01 0 0 0,00 0 0,00
22:15:01 0 0 0,00 0 0,00
22:25:01 0 0 0,00 0 0,00
22:35:01 0 0 0,00 0 0,00
22:45:01 0 0 0,00 0 0,00
22:55:01 0 0 0,00 0 0,00
23:05:01 0 0 0,00 0 0,00
23:15:01 0 0 0,00 0 0,00
23:25:01 0 0 0,00 0 0,00
Average: 0 0 0,00 0 0,00
#3 Limpar memória swap do servidor
Você já deve ter notado depois que o servidor ou estação de trabalho iniciou o uso da memória swap, até mesmo após reiniciar o serviço ou matar o processo/aplicação que fazia um uso excessivo de memória, o uso de swap ainda continua e mesmo após minutos ou horas a memória virtual nunca é zerada.
Existe um workaround ou medida paliativa que irá forçar a retirada do conteúdo da memória swap (em disco) para a memória física (RAM) sem que seja necessário reiniciar o servidor. Os comando swapon e swapoff fazem esta tarefa.
Veja um exemplo onde o processo do apache2 está consumindo recursos excessivos de memória RAM e mesmo após pará-lo ainda o uso de swap continuava.
/etc/init.d/apache2 restart && swapoff -a && swapon -a
O uso do “&&” garante que os comandos só serão executados se o anterior for executado com sucesso. É importante verificar se a memória RAM possui espaço suficiente para abrigar o conteúdo da memória virtual. E lembre-se, este procedimento é apenas um solução de contorno, pois o ideal é que você analise o motivo do uso excessivo de memória e caso sua aplicação esteja funcionando normalmente, ou seja, não existe nada de errado ou bug, pense na compra de mais memória RAM ou aumento dos recursos de memória física da máquina virtual.