Por que a maioria das pessoas recomenda reduzir o swappiness para 10-20?

65

Eu já vi em vários sites que recomendam reduzir o swappiness para 10-20 para melhorar o desempenho.

É um mito ou não? Esta é uma regra geral? Eu tenho um laptop com 4 GB de RAM e 128 GB de disco rígido, qual o valor que você recomenda para minha troca?

Obrigado.

Saeed Zarinfam
fonte
5
Os sites listados não explicam por que eles recomendam alterar o padrão. As respostas aqui são muito melhores para esta escolha complicada sobre um assunto complicado.
Nelmcb

Respostas:

88

Porque a maioria acredita que trocar = ruim e que, se você não reduzir a troca, o sistema será trocado quando realmente não for necessário. Nenhuma delas é realmente verdadeira. As pessoas associam a troca a momentos em que seu sistema está atolado - no entanto, é principalmente a troca porque o sistema está atolado, e não o contrário. Quando o sistema é trocado, ele já considerou o custo de desempenho em sua decisão de trocar e decidiu que não fazer isso teria uma penalidade geral maior no desempenho ou na estabilidade do sistema.

No geral, as configurações padrão resultam em bom desempenho e estabilidade geral. Eu recomendo deixá-lo no padrão. Existem outras formas de o Linux melhorar seu gerenciamento de memória para resolver alguns casos extremos, mas, em geral, o controle de swappiness não é uma boa solução alternativa - ajuste-o em uma direção e você poderá corrigir um problema e criar outros problemas. Se possível, basta instalar mais RAM física (e deixar a swappiness em paz) ofusca todos os outros remédios.

Como o Linux usa RAM

Qualquer RAM que não esteja sendo usada por aplicativos pode ser usada como "cache". O cache é importante para um sistema rápido e suave, acelerando as leituras e gravações no disco.

Se seus aplicativos aumentarem o uso de memória a ponto de usar quase toda a sua RAM, seu cache diminuirá e, em média, as operações do disco ficarão mais lentas. Não é suficiente ter apenas dezenas de megabytes, ou menos, para cache hoje em dia.

Se os aplicativos aumentarem ainda mais o uso de memória - supondo que você não tenha espaço de troca -, você não terá apenas espaço para cache, mas eventualmente ficará sem memória e seu sistema precisará interromper os processos em execução. O processo de matar é pior do que desacelerar, pois oferece um sistema instável e imprevisível.

Como o Linux usa swap

Para combater esses dois problemas, seu sistema pode realocar alguma memória de aplicativo raramente usada para o espaço de troca em seu disco, liberando RAM. A RAM adicional pode impedir a morte dos processos devido à falta de memória e recuperar um pouco de cache para que as operações do disco possam operar de maneira mais suave.

Essa realocação não é feita de acordo com um limite definido. Você não atinge uma certa porcentagem de alocação após a qual o Linux começa a trocar. Possui um algoritmo "difuso". Isso leva em consideração muitas coisas, que podem ser melhor descritas por "quanta pressão existe para a alocação de memória". Se houver muita "pressão" para alocar nova memória, aumentará as chances de que algumas sejam trocadas para criar mais espaço. Se houver menos "pressão", isso diminuirá essas chances.

Seu sistema possui uma configuração de "troca" que ajuda a ajustar como essa "pressão" é calculada. Muitas vezes, é falsamente representado como uma "porcentagem de RAM", mas não é, é apenas um valor usado como parte da fórmula. Valores em torno de 40 a 60 são os valores recomendados, 60 sendo o padrão hoje em dia.

Deixar o sistema trocar quando necessário é, no geral, uma coisa muito boa, mesmo se você tiver muita RAM. Permitir que o seu sistema troque, se necessário, garante a você que, se você se deparar com uma situação de pouca memória, mesmo que temporariamente (enquanto executa um processo curto que usa muita memória), seu sistema tem uma segunda chance de manter tudo funcionando. Se você chegar ao ponto de desabilitar completamente a troca, corre o risco de que os processos sejam mortos devido à impossibilidade de alocar memória.

O que está acontecendo quando o sistema está atolado e trocando fortemente?

A troca é uma operação lenta e dispendiosa; portanto, o sistema a evita, a menos que calcule que o trade-off no desempenho do cache o compensará em geral, ou se for necessário evitar processos de morte.

Muitas vezes, as pessoas olham para o seu sistema que está debulhando muito o disco e usando muito espaço de troca e culpa por isso. Essa é a abordagem errada a seguir. Se a troca chegar a esse extremo, isso significa que a troca é a tentativa do seu sistema de lidar com problemas de pouca memória, não a causa do problema, e que, sem a troca, o processo em execução irá morrer aleatoriamente.

