Descritores de Arquivos e Swappiness

O que são Descritores de Arquivos (File-Descriptors) e Swappiness. Veremos na prática como funcionam e em quais casos é necessário alterar os valores.

[ Hits: 134 ]

Por: Buckminster em 30/04/2025


Swappiness



Swappiness é o processo de troca responsável por controlar a quantidade de memória RAM e swap que será utilizada pelo sistema. É uma variável contida no código fonte do kernel.

O padrão do kernel é vm.swappiness=60. Este valor geralmente não é tão ruim para a maioria das cargas de trabalho, mas é difícil ter um padrão geral que se adapte a todos, pois a swappiness depende da quantidade de RAM física, depende do disco (se é HD ou SD), depende do uso do computador, etc.

A RAM é alocada em espaços chamados "páginas" que têm um tamanho fixo. Esse tamanho é determinado pelo kernel na inicialização que detecta a arquitetura do computador.

Normalmente o tamanho da página em um computador Linux é de 4 Kbytes.

getconf PAGESIZE

4096

Swappiness é também uma proporção de quão custoso é recuperar e restaurar memória anônima em comparação com a memória de arquivo para seu hardware e carga de trabalho . Quanto menor o valor mais você diz ao kernel que páginas anônimas acessadas com pouca frequência são caras para trocar para fora e para dentro em seu hardware. Quanto maior o valor mais você diz ao kernel que o custo de trocar páginas anônimas e páginas de arquivo é semelhante em seu hardware.

Memória de Arquivo é, de modo geral, o cache de dados e metadados responsáveis por armazenar o código de cada processo em execução no computador em uma área de troca reservada (swap) do armazenamento secundário, como uma unidade de disco rígido (HD) ou uma unidade de estado sólido (SD).

Memória Anônima, de modo geral, são as alocações de memória feitas dentro desse código de cada processo, por exemplo, quando uma nova memória é alocada ela não é apoiada por nada, ou seja, não está ligada a nenhum processo, por isso são chamadas de anônimas.

Existem outros tipos de memória — memória compartilhada, memória slab, memória de pilha do kernel, buffers e similares — mas a memória anônima e a memória de arquivo são as mais conhecidas e fáceis de entender e se aplicam igualmente a esses outros tipos também.

"Memória anônima", no contexto da RAM, refere-se a uma área de memória que o sistema operacional utiliza para fins de armazenamento temporário (no caso no HD ou SD), sem que seja associada a um arquivo ou processo específico. É utilizada quando é necessário alocar grandes blocos de memória geralmente para evitar a fragmentação do heap (área de memória principal).

Paginas anônimas não têm suporte ao sistema de arquivos e devem permanecer na memória enquanto forem necessárias para um programa, a menos que haja espaço de swap para armazená-las.

Temos ainda as variáveis anon_prio que é definida como o valor de swappiness do Linux e a variável file_prio que é definida como 200 menos o valor da anon_prio.

file_prio é a disposição do sistema em liberar páginas de arquivo e anon_prio é a disposição do sistema em liberar páginas anônimas.

Esses dois valores alimentam um algoritmo complexo que determina se o kernel Linux é executado com preferência para recuperar/liberar páginas de arquivo ou páginas anônimas.

O valor da swappiness depende do hardware, da carga de trabalho, do tipo de disco (HD ou SD) e se o seu computador é um desktop ou um servidor e, obviamente, esta não será uma configuração única para todos.

Exemplo: colocando a swappiness como 20 teremos que anon_prio será 20 e file_prio será 180 (200-20).

O valor da swappiness fica entre os limites 0-100. Colocando a swappiness como 100 teremos um equilíbrio com os dois valores como 100.

Por que 60, 100 e 200?

São valores convencionados pelos desenvolvedores de acordo com o bom senso.

A swappinnes (junto com os descritores) às vezes são supervalorizados como se fossem um truque mágico que fará o computador sair voando.

Da página oficial do Kernel Linux, versão estável no momento:


Arquivo vmscan.c do código fonte do Kernel Linux, a partir da linha 200 vemos o padrão do Kernel setado em 60:

/*
 * From 0 .. MAX_SWAPPINESS.  Higher means more swappy.
 */
