Como desativar completamente a troca?

30

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

Lembro-me de versões anteriores do Linux (talvez antes da 3.0), se eu ficar sem memória e a troca não estiver ativada, os programas geralmente travam. Isso é perfeito para o meu ambiente: navegação na web simples, sem operações críticas. Ou seja, se eu acidentalmente encontrar um site ruim que consome muita memória, ele simplesmente trava sem tornar meu terminal inutilizável.

Mas, na minha configuração atual, o computador trava com uma violenta taxa de transferência de E / S em segundo plano. O iotop revela que o kswapd0 é o culpado, o que significa que é devido à troca. Depois de usar swapon -spara determinar quaisquer trocas ativadas, eu costumava swapoff -adesativar todas as trocas e swapon -snovamente para confirmar que todas as trocas foram desativadas.

Depois tentei maximizar meu uso de memória novamente. Infelizmente, o comportamento que eu esperava não aconteceu. Em vez disso, o kswapd0 tenta repetidamente trocar a RAM e falha porque não há espaço de troca. Como ele nunca desiste, meu computador está bloqueado pelo congelamento eterno de E / S, prejudicial à saúde do meu disco.

Estou fazendo algo errado ao tentar swapoff -a? Por que o comportamento é diferente do que costumava ser (provavelmente antes da versão 3.0)?

syockit
fonte
Isso realmente não faz sentido. Fazer isso por swapoff -a si só , se houver alguma coisa no swap, gerará muita E / S (e poderá resultar na morte de processos se não houver RAM real suficiente disponível). Tem certeza de que não foi o swapoff -aque causou a "tempestade" de E / S?
Mat
11
Suponho que seja suficiente comentar a fstablinha sobre swap. Tente se o comportamento for o mesmo.
enzotib 15/11/11
O @Mat swapoff -adeve desativar a troca permanentemente, o que significa que deve permanecer desativado após a próxima reinicialização. Eu confirmei isso. No entanto, a "tempestade" de E / S ainda acontece durante a sessão após a próxima reinicialização. Para o registro, a "tempestade" de E / S não aconteceu no momento, swapoff -aporque o swap era 0 naquele momento.
21411 syllit
9
@ syockit: nãoswapoff -a é permanente.
Mat
11
o carregamento do banco de dados chegou a cerca de 15% em 14 horas. Desativou a troca e, na próxima tentativa, chegou a 40% em 4 horas. é certo que o servidor está com pouca energia e baixo consumo de RAM, mas sem a troca ativada, o OpenSuSE funciona muito mais rápido nesse processo. A opinião do sistema operacional de "melhor" e a minha diferem dramaticamente durante uma simples carga de banco de dados mysql. comentou a unidade de troca em / etc / fstab e reiniciou.
TheSatinKnight

Respostas:

15

Desabilitar a troca não fará o que você deseja. Você ainda terá uma taxa de transferência de E / S violenta, mas será de páginas limpas, e não de páginas sujas.

Sem troca, o sistema compactará o cache de páginas limpas (não modificadas) para quase 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 gravando-as para troca, sem troca, não tem como despejar páginas sujas.

Conforme você fica com pouca memória física, cada processo precisará carregar suas páginas de código do disco, pois despeja as páginas de código anteriores do processo. O resultado será uma violenta debulha e trabalho excessivo realizado pelo subsistema de permuta.

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 a troca apenas oferece menos opções, portanto, não é de surpreender que se comporte pior.

David Schwartz
fonte
11
Isso só é verdade se você alocar pouco espaço na memória. Um processo de fuga geralmente tentará alocar muito mais e, portanto, será eliminado mais cedo, liberando a memória, em vez de continuar trocando o sistema até a morte tentando acomodar mais alocações; portanto, desativar a troca pode ser útil quando você apenas maximiza seu uso de memória RAM a partir de um processo descontrolado.
Psd #
11
Um pouco da memória será praticamente sempre alocado. O Linux é ajustado especificamente dessa maneira. Faça cat /proc/meminfoqualquer instalação Linux típica após algumas horas de carregamento.
21711 David Schwartz
2
@syockit Se você desativar a paginação, não poderá executar nenhum programa. A paginação é o mecanismo pelo qual os arquivos são lidos quando mapeados na memória.
18711 David Schwartz
2
@psusi: páginas limpas não serão reduzidas ao mínimo quando você trocar. Em vez disso, ele trocará páginas sujas e anônimas que não foram usadas recentemente. Obviamente, de qualquer forma, você poderá sofrer violentas violações se o conjunto de trabalho exceder a memória física. O ponto é que, com ou sem troca, você terá muitas violentas surras antes de realmente ficar sem memória. A diferença é que, com a troca, a troca violenta será trocada (páginas sujas, escreva e leia). Sem troca, o violento debulhar será uma falha no código (páginas limpas, somente leitura).
David Schwartz
2
@psusi: Você está correto se a preocupação for um processo descontrolado que explode rapidamente no consumo de memória. Mas não é disso que o OP está falando, que é um processo que consome memória excessiva, mas não ilimitada ou massivamente excessiva. À medida que cresce através do grande ponto ideal (onde o cache é compactado), ele cresce cada vez mais lentamente à medida que o sistema se debate.
David Schwartz
13

Uma solução melhor do que desativar a troca, que na melhor das hipóteses causa a morte de processos aleatórios quando a memória está baixa, é definir o limite por segmento de dados por processo para processos que retiram coisas da rede. Dessa forma, um navegador descontrolado atinge o limite e morre, em vez de fazer com que todo o sistema se torne inutilizável. Exemplo, a partir do shell

(ulimit -d 400000; firefox) &

O número após -d está em kilobytes. Você deve experimentar isso no 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.

