É uma má idéia criar um script cron que esvazie a troca a cada hora?

26

Por anos, tenho tido o mesmo problema com minhas pequenas configurações do Ubuntu: o espaço de troca usado aumenta com o tempo. Tenho a impressão de que isso ocorre principalmente porque a memória alocada nunca retorna à RAM, embora exista espaço suficiente para ela, exceto no caso de uma ação do usuário, como desativar a troca.

Fiz um pequeno croncomando para automatizar isso e tenho bons resultados:

#! /bin/sh

echo "* */1 * * * root swapoff -a && swapon -a" >> /etc/crontab

Mas como é mais um truque do que uma solução real para esse problema, estou me perguntando sobre os possíveis motivos pelos quais isso pode ser uma má idéia, ou como eu poderia melhorar esse script para torná-lo um pouco mais inteligente?

Yvan Sraka
fonte
29
Perdoe minha ignorância, mas o que exatamente você quer dizer com o espaço SWAP que cresce com o tempo e o esvaziamento na RAM da memória alocada ? Normalmente, você aloca algum espaço como swap para o sistema e nunca mais recebe notícias dele. Quem se importa com quanto do swap é realmente realizado? Qual é o problema?
sobremesa
5
Por que você quer fazer isso? Por que você acha que algum uso de swap é uma coisa ruim? Quanto de uso de troca estamos falando?
Marcelm #
25
Estou meio confuso. Você continua falando sobre um "problema", mas na verdade não descreve nenhum efeito negativo de qualquer tipo. Por que você considera isso um problema?
18717 David Schwartz
17
Se algo entra em troca e fica lá, é porque nada está usando. E se nada for usá-lo, é melhor deixar RAM ser usado para algo que é acessada, como cache, que a troca de parte de trás dados.
hobbs
12
Como isso é melhor do que apenas deixar o swap fora?
user253751

Respostas:

51

Usando assim: sim, ruim. Você realmente precisa verificar se há memória suficiente disponível antes de desativar a troca. Veja /ubuntu//a/90399/15811 para obter uma versão melhor.

Além disso: você tem certeza disso? Swap sendo alocado não significa swap sendo usado. O comando vmstat, colunas si(troca) e so(troca). Se esses permanecerem 0, você tem outro problema. Na minha experiência, a troca é pouco usada, e você pode não estar usando-o pensando que não o esvazia, mas não há nada a esvaziar.

Rinzwind
fonte
3
Espere o que? Se não houver memória suficiente para que o swapoff seja bem-sucedido, o swapoff será morto pelo assassino do OOM. Sim, eles realmente codificaram isso (ele verifica por chamada do sistema).
Joshua
@ Josué com certeza, mas ele quer que ele funcione automatizado. Não há erro.
Rinzwind #
4
Para elaborar sem escrever minha própria resposta, trocar o uso que cresce ao longo do tempo não é uma coisa ruim . O que isso significa é que o kernel está descobrindo lentamente que lixo que consome memória nunca está sendo usado e movendo-o para troca, para que a memória possa ser usada por coisas que realmente o ajudam (como poder manter mais dados fs em cache para ele não precisa continuar descartando-o e relendo-o a partir do disco).
R ..
O cron do @Rinzwind funciona bem com trabalhos com erro e o script vinculado também não é usado vmstat.
jpaugh
41

Eu diria que é uma má ideia. Se você acha que possui memória livre e um processo ativo não está sendo movido da troca para a RAM, então você não tem tanta memória livre quanto pensa ou o processo não é tão ativo quanto você pensa. é.

Se um processo ativo continuar sendo trocado, você deve corrigir o que estiver causando pressão na memória. Se não é um processo ativo, qual é o problema?

muru
fonte
1
+1: Qual é o grande problema? Nunca mude um sistema em execução , acho que não se deve mexer com as funções principais do sistema assim, especialmente não sem necessidade.
sobremesa
3
Às vezes, tenho problemas em que mato um processo com um vazamento de memória (que forçou todo o resto a trocar), deixando-me com ~ 10% de RAM usada ... mas todos os programas em execução estão em troca até que eu os acesse novamente. Então, toda vez que você toca em algo, há um atraso de dois segundos. Eu posso ver de onde o OP está vindo, e seria bom que isso fosse feito automaticamente, mas esse não é o caminho certo.
Alguém em algum lugar
1
@ SomeoneSomewhere Mas, não é assim que funciona. Se o processo está vazando memória, por definição, ele não está usando ativamente essa memória (não está lendo e gravando); apenas o alocou por acidente. Se houver outros processos ativos por aí, a memória vazada será trocada e será a sua troca cheia de lixo, não a sua RAM física.
precisa saber é o seguinte
@DavidRicherby Se você tem um programa aberto em segundo plano, ele ainda é menos ativo que o vazamento de memória - e quando você volta para ele, ele precisa sair do swap.
Alguém em algum lugar
@SomeoneSomewhere Parece que você não entendeu como o sistema de memória funciona. Você não precisa ter todo o processo na RAM física: a troca é gerenciada com base na granularidade de páginas únicas. Qualquer página que não tenha sido usada por um tempo pode ser trocada e uma página que consiste inteiramente de memória vazada nunca será usada novamente, portanto, nunca será trocada novamente após a troca.
David Richerby
34

É uma má idéia.

O kernel começa a copiar (sem mover) dados para trocar muito antes que a memória física esteja quase cheia, porque se algum processo exigir muita memória, qualquer página que já tenha uma cópia válida em troca poderá ser reutilizada imediatamente sem exigir outra gravação para o disco.

Geralmente isso acontece principalmente em páginas que não são acessadas há muito tempo, o que é um bom indicador de que é improvável que elas sejam acessadas em breve.

Se você descartar explicitamente as cópias, isso não traz benefícios, porque os dados ainda existem na RAM, mas pode custar-lhe velocidade quando algum processo deseja alocar muita memória e a troca se torna necessária.

O kernel também sempre usará espaço de troca assim que a memória física estiver acima de 50%, portanto esses números serão diferentes de zero, mesmo se você tiver memória suficiente instalada.

Simon Richter
fonte
4
sempre : acho que você está assumindo que /proc/sys/vm/swappinesso valor padrão é deixado 70, o que é bom para servidores e pagina de maneira bastante agressiva páginas sujas de processos que não as tocam há um tempo para abrir espaço para mais pagecache. Isso geralmente é ruim para os desktops porque a tecla alt-tab pode ficar lenta.
Peter Cordes
@PeterCordes, se as páginas foram realmente despejadas, os caches tiveram mais acessos do que as páginas de aplicativos em questão; portanto, houve um benefício líquido em usá-las como caches de disco. Eu posso ver como o desempenho do Alt-Tab é mais visível para o usuário do que, por exemplo, o tempo de compilação para um projeto grande, mas acho difícil formular uma política que garanta resposta instantânea sem sacrificar muito desempenho.
Simon Richter
1
Em outras palavras: o kernel é ajustado para throughput ( swappiness=70), mas a latência é mais importante para a experiência do usuário em uma área de trabalho. É uma troca. Se você compilar rotineiramente coisas um pouco grandes demais para permanecer no pagecache, deixe swappinessum pouco mais alto, como 20 ou 30 em vez de 5 ou 10. Consulte também akitaonrails.com/2017/01/17/optimizing-linux-for computadores lentos . Ver vm.vfs_cache_pressureabaixo de 100 também favorece o cache de metadados de inode / diretório em páginas de dados, o que também é bom para a capacidade de resposta da interface do usuário.
Peter Cordes
1
Outros ajustáveis: limites de write-back lonesysadmin.net/2013/12/22/… . Eles controlam a rapidez com que o Linux começa a gravar no disco depois que algo grava nos arquivos e quantas páginas sujas são permitidas. (ou seja, a quantidade de memória pode ser gasto em cache de gravação)
Peter Cordes
21

Esta é uma má ideia. Se isso fosse útil, o kernel do Linux implementaria dessa maneira. Não acredito que haja uma razão para alterar mais do que alguns parâmetros de ajuste, pois um simples script de shell provavelmente não é mais inteligente que os algoritmos dos desenvolvedores do kernel.

Você basicamente tem dois casos:

  • Os processos no espaço de troca não são usados ​​de qualquer maneira. Por que você deseja colocá-los de volta na RAM?
  • Há pouca RAM, então eles são trocados e você os coloca de volta na RAM. Em seguida, seu sistema os trocará novamente o mais rápido possível.

Portanto, existem dois pontos principais:

  1. Primeiro, seu sistema ficará lento quando houver pouca RAM para executar todos os seus programas ao mesmo tempo. A troca o ajudará a executar mais programas, mas não a mudar rapidamente para um raramente usado, que pode ser trocado. Nenhuma troca pode matar o raramente usado ou enviar ao atualmente usado uma exceção de falta de memória.
  2. Segundo, a troca é uma coisa boa e o fato de ter coisas em troca, já que você tem RAM grátis a custo de programas que atualmente não está usando.

Apesar de não haver problemas de falta de memória com muitos programas, alguns programas podem alocar memória com base na RAM atualmente livre (talvez seu navegador use mais memcache e você possa navegar mais rapidamente) e o kernel pode usar RAM livre para cache de disco e otimizações semelhantes. Quando você força a troca a ficar vazia, o kernel reduz o cache de leitura e, por exemplo, iniciar uma nova instância do Firefox leva mais tempo do que quando o Firefox ainda está no cache do disco.

Se você deseja ajustar o comportamento do kernel, consulte o parâmetro swappiness .

Dois recursos adicionais contribuem com @ peter-cordes:

Se você realmente deseja ter uma troca vazia, pode desativar a troca permanentemente. Eu não vejo por que tê-lo ligado por uma hora e depois esvaziá-lo tem vantagens sobre não ter swap.

todos
fonte
1
Consulte também akitaonrails.com/2017/01/17/optimizing-linux-for-slow-computers e lonesysadmin.net/2013/12/22/… para obter mais sugestões / detalhes de ajuste.
Peter Cordes
5

Você pode obter os mesmos resultados dizendo ao kernel para liberar os caches:

echo 3 > /proc/sys/vm/drop_caches

Dessa forma, você evita o breve momento de possível falta de memória e deixa o kernel decidir o que é necessário e o que pode ser descartado.

Alex C
fonte
0

Ao contrário da ideia comum, o SWAP em si não é ruim .
O que realmente torna o sistema lento é a atividade do kernel que move os Dados da RAM para o SWAP e de volta para a RAM, o swappiness.
O sistema faz isso automaticamente conforme é configurado com o swappiness.
Isso faz com que a memória de processos inativos seja despejada na partição de troca do disco rígido.
Eu mesmo trabalhei por anos com uma máquina que não tinha tanta memória RAM e sempre tive alguma memória SWAP usada. Ainda assim, minha máquina funcionou bem até você começar a mover a memória de volta para a RAM, talvez tentando fechar um aplicativo aberto. Então a carga de trabalho começou a aumentar.

  • Assim, ao limpar constantemente, a memória SWAP aumenta a carga de trabalho na sua máquina.
  • Os aplicativos em execução que possuem memória na partição SWAP podem danificar sua execução.

Em vez disso, sugiro que você estude de perto qual aplicativo usa sua memória na linha de comando com o htopaplicativo e decida fechar algum aplicativo. O gnome-system-monitorpode também fornecer uma boa visão, na guia Process.
Se você tem grandes aplicativos que usam muita RAM. Não execute todos eles de uma vez.

Bodo Hugo Barwich
fonte