int vm_swappiness = 60;
Arquivo vmscan.c do código fonte do Kernel Linux, a partir da linha 2469:

 	
/*
	 * Calculate the pressure balance between anon and file pages.
	 *
	 * The amount of pressure we put on each LRU is inversely
	 * proportional to the cost of reclaiming each list, as
	 * determined by the share of pages that are refaulting, times
	 * the relative IO cost of bringing back a swapped out
	 * anonymous page vs reloading a filesystem page (swappiness).
	 *
	 * Although we limit that influence to ensure no list gets
	 * left behind completely: at least a third of the pressure is
	 * applied, before swappiness.
	 *
	 * With swappiness at 100, anon and file have equal IO cost.
	 */
	total_cost = sc->anon_cost + sc->file_cost;
	anon_cost = total_cost + sc->anon_cost;
	file_cost = total_cost + sc->file_cost;
	total_cost = anon_cost + file_cost;

	ap = swappiness * (total_cost + 1);
	ap /= anon_cost + 1;

	fp = (MAX_SWAPPINESS - swappiness) * (total_cost + 1);
	fp /= file_cost + 1;
Tradução literal:
[i]"A quantidade de pressão que aplicamos em cada LRU é inversamente proporcional ao custo de recuperação de cada lista, conforme determinado pela proporção de páginas que estão sendo redefinidas, vezes o custo relativo de E/S para trazer de volta uma página anônima trocada versus recarregar uma página do sistema de arquivos (troca).

Embora limitemos essa influência para garantir que nenhuma lista seja completamente deixada para trás: pelo menos um terço da pressão é aplicada, antes da troca.

Com a swappiness em 100, anon e file têm o mesmo custo de E/S."[/i]

Resumindo: quanto menor o valor da swappiness menos a swap será utilizada não importando a quantidade total da swap; quanto maior o valor da swappiness mais ela será utilizada não importando a quantidade total da swap.

Definir vm.swappiness como zero impedirá que o Kernel remova páginas anônimas em favor de páginas do cache de arquivos e mais restrito será o uso da swap.

Swap com HD ou com SD faz diferença também no desempenho, pois um HD é um gargalo num computador e quanto mais precisa acessar a swap no HD mais perderá em desempenho.

Em computadores com SDs, com bastante memória RAM física e swap generosa pode-se colocar a swappiness como 100 que será um bom valor.

O valor padrão em 60 ajusta-se aos HDs e SDs.

Para entender mais um pouco: usuários de laptop/desktop que usam muito a hibernação/suspensão, o arquivo de swap deve ter pelo menos o tamanho da sua RAM física e a swappiness colocada em 100 é uma boa prática.

Outro exemplo: em um cluster com máquinas antigas com HD e apesar de ser sem interface gráfica nos Nós, coloca-se a swap com 10 (dez) GB no particionamento e a vm.swappiness como 20, pois cada Nó teria, por exemplo, 4GB de RAM física, além disso, a carga de trabalho utilizada na máquina também influencia.

  • Valor próximo de 0: Evita ao máximo usar swap.
  • Valor de 100: Usa swap com frequência para liberar RAM.
  • Valor padrão: 60

Verificando a RAM:

free -m


total usada livre compart. buff/cache disponível
Mem.: 7437 2019 4097 67 1640 5418
Swap: 14304 0 14304


Nessa máquina tem 4097 MB livres de um total de ~8GB.

Deve-se levar em conta a quantidade de memória RAM e o número de processos (programas, arquivos, etc) que você usará cotidianamente.

Quanto mais RAM livre menos swappiness você precisa, porém, deve-se levar em conta o tamanho da swap (partição de troca).

Desde uns 5 anos para cá eu coloco em todo e qualquer particionamento Linux, no mínimo, 5GB de Swap não importando a quantidade de RAM física.

Como já foi dito, o valor da swappiness é bastante específico para cada máquina, porém, caso seu computador seja um desktop/laptop de uso pessoal regular, deixe no padrão.

Para saber um pouco mais sobre a necessidade de Swap leia este artigo:


