Desempenho do Linux: Porque deve quase sempre adicionar espaço de troca

Sabemos que usar espaço de troca do Linux em vez de RAM (memória) pode abrandar severamente o desempenho. Então, pode-se perguntar, já que eu tenho memória mais do que suficiente disponível, não seria melhor apagar o espaço de troca? A resposta curta é: Não. Há benefícios de desempenho quando o espaço swap é habilitado, mesmo quando você tem mais do que suficiente ram. Atualização, veja também a Parte 2: Desempenho do Linux: Quase sempre Add Swap (ZRAM).

Even com memória de servidor mais do que adequada instalada, você verá que o espaço de swap será usado após longos períodos de tempo de atividade. Veja o exemplo abaixo de um servidor de chat ao vivo com cerca de um mês de uptime:

 total used free shared buff/cache availableMem: 3.7G 1.0G 445M 84M 2.2G 2.2GSwap: 1.8G 308M 1.5G

A saída de free -h aqui mostra 308M de espaço swap utilizado. Quando eu executei checagens para troca, não havia sinais de atividade de E/S em andamento ou inoportuna. Além disso, o serviço de kswap não consumia muito tempo de CPU. Na verdade, o processo de kswap não estava em nenhum lugar no topo (processos superiores ordenados pelo tempo da CPU). Para confirmar, eu usei o seguinte comando:

ps -A | grep kswap 40 ? 00:00:29 kswapd0

…então, neste caso, como em muitos, o uso de swap não está prejudicando a performance do servidor Linux. Agora, vamos ver como o espaço de swap pode realmente ajudar a performance do servidor Linux.

Update: Recentemente, instalei o Manjoro i3 no meu Pinebook Pro. Ele agora vem com a ZRAM habilitada por padrão.

Vantagens do espaço swap em sistemas com RAM adequada

atop 512GB server - 2GB swap usado

atop 512GB server - 2GB swap usado

É normal e pode ser uma coisa boa para sistemas Linux usarem algum swap, mesmo que ainda haja RAM disponível. O Kernel Linux moverá páginas de memória que quase nunca são usadas para o espaço swap para garantir que ainda mais espaço em cache seja disponibilizado na memória para páginas de memória usadas com mais frequência (uma página é um pedaço de memória). O uso de swap torna-se um problema de desempenho quando o Kernel é pressionado a mover continuamente páginas de memória para dentro e para fora da memória e espaço swap.

Outra vantagem é que swap dá aos administradores tempo para reagir a problemas de pouca memória. Nós frequentemente notamos o servidor agindo lentamente e, após o login, notamos uma troca pesada. Sem swap (como descrito na próxima seção), ficar sem memória pode criar reações em cadeia muito mais bruscas e severas. Portanto, normalmente, eu aconselharia configurar o espaço de swap para o tamanho do seu maior processo. Por exemplo, a memória configurada do MySQL no my.cnf. Ela pode até ser menor, especialmente se você tiver monitoramento e/ou alerta no lugar.

Alguns recomendam que não haja swap ou tamanho de swap ligeiramente maior que a RAM total. Se você puder inventar razões válidas para isso, então talvez a escolha seja sua. No entanto, este dificilmente é o caso em servidores, e você deve ao invés disso equilibrar sua decisão com os efeitos que a swap terá em suas aplicações específicas. Swap não altera a quantidade de RAM necessária para um servidor ou desktop saudável, por isso. É projetado para ser complementar à performance de sistemas saudáveis.

Para resumir:
– Mesmo que ainda haja memória RAM disponível, o Kernel Linux moverá páginas de memória que raramente são usadas para o espaço de swap.
– É melhor trocar páginas de memória que estiveram inativas por um tempo, mantendo os dados frequentemente usados em cache, e isso deve acontecer quando o servidor estiver mais ocioso, que é o objetivo do Kernel.
– Evite configurar seu espaço de swap muito grande se isso resultar em prolongar problemas de desempenho, interrupções, ou seu tempo de resposta (sem monitoramento/alertas adequados).