E os sistemas de desktop? Eles não exigem uma abordagem diferente?

Os usuários de um sistema de desktop realmente esperam que o sistema "se sinta responsivo" em resposta a ações iniciadas pelo usuário, como abrir um aplicativo, que é o tipo de ação que às vezes pode desencadear uma troca devido ao aumento da memória necessária.

Uma maneira de algumas pessoas tentarem ajustar isso é reduzir o parâmetro de troca, que pode aumentar a tolerância do sistema a aplicativos que usam memória e ficam com pouco espaço em cache.

No entanto, isso está apenas mudando as metas. O primeiro aplicativo agora pode carregar sem uma operação de troca, mas deixará menos folga para o próximo aplicativo que carregar. A mesma troca pode ocorrer apenas mais tarde, quando você abrir um aplicativo em seguida. Enquanto isso, o desempenho do sistema é menor em geral devido ao tamanho reduzido do cache. Portanto, qualquer benefício da configuração de troca reduzida pode ser difícil de medir, reduzindo o atraso da troca em alguns momentos, mas causando outro desempenho lento em outros momentos. Reduzir um pouco a swappiness pode ser justificado se você souber o que está fazendo, mas reduzi-la para 10% pode deixar o sistema tolerante a tamanhos de cache muito baixos e deixar o sistema mais suscetível de trocar a curto prazo.

Desabilitar completamente a troca deve ser evitado, pois você perde a proteção adicional contra condições de falta de memória que podem causar falhas ou interrupção dos processos.

O remédio mais eficaz de longe é instalar mais RAM, se você puder pagar.

A troca pode ser desativada em um sistema com muita memória RAM?

Se você tem muito mais RAM do que provavelmente precisará para aplicativos, raramente precisará trocar. Desabilitar a troca provavelmente não fará diferença na maioria das vezes. Mas se você tiver bastante RAM, deixar a troca ativada também não terá nenhuma penalidade, porque o sistema não troca quando não é necessário.

As únicas situações em que iria fazer a diferença estaria na situação improvável que o sistema encontra-se a falta de memória e, consequentemente, o sistema de cache está sendo prejudicada, e é neste tipo de situação onde você iria querer trocar mais. Assim, você pode deixar o swap com segurança em suas configurações normais para ter mais tranqüilidade, sem que isso tenha um efeito negativo quando houver muita memória.

Mas como a troca pode acelerar meu sistema? Não trocar as coisas devagar?

O ato de transferir dados da RAM para a troca é uma operação lenta, mas só é usada quando o kernel tem certeza de que o benefício geral como resultado de manter um tamanho de cache razoável superará isso.

Depois que os dados são trocados, quando são lançados novamente?

Qualquer parte da memória voltará a ser trocada assim que for usada - lida ou gravada. No entanto, normalmente a memória trocada é aquela que não é acessada há muito tempo e não é necessária em breve.

Transferir dados do swap é tão demorado quanto colocá-los lá. Seu kernel não removerá dados dele se não for necessário. Enquanto os dados estão em troca e não estão sendo usados, eles deixam mais memória para outras coisas que estão sendo usadas e mais cache do sistema.

Existem casos em que a redução da troca é apropriada?

Sim. Se você estiver executando um servidor dedicado a um aplicativo de servidor específico que não se beneficie do cache do sistema. Alguns servidores de banco de dados, como o servidor Oracle, MySQL / MariaDB recomendam, em alguns casos, reduzir a troca para 1 a 10, pois esses mecanismos de banco de dados usam seu próprio cache.

Observe que isso só é verdade se o seu sistema for dedicado a essa tarefa e, no caso do MySQL / MariaDB, apenas se você estiver usando puramente InnoDB ou XtraDB, e não MyISAM ou Aria, etc.

thomasrutter
fonte
Obrigado por sua descrição completa. Eu acho que no meu caso (4 GB de RAM e 128 GB de disco rígido SSD) e com o meu uso (desenvolvimento Java EE e vários sistemas operacionais na caixa vitual) swappiness = 20 é adequado. O que você acha?
Saeed Zarinfam
Eu acho que o padrão de 60 seria melhor, na minha opinião.
thomasrutter
4
@BlancaHiggins você leu a postagem em que comentou? Seu comentário parece não descrever o que a troca realmente faz.
thomasrutter
11
Esta é uma excelente resposta. Muito obrigado por uma ótima explicação.
Dan Barron
2
Parte da informação contida no SwapFaq é enganosa na minha opinião: defini-lo para 100 será "agressivamente" trocado. Eu acho que é mais preciso dizer que é uma configuração pró-ativa muito cautelosa, trocando ao primeiro sinal de que a memória ou o cache disponível está ficando um pouco mais baixo. Enquanto configurações baixas como 10 são mais arriscadas e emocionantes, evitando fazer trocas até que a memória disponível esteja muito baixa e o cache tenha desaparecido completamente, deixando o sistema sem muito espaço de manobra.
thomasrutter
14