Deixo uma tradução livre do resumo:

  1. Ter swap é uma parte razoavelmente importante de um sistema que funciona bem. Sem swap torna-se mais difícil alcançar um gerenciamento de memória sensato.
  2. A swap geralmente não visa obter memória de emergência, mas sim tornar a recuperação de memória igualitária e eficiente. Na verdade, usá-la como "memória de emergência" geralmente é prejudicial.
  3. Desabilitar a swap não impede que a E/S de disco se torne um problema em caso de contenção de memória. Em vez disso simplesmente transfere a sobrecarga de E/S de disco de páginas anônimas para páginas de arquivo. Isso não só pode ser menos eficiente já que temos um conjunto menor de páginas para selecionar para recuperação, como também pode contribuir para esse estado de alta contenção.
  4. O swapper em kernels anteriores à versão 4.0 apresenta muitas armadilhas e contribuiu para a percepção negativa de muitas pessoas sobre a swap devido à sua ânsia excessiva em trocar páginas. Em kernels posteriores à versão 4.0 a situação é significativamente melhor.
  5. Em SSDs a troca de páginas anônimas e a recuperação de páginas de arquivo são essencialmente equivalentes em termos de desempenho e latência. Em discos giratórios mais antigos, as leituras de troca são mais lentas devido a leituras aleatórias, portanto, uma configuração vm.swappiness mais baixa faz sentido (continue lendo para saber mais sobre vm.swappiness).
  6. Desabilitar a swap não previne comportamentos patológicos em situações próximas ao fim da vida útil (OOM), embora seja verdade que tê-la pode prolongá-la. Independentemente de o eliminador global de OOM ser invocado com ou sem swap, ou ter sido invocado mais cedo ou mais tarde, o resultado é o mesmo: você fica com um sistema em um estado imprevisível. A ausência de swap não evita isso.
  7. Você pode obter melhor comportamento de swap sob pressão de memória e evitar thrashing utilizando memory.low no cgroup v2.

Se você procurar descrições sobre a finalidade da swap no Linux inevitavelmente encontrará muitas pessoas falando sobre ela como se fosse apenas uma extensão da RAM física para uso em emergências. Por exemplo, aqui está uma postagem aleatória que recebi como um dos principais resultados ao pesquisar "o que é swap" no Google:

'Swap é essencialmente memória de emergência; um espaço reservado para momentos em que o sistema precisa temporariamente de mais memória do que a disponível na RAM. É considerado "ruim" no sentido de que é lenta e ineficiente e se o seu sistema precisa usar swap constantemente, obviamente não tem memória suficiente. […] Se você tem RAM suficiente para atender a todas as suas necessidades e não espera esgotá-la, então você deve estar perfeitamente seguro sem swap.'

Para deixar claro, não culpo quem postou este comentário pelo conteúdo da postagem – isso é aceito como "conhecimento comum" por muitos administradores de sistemas Linux e é uma das coisas mais prováveis que você ouvirá de alguém se pedir para falar sobre swap. Infelizmente, porém, isso também é um mal-entendido sobre o propósito e o uso do swap, especialmente em sistemas modernos.

A swap é principalmente um mecanismo para igualdade de recuperação, não para "memória extra" emergencial.

A swap não é o que torna seu aplicativo lento – entrar em disputa geral de memória é o que torna seu aplicativo lento.

A realidade é que a maioria das pessoas não tem uma noção clara do que seu hardware exige, então não é trivial ajustar o valor da swappiness apenas por instinto – isso é algo que você precisa testar usando valores diferentes. Você também pode dedicar um tempo avaliando a composição da memória do seu sistema e dos principais aplicativos e seu comportamento sob recuperação moderada de memória."

Alterando:

sudo vim /etc/sysctl.conf

Acrescentar no final:

vm.swappiness=XX # No lugar de XX você coloca o valor mais adequado para você (20, 50, 100, etc)

Salve e saia.

Carregando as configurações:

sudo sysctl -p

Reinicie o computador.

Para ver a alteração da swappiness, execute:

sudo sysctl vm.swappiness

Referências




Página anterior    

Páginas do artigo
   1. Descritores de Arquivos (File-Descriptors)
   2. Descritores de Arquivos
   3. Swappiness
Outros artigos deste autor

Compilação do Squid 3 no Debian Wheezy

DHCP com controle de IP e compartilhamento no Debian Squeeze

Redes de Computadores · IPtables · Endereços IPs - Explicações básicas

Como agendar um backup automático do PostgreSQL no Cron evitando o problema de senha

Montagem de Cluster

Leitura recomendada

Wireless USB no Linux

EasyBCD - Corrigindo boot do Ubuntu 12.04 em HD USB no Sony VAIO

Clusters de alta disponibilidade (HA - High Availability)

DNS no Slackware

Potencializando o elementary OS

  
Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts