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

25

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

Eu fiz um pequeno comando cron 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 pensando sobre as possíveis razões por que isso pode ser uma má ideia, ou como eu poderia melhorar esse script para torná-lo um pouco mais inteligente?

    
por Yvan Sraka 06.11.2017 / 15:25

6 respostas

51

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

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

    
por Rinzwind 06.11.2017 / 15:55
41

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

Se um processo ativo continuar a ser trocado, você deve estar consertando o que está causando pressão na memória. Se não é um processo ativo, qual é o problema?

    
por muru 06.11.2017 / 15:54
34

É uma má ideia.

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

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

Se você descartar explicitamente as cópias, isso não trará nenhum benefício, porque os dados ainda existem na RAM, mas podem custar a sua velocidade quando algum processo quiser alocar muita memória e a troca for necessária.

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

    
por Simon Richter 06.11.2017 / 16:40
21

Esta é uma má ideia. Se isso fosse útil, o kernel do Linux iria implementá-lo dessa maneira. Eu não acredito que haja uma razão para mudar mais do que alguns parâmetros de ajuste, já que um simples shell script 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ê quer puxá-los de volta para a RAM?
  • Há pouca RAM, então eles são trocados e você os coloca de volta na RAM. Então o seu sistema irá colocá-los em swap novamente o mais rápido possível.

Portanto, há dois pontos principais:

  1. Primeiro, seu sistema ficará lento quando houver pouca memória RAM para executar todos os seus programas de uma só vez. Swap irá ajudá-lo a executar mais programas, mas não a mudar rapidamente para um raramente usado, que pode ser trocado. Nenhuma troca pode fazer com que a pessoa raramente usada seja eliminada ou envie uma exceção de falta de memória usada atualmente.
  2. Em segundo lugar, o swap é uma coisa boa e, portanto, está tendo trocas de coisas, já que você tem RAM livre ao custo de programas que não está usando atualmente.

Apesar de não ter 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ê pode navegar mais rápido) e o kernel pode usar RAM livre para cache de disco e otimizações semelhantes. Quando você força o seu swap a ficar vazio, o kernel irá eliminar o seu cache de leitura e, por exemplo, iniciar uma nova instância do Firefox levará mais tempo do que quando o Firefox ainda estiver no cache de disco.

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

Dois recursos adicionais contribuem com @ peter-cordes:

Se você realmente deseja ter um swap vazio, pode desativar o swap permanentemente. Não vejo por que tê-lo por uma hora e depois esvaziá-lo tem vantagens sobre não ter swap.

    
por allo 06.11.2017 / 16:34
5

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

echo 3 > /proc/sys/vm/drop_caches

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

    
por Alex C 07.11.2017 / 14:24
0

Ao contrário da idéia comum, o SWAP em si não é ruim .
O que realmente atrasa seu sistema é 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, pois está configurado com o swappiness .
Isso faz com que a memória de processos inativos seja despejada na partição de troca de disco rígido. Eu mesmo trabalhei durante anos com uma máquina que não tinha muita memória RAM e sempre usei algumas memórias SWAP. Ainda assim, minha máquina funcionou bem até que você comece 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.

  • Portanto, ao limpar constantemente a memória de troca, a carga de trabalho da sua máquina aumentará consideravelmente.
  • A execução de aplicativos que possuem memória na partição SWAP pode corromper sua execução.

Em vez disso, sugiro que você estude com clareza qual aplicativo usa sua memória na linha de comando com o aplicativo htop e decide fechar algum Aplicativo. O gnome-system-monitor também pode fornecer uma boa visão, na sua guia Processo.
Se você tem grandes aplicações que usam muita memória RAM. Não os execute todos de uma vez.

    
por Bodo Hugo Barwich 16.11.2017 / 14:37

Tags