Em uma área de trabalho comum, você tem de 4 a 5 tarefas ativas que consomem de 50 a 60% da memória. Se você definir a troca para 60, cerca de 1 / 4-1 / 3 das páginas de tarefas ATIVAS serão trocadas. Isso significa que, para cada alteração de tarefa, para cada nova guia que você abriu, para cada execução de JS, haverá um processo de troca.

A solução é definir o swappiness para 10. Por meio de observações práticas, isso faz com que o sistema renuncie ao cache do disco io (que desempenha pouco ou nenhum papel na área de trabalho, pois o cache de leitura / gravação praticamente não é usado. A menos que você esteja constantemente copiando LARGE arquivos) em vez de colocar qualquer coisa em troca. Na prática, isso significa que o sistema se recusará a trocar de página, cortando o cache io, a menos que atinja 90% da memória usada. E isso, por sua vez, significa uma experiência de desktop rápida, suave e sem interrupções.

No servidor de arquivos, no entanto, eu definiria a troca para 60 ou mais, porque o servidor não possui grandes tarefas ativas em primeiro plano que devem ser mantidas na memória como um todo, mas vários processos menores que estão funcionando ou em suspensão, e realmente não mudando de estado imediatamente. Em vez disso, o servidor geralmente serve (perdoa) exatamente os mesmos dados para os clientes, tornando os caches do disco io muito mais valiosos. Portanto, no servidor, é muito melhor trocar os processos de suspensão, liberando espaço na memória para solicitações de cache de disco.

Nos desktops, no entanto, essa configuração exata leva à troca de blocos de memória de aplicativos REAL, que quase sempre modificam ou acessam esses dados.

Curiosamente, os navegadores costumam reservar grandes pedaços de memória, que eles constantemente modificam. Quando esses pedaços são trocados, leva algum tempo se forem solicitados de volta - e, ao mesmo tempo, o navegador sai atualizando seus caches. O que causa enormes latências. Na prática, você ficará 2 minutos esperando a única página da web em uma nova guia para carregar.

A área de trabalho não se importa muito com o disco io, porque a área de trabalho raramente lê e grava em cache, repetindo grandes porções de dados. Cortar no disco io para impedir a troca o máximo possível é muito mais favorável para a área de trabalho, do que ter 30% de memória reservada para cache de disco com 30% de RAM (cheia de blocos pertencentes a aplicativos usados ​​ativamente) trocados.

Basta iniciar o htop, abrir um navegador, GIMP, LibreOffice - carregar alguns documentos lá e depois navegar por várias horas. É realmente assim tão fácil.

Cara Linux
fonte
3
+1 para descrição de diferenças entre servidor e área de trabalho. O cache do disco do servidor pode ser feito em um campo do disco.
Dee
Se for esse o caso, por que as versões de servidor e de desktop do Ubuntu são padronizadas para uma troca de 60? Se o que você afirma é verdadeiro, faria mais sentido que a versão para desktop fosse fornecida com um padrão de 20 ou até 10, mas não é.
JAB
11
Referência para a implicação de que swappiness é uma porcentagem direta de ram que é trocada? Eu não acho que funciona assim.
Xen2050 23/03
11
Não faz. A troca não está relacionada a uma porcentagem de RAM. É um botão que ajusta um algoritmo nebuloso para ter mais ou menos probabilidade de trocar em uma determinada situação de problema. Também acho que a descrição das cargas de trabalho servidor versus área de trabalho nesta resposta faz várias suposições que nem sempre são válidas.
thomasrutter
9

Se você executa um servidor Java em seu sistema Linux, deve considerar reduzir bastante a troca do valor padrão de 60. Portanto, 20 é realmente um bom começo. A troca é um fator determinante para um processo de coleta de lixo, pois cada vez que as coleções precisam tocar grandes partes da memória do processo. O sistema operacional não tem os meios para detectar esses processos e fazer as coisas certas para eles. É uma prática recomendada evitar trocar o máximo possível por servidores de aplicativos produtivos.

