Como desativar completamente a troca?

28

Estou usando o Debian sid, disco rígido formatado com ext4, rodando no linux 3.1

Eu me lembro de versões anteriores do linux (talvez antes de 3.0), se eu ficar sem memória, e a swap não estiver ativada, os programas normalmente travarão. Isso é perfeito para o meu ambiente: navegação simples na Web sem operações críticas. Ou seja, se eu acidentalmente encontrar um site ruim que consome muita memória, ele simplesmente falha sem tornar meu terminal inutilizável.

Mas na minha configuração atual, o computador trava com uma taxa de transferência de E / S violenta em segundo plano. O iotop revela que o kswapd0 é o culpado, o que significa que é devido a troca. Depois de usar swapon -s para determinar quaisquer swaps que foram ativados, usei swapoff -a para desativar todos os swaps e swapon -s novamente para confirmar que todos os swaps estavam desativados.

Depois tentei maximizar o uso da minha memória novamente. Infelizmente, o comportamento que eu esperava não aconteceu. Em vez disso, o kswapd0 tenta repetidamente trocar a RAM e falhar, pois não há espaço de troca. Como ele nunca desiste, meu computador fica bloqueado no congelamento de E / S pesado, ruim para a integridade do disco.

Estou fazendo algo errado ao tentar swapoff -a ? Por que o comportamento é diferente do que costumava ser (provavelmente pré-3.0 vezes)?

    
por syockit 15.11.2011 / 12:27

6 respostas

14

Desabilitar o swap não fará o que você deseja. Você ainda terá um rendimento de E / S violento, mas será de páginas limpas, e não de páginas sujas.

Sem troca, o sistema comprimirá o cache de páginas limpas (não modificadas) para perto de zero, porque essas são as únicas páginas que podem ser removidas da memória física. Ele só pode despejar páginas sujas (modificadas) da memória, escrevendo-as para trocar, sem swap, não tem como remover páginas sujas.

À medida que você fica com pouca memória física, cada processo terá que carregar suas páginas de código do disco à medida que ele despeja as páginas de código do processo anterior. O resultado será uma surra violenta e um trabalho excessivo feito pelo subsistema de troca.

Este é um caso especial de um princípio muito importante: para um sistema bem projetado, você não pode fazê-lo funcionar melhor reduzindo suas opções. Linux é um sistema bem projetado. Remover o swap apenas dá menos opções, então não é surpresa que ele se comporte pior.

    
por 15.11.2011 / 17:57
14

Uma solução melhor do que desligar o swap, que na melhor das hipóteses fará com que processos aleatórios sejam eliminados quando a memória estiver fraca, é definir o limite de segmento de dados por processo para processos que extraem material da rede. Dessa forma, um navegador descontrolado atingirá o limite e morrerá, em vez de causar a inutilização de todo o sistema. Exemplo, do shell

(ulimit -d 400000; firefox) &

O número após -d é em kilobytes. Você deve experimentar isso em seu sistema para escolher o melhor valor para seus hábitos de navegação. Os parênteses fazem com que um subshell seja criado; o comando ulimit afeta apenas esse shell e seus filhos, isolando seus efeitos do shell pai.

    
por 01.02.2012 / 20:05
4

Para garantir que a troca não seja usada, seria melhor evitar que qualquer troca fosse adicionada durante a inicialização. Isso pode ser feito, dependendo do sistema, desabilitando o serviço de inicialização swap ou apenas comentando a entrada de swap em /etc/fstab .

No que diz respeito ao seu desligamento, a função stop() em /etc/init.d/swap pode dar uma pista:

stop()
{
       ebegin "Deactivating swap devices"

       # Try to unmount all tmpfs filesystems not in use, else a deadlock may
       # occure. As $RC_SVCDIR may also be tmpfs we cd to it to lock it
       cd "$RC_SVCDIR"
       umount -a -t tmpfs 2>/dev/null

       case "$RC_UNAME" in
               NetBSD|OpenBSD) swapctl -U -t noblk >/dev/null;;
               *)              swapoff -a >/dev/null;;
       esac
       eend 0
}

Observe a parte sobre deadlock . Você pode tentar fazer umount -a -t tmpfs yourself antes desativar a troca.

Editar:

Provavelmente, você também pode atingir sua meta modificando sysctl configurações (consulte esta questão ).

    
por 15.11.2011 / 12:49
2

É melhor comentar a entrada da partição swap em /etc/fstab do que executar swapoff -a após cada inicialização.

Eu tenho o mesmo problema com o kswapd0 no meu hardware.

O parâmetro do sistema vm.swappiness de ajuste não ajuda para mim.

sysctl -w vm.swappiness=0

Eu pesquisei no Google e li muitas postagens, listas de discussão e agora acho que isso é um bug do kernel.

Quando não há partição de swap ativa e a memória livre se torna menor do que algum limiar (cerca de 300MB no meu caso) o sistema deixa de responder devido à loucura do kswapd0.

Provavelmente, é reproduzido com configurações e condições especiais.

Para alguém, isso é resolvido pela reinstalação do sistema com a nova partição para outros, criando um kernel personalizado com kswapd0 desativado.

    
por 24.04.2013 / 06:47
1

the computer hangs with violent I/O throughput in the background. iotop reveals kswapd0 to be the culprit

Eu encontrei um caminho (até agora) para evitar isso. Se você quiser testá-lo e ver como ele funciona no seu sistema, veja o patch do kernel em esta pergunta . Basicamente, não elimina Active(file) páginas (pelo menos) quando sob pressão de memória, assim a trituração de disco (leitura constante) é reduzida a quase nada e o OOM-killer pode disparar dentro de 1 segundo, em vez de congelar o SO pelo que parece ser permanentemente (ou pelo menos por muitos minutos). Eu estou esperando que programadores reais (dos quais eu não sou) possam melhorar o patch e torná-lo uma solução real, agora que eles vêem que o que ele faz é trabalhar para estas situações.

    
por 31.08.2018 / 10:56
0

No meu sistema (debian sid 2016-11-15), eu fiz isso:

  1. desative a troca agora:

    swapoff -a
    
  2. comente a linha com a partição swap em / etc / fstab

    #### #UUID=c6ddbc95-3bb5-49e1-ab25-b1c505e5360c none            swap    sw              0       0
    
  3. desativa a montagem do swap no systemd:

    systemctl --type swap
    systemctl stop dev-sda6.swap
    systemctl mask dev-sda6.swap
    

Seria necessário. Há referência da troca no arquivo /etc/initramfs-tools/conf.d/resume . Eu não sei qual é o propósito disso. Talvez esse arquivo seja um problema na próxima reinicialização (não tento reiniciar ainda, meu tempo de atividade é precioso;)).

    
por 15.11.2016 / 11:34

Tags