Kyle Jones
fonte
Isso funcionará para o cromo, digamos, onde temos vários chromiumprocessos usando pequenos pedaços de memória?
jberryman
@jberryman Não, os limites de memória são por processo e não por usuário.
Kyle Jones
Existe uma maneira de enviar um sinal especificado (por exemplo, SIGHUP) quando atingir o limite de memória?
Geremia 24/02
11
@ Geremia Não. As chamadas do sistema brk e sbrk param de funcionar, o que fará com que a maioria das coisas se enrole e morra.
22417 Kyle Jones
Se você quiser ir com o ajuste manual, sugiro usar o cgroup de memória em vez do ulimit porque, com o cgroup de memória, você pode definir um limite para todo o grupo de processos e pode configurar o processo de alocação de memória para parar e seu processo de política no modo de usuário pode decidir o que faça (por exemplo, envie alguns sinais, selecione o processo a ser morto, aumente o limite de memória rapidamente). Veja kernel.org/doc/Documentation/cgroup-v1/memory.txt e kernel.org/doc/Documentation/cgroup-v2.txt para obter detalhes.
Mikko Rantalainen
4

Para garantir que a troca não seja usada, é melhor evitar que qualquer troca seja adicionada na inicialização. Isso pode ser feito, dependendo do sistema, desativando o swapserviço de inicialização ou apenas comentando a entrada de troca /etc/fstab.

No que diz respeito ao seu hangup, a stop()função in /etc/init.d/swappode fornecer 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 impasse . Você pode tentar fazer isso umount -a -t tmpfssozinho antes de desativar a troca.


Editar:

Provavelmente, você também pode atingir seu objetivo modificando as sysctlconfigurações (consulte esta pergunta ).

rozcietrzewiacz
fonte
Eu não tenho swapem init.d, nem eu tê-lo em fstab, mas eu tenho /etc/init.d/mountoverflowtmpque monta tmpfspara gravações de log de emergência. O daemon de troca tmpfstambém usa ?
syockit
Você pode habilitá-lo em outro lugar - faça grep -RF swap /etc/se desejar encontrá-lo. Mas para desativar um serviço, você usaria um comando como service(IIRC; eu não uso o Debian).
rozcietrzewiacz
11
O swap em si não usa tmpfs , porque tmpfsé um sistema de arquivos em memória (RAM). Mas outros serviços / programas que usam tmpfspodem depender da troca de uma maneira especial. Eu realmente não sei, mas pode ter algo a ver com o cache ou uma maneira especial pela qual o tmpfsdriver reivindica acesso para trocar espaço.
rozcietrzewiacz
Há algo sobre como o Linux lida com a memória virtual que eu não entendo. Desativei o swap da maneira mais possível: via swapoffe via vm.swappiness=0. No entanto, kswapd0ainda corre! Gostaria de saber se isso é uma regressão dos 2,4 dias ...
syockit 15/11/11
5
@syockit É comportamento esperado. O sistema ainda está trocando páginas limpas (páginas que contêm cópias dos dados do arquivo). Ele não requer espaço de troca para trocar as páginas limpas, pois elas podem ser lidas novamente de outras fontes que não a troca.
21711 David Schwartz
2

É melhor comentar a entrada da partição swap do /etc/fstabque executar swapoff -aapós cada inicialização.

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

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

sysctl -w vm.swappiness=0

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

Quando não há partição de troca ativa e a memória livre fica menor que um limite (cerca de 300 MB no meu caso), o sistema não responde devido à loucura do kswapd0.

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

Para alguém, isso é resolvido com a reinstalação do sistema com o particionamento de outros, criando o kernel personalizado com kswapd0desativado.

gomas
fonte
2
Se kswapd0enlouquecer e você não tiver a troca ativada, ficará sem memória RAM. Suas opções são OOM Killer ou kswapd0. O Linux segue kswapd0porque o kernel assume que é mais importante terminar lentamente do que abortar o processo. Para humanos casuais, o limiar em que o kernel pensa que ainda existe progresso suficiente já é glacialmente lento e quase todo mundo prefere selecionar OOM Killer.
Mikko Rantalainen
1

No meu sistema (debian sid 15/11/2016), fiz o seguinte:

  1. desative a troca agora:

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

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

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

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

homer242
fonte
1

o computador trava com uma violenta taxa de transferência de E / S em segundo plano. iotop revela que o kswapd0 é o culpado

Eu encontrei uma maneira (até agora) de evitar isso. Se você quiser testá-lo e ver como ele faz em seu sistema, consulte o patch do kernel dentro esta questão . Basicamente, ele não despeja Active(file)páginas (pelo menos) quando está sob pressão da memória, portanto, o thrashing do disco (leitura constante) é reduzido a quase nada e o OOM-killer pode ser acionado em 1 segundo, em vez de congelar o sistema operacional pelo que parece como permanentemente (ou pelo menos por muitos minutos). Espero que programadores reais (dos quais não sou) melhorem o patch e o transformem em uma solução real, agora que eles vêem que o que ele faz está funcionando para essas situações.


fonte
esse patch do kernel já está em manutenção?
humanityANDpeace
@humanityANDpeace provavelmente não, porque não é tão bom (como eu não sou programador), no entanto, tive algum problema com ele, como: às vezes, dependendo da carga de trabalho, com esse patch, você pode ficar sem memória nos casos em que, sem este patch você não teria e, assim, OOM-killer vai matar Xorg e xfwm4, a menos que executar echo 1 | sudo tee /proc/sys/vm/drop_cachesquando Active(file):(de / proc / meminfo) é mais de 2Gb (em um sistema RAM 16G) -é pode ir para máximo 4G