Andreas
fonte
É verdade que se você dedicar um servidor a uma carga de trabalho especializada que você sabe que não se beneficiará do cache do sistema (como um servidor de banco de dados), reduzir a troca pode fazer sentido. Eu não acho que a coleta de lixo seja um caso suficientemente especializado. Se a memória for tocada com frequência, ela não será trocada, ela será mantida na RAM física. A única vez que esse não é o caso é se você tiver uma situação grave de pouca memória - e a troca não é responsável.
thomasrutter
4

Sugiro que você faça algumas experiências enquanto mantém o monitor do sistema aberto para ver exatamente a carga da sua máquina. Também estou executando com 4 GB de memória e um SSD de 128 GB, alterando o valor de swappiness para 10, o que não apenas melhorou o desempenho enquanto estava carregado, mas também como um bônus também aumentará a vida útil da unidade SSD, pois sofrerá menos gravações.

Para um tutorial em vídeo simples sobre como fazer isso com uma explicação completa, consulte o vídeo do YouTube abaixo

http://youtu.be/i6WihsFKJ7Q

Tech-Compass
fonte
11
Ótimo vídeo que você fez, mas o vídeo realmente não responde diretamente à pergunta, é mais um tutorial sobre como mudar a swappiness.
jmunsch
+1 para dica de vida útil do SSD, pois o SSD é melhor se o sistema for o máximo possível somente leitura, o descanso deve permanecer na memória e hoje, a memória geralmente não é um grande problema nos PCs desktop atuais.
Dee
3

Quero acrescentar algumas perspectivas de um engenheiro de Big Data Performance para fornecer a outros mais informações sobre a tecnologia de 2017.

Minha experiência pessoal é que, embora normalmente desabilitei a troca para garantir que meus sistemas estejam funcionando na velocidade máxima, na estação de trabalho para um problema específico, descobri que a troca de 1 e 10 leva ao congelamento (para sempre) e pausas longas. A troca de 80 para esse aplicativo específico leva a um desempenho muito melhor e a pausas mais curtas que o padrão (60). Note que eu tinha 8 GB de RAM e 4x 256 GB de swap, suportados por 1 HDD. Normalmente, eu declararia estatísticas precisas vistas em meus benchmarks e nas especificações completas de hardware, mas ainda não o fiz e é um desktop recente de baixo custo que não é importante aqui.

De volta à minha antiga empresa, a razão pela qual não habilitamos a troca nos servidores Spark com nós de [500 GB a 4 TB] x [10-100] é que vimos um desempenho ruim como um sinal para redesenhar o pipeline de dados e as estruturas de dados de maneira mais eficiente. maneira. Também não queríamos comparar os HDDs / SSDs. Além disso, a troca dessa quantidade de RAM precisaria de 10 a 30 discos por nó com gravações paralelas para minimizar o tempo de acesso ao disco.

Hoje, há 20 anos e 20 anos no futuro, ainda resta o caso de alguns problemas serem grandes demais para a RAM. Com tempo e dinheiro infinitos, podemos comprar / arrendar mais hardware ou reprojetar qualquer processo para obter o desempenho em um nível desejável. Trocar é apenas um truque para nos permitir ignorar o problema real (não temos memória RAM suficiente e não queremos gastar mais dinheiro).

Para aqueles que pensam que uma maior troca é um mau conselho, aqui está uma pequena perspectiva. No passado, os HDs tinham apenas alguns kb de cache, se houver. A interface era IDE / Parallel ATA. O barramento da CPU também foi muito mais lento, juntamente com a RAM e muitas outras coisas. Em suma, os sistemas eram muito lentos (em relação a hoje) em todos os sentidos. Há alguns anos, os HDDs usavam SATA3. Hoje, eles usam o protocolo NVMe, que possui melhorias significativas na latência. HDs têm muitos MB de cache. E a parte mais interessante é quando você usa um SSD moderno (resistência e leitura / gravação muito mais estável) com NVMe ou PCIe como armazenamento de troca. É o melhor compromisso entre custo e desempenho. Por favor, não tente isso com SSDs baratos ou antigos.

Troque + SSDs! Com armazenamento volátil de alto desempenho, recomendo experimentar com um alto valor de troca. Depende principalmente dos padrões de acesso à memória (acessando aleatoriamente toda a memória versus raramente acessando a maioria), uso da memória, se a largura de banda do disco já estiver saturada e o custo real da troca.

ldmtwo
fonte
1

Pode ser que grande parte do comportamento de troca percebido na inicialização ou na abertura de programas seja o Linux lendo arquivos de configuração etc. do disco. Portanto, talvez seja melhor procurar usando o programa de monitoramento do sistema antes de assumir que o acesso ao disco rígido é devido à troca.

user1740850
fonte