Otimizando o Uso da Memória Com Swappiness

7 de julho de 2009

Para poder entender o que é swappinesse e seu funcionamento, primeiro você deve saber o que é swap e qual a sua funcionalidade.

 
O que é swap?

Swap é uma área, espaço, de troca criada no disco(no Linux) para contribuir com a falta de memória.
Funciona da seguinte maneira:
Se você possui 256MB de memória e abre 3 aplicativos que somados ocupam mais de 300MB, isso normalmente iria travar o seu computador ou mesmo você não conseguiria trabalhar com os 3 aplicativos abertos. Tendo uma área de troca(swap) reservada no disco, a memória principal despeja parte do que não precisa ser executado para o disco, ou seja, para a swap, liberando memória e assim podendo processar mais aplicativos.

 
O que é swappiness?

Swappinnes é uma variável contida no código fonte do kernel(Linux), responsável por controlar a quantidade de memória principal(RAM) e swap que será utilizada.
Para essa variável é atribuído um valor fixo(60), que para máquinas com pouca memória, 256MB, 512MB, este valor pode ser confortável ou aceito. O problema está em máquinas mais novas que possuem 1GB de memória para cima, essas máquinas sofrerão uma perda de desempenho considerável.Para poder entender o que é swappinesse e seu funcionamento, primeiro você deve saber o que é swap e qual a sua funcionalidade.

O que é swap?

Swap é uma área, espaço, de troca criada no disco(no Linux) para contribuir com a falta de memória.
Funciona da seguinte maneira:
Se você possui 256MB de memória e abre 3 aplicativos que somados ocupam mais de 300MB, isso normalmente iria travar o seu computador ou mesmo você não conseguiria trabalhar com os 3 aplicativos abertos. Tendo uma área de troca(swap) reservada no disco, a memória principal despeja parte do que não precisa ser executado para o disco, ou seja, para a swap, liberando memória e assim podendo processar mais aplicativos.

O que é swappiness?

Swappinnes é uma variável contida no código fonte do kernel(Linux), responsável por controlar a quantidade de memória principal(RAM) e swap que será utilizada.
Para essa variável é atribuído um valor fixo(60), que para máquinas com pouca memória, 256MB, 512MB, este valor pode ser confortável ou aceito. O problema está em máquinas mais novas que possuem 1GB de memória para cima, essas máquinas sofrerão uma perda de desempenho considerável.

Segue um trecho do código fonte do kernel do Linux aonde encontra-se a swappiness:
Local: /usr/src/linux/mm/vmscan.c (Tendo em vista que “linux” é o link simbólico que aponta para a versão kernel).

/*
* From 0 .. 100.  Higher means more swappy.
*/
int vm_swappiness = 60; 

 
Informações sobre a configuração da swappiness

O valor dessa variável varia de 0 a 100, sendo o 0 = sem utilização de swap, apenas em situações muito críticas; 100 = a prioridade continua sendo a de utilizar a memória RAM, mas irá fazer swap em disco com mais constância, ou seja, mesmo que haja muita memória principal sobrando, o sistema, ainda assim, irá fazer swap.

Você pode seguir esta tabela abaixo para configurar o valor da sua swappiness de acordo com a quantidade de memória que possui.

Quantidade de MemóriaValor da swappiness
256MB60 (valor padrão)
512MB40
1GB20
Acima de 1GB0

 
Descobrindo o valor da swappiness

Para descobrir qual o valor atual da sua swappiness, utilize o comando cat /proc/sys/vm/swappiness ou sysctl vm.swappiness, como nos exemplos abaixo:

Saída com o comando cat:

cat /proc/sys/vm/swappiness
40 

Saída com o comando sysctl:

sysctl vm.swappiness
vm.swappiness = 40

 
Alterando o valor da sua swappiness

Existem algumas formas para se altear o valor da swappines, umas definitivas – por exemplo alterar o valor direto no código fonte do kernel e recompilá-lo – e outras não – por exemplo utilizando o comando echo valor > /pro/sys/vm/swappiness –.

Como o nosso objetivo é fazer uma alteração definitiva, vamos percorrer o caminho mais simples, ou seja, sem que precise recompilar o kernel.

Primeiro, verifiquei se você já possui a seguinte linha (vm.swappiness = n), sendo “n” o valor da variável, no arquivo /etc/sysctl.conf.

cat /etc/sysctl.conf | grep swappiness
vm.swappiness = 40 

Caso exista, edite o arquivo e altere o valor(caso não seja satisfatório) para um valor adequado. Logo em seguida execute o comando echo ou sysclt, para atualizar o sistema com o novo valor :

sysctl -w vm.swappiness=n

ou

echo n > /proc/sys/vm/swappiness

Segue um trecho do código fonte do kernel do Linux aonde encontra-se a swappiness:
Local: /usr/src/linux/mm/vmscan.c (Tendo em vista que “linux” é o link simbólico que aponta para a versão kernel).

/*
* From 0 .. 100.  Higher means more swappy.
*/
int vm_swappiness = 60; 

Informações sobre a configuração da swappiness

O valor dessa variável varia de 0 a 100, sendo o 0 = sem utilização de swap, apenas em situações muito críticas; 100 = a prioridade continua sendo a de utilizar a memória RAM, mas irá fazer swap em disco com mais constância, ou seja, mesmo que haja muita memória principal sobrando, o sistema, ainda assim, irá fazer swap.

Você pode seguir esta tabela abaixo para configurar o valor da sua swappiness de acordo com a quantidade de memória que possui.

Quantidade de MemóriaValor da swappiness
256MB60 (valor padrão)
512MB40
1GB20
Acima de 1GB0

Descobrindo o valor da swappiness

Para descobrir qual o valor atual da sua swappiness, utilize o comando cat /proc/sys/vm/swappiness ou sysctl vm.swappiness, como nos exemplos abaixo:

Saída com o comando cat:

cat /proc/sys/vm/swappiness
40 

Saída com o comando sysctl:

sysctl vm.swappiness
vm.swappiness = 40

Alterando o valor da sua swappiness

Existem algumas formas para se altear o valor da swappines, umas definitivas – por exemplo alterar o valor direto no código fonte do kernel e recompilá-lo – e outras não – por exemplo utilizando o comando echo valor > /pro/sys/vm/swappiness –.

Como o nosso objetivo é fazer uma alteração definitiva, vamos percorrer o caminho mais simples, ou seja, sem que precise recompilar o kernel.

Primeiro, verifiquei se você já possui a seguinte linha (vm.swappiness = n), sendo “n” o valor da variável, no arquivo /etc/sysctl.conf.

cat /etc/sysctl.conf | grep swappiness
vm.swappiness = 40 

Caso exista, edite o arquivo e altere o valor(caso não seja satisfatório) para um valor adequado. Logo em seguida execute o comando echo ou sysclt, para atualizar o sistema com o novo valor :

sysctl -w vm.swappiness=n

ou

echo n > /proc/sys/vm/swappiness