Swap Space vs. No Swap quando a memória disponível estiver baixa

Unlike the case above, if you don’t have enough memory, swap will be used quite often and noticeably more during any memory requirement spikes. Se você não tiver memória suficiente e nenhum espaço de swap, isto frequentemente causará falha na alocação de memória para pedidos que necessitam de mais páginas de memória. Como último recurso, o Kernel irá implantar o OOM killer para atacar processos de alta memória (normalmente MySQL, java, etc.).

Para uma visão mais detalhada do espaço de swap do Linux, leia os capítulos Gerenciamento de Swap e Recuperação de Frames de Página dos documentos do Kernel.org. Também, veja a última seção, “Kernel cache pressure and swappiness”, do meu outro post no blog para dicas sobre como ajustar o uso do espaço de swap do Linux pelo Kernel. Se o seu espaço swap “usado” é sempre ‘0’ então você de fato tem uma tonelada de RAM disponível livremente, nesse caso pode ser seguro remover o espaço swap… ou você pode ajustar a pressão da cache do seu Kernel para fazer uso de ainda mais RAM.

Para resumir:
– Escala de E/S swap muito pobre. Se as páginas de memória não podem ser trocadas apenas quando o servidor está ocioso, você deve sintonizar ou desativar a troca. Isto normalmente não é o caso, portanto o título “quase sempre” deste post.
– Com a swap desativada, problemas de performance se tornam perceptíveis muito rápido, e o OOM killer pode te pegar! 🙂

Para comparação, aqui está a saída do free usando uma versão mais antiga do procps-ng-3.3.1 no mesmo servidor:

 total used free shared buffers cachedMem: 3.7G 3.3G 445M 0B 4.2M 1.7G-/+ buffers/cache: 1.6G 2.1GSwap: 1.8G 308M 1.5G

Kernel cache pressure and swappiness

Now that you have swap enabled. Considere ajustar a pressão da cache do seu servidor e a tendência para swap (vm.swappiness) seguindo o guia abaixo, que é do artigo anterior: O servidor Linux precisa de uma actualização da RAM ? Verifique com top, free, vmstat, e sar:

vfs_cache_pressure – Controla a tendência do kernel para recuperar a memória, que é usada para o cache de objectos de directórios e inode. (padrão = 100, valor recomendado 50 a 200)

swappiness – Este controle é usado para definir o quão agressivo o kernel irá trocar páginas de memória. Valores mais altos aumentarão a agressividade; valores mais baixos diminuirão a quantidade de swap. (padrão = 60, valores recomendados entre 1 e 60) Remova sua swap para 0 valor, mas normalmente não é recomendado na maioria dos casos.

Para editar, você pode adicionar ou substituir estas linhas no arquivo /etc/sysctl.conf. Por exemplo, se você tem pouca memória até atualizar, você pode tentar algo como:

vm.swappiness=10vm.vfs_cache_pressure=200

Isso aumentará a pressão do cache, o que pode parecer um pouco contraproducente, uma vez que o cache é bom para a performance. No entanto, trocas demasiado frequentes reduzem significativamente mais a performance geral do seu servidor. Portanto, não manter tanto cache na memória ajudará a reduzir a atividade de swap. Além disso, com a vm.swappiness definida para 10 ou tão baixa quanto 1, irá reduzir a troca de disco.

Num servidor saudável com muita memória disponível, use o seguinte:

vm.swappiness=10vm.vfs_cache_pressure=50

Isto irá diminuir a pressão de cache. Como o cache é bom para a performance, nós queremos manter os dados em cache na memória por mais tempo. Since the cache will grow larger, we still want to reduce swapping to not cause increased swap I/O.

To check current values using these commands use:

sudo cat /proc/sys/vm/swappinesssudo cat /proc/sys/vm/vfs_cache_pressure

To enable these settings temporarily without rebooting, use the following commands:

sudo sysctl -w vm.swappiness=10sudo sysctl -w vm.vfs_cache_pressure=50