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 -s
para determinar quaisquer trocas ativadas, eu costumava swapoff -a
desativar todas as trocas e swapon -s
novamente 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)?
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 oswapoff -a
que causou a "tempestade" de E / S?fstab
linha sobre swap. Tente se o comportamento for o mesmo.swapoff -a
deve 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 -a
porque o swap era 0 naquele momento.swapoff -a
é permanente.Respostas:
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.
fonte
cat /proc/meminfo
qualquer instalação Linux típica após algumas horas de carregamento.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
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.
fonte
chromium
processos usando pequenos pedaços de memória?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
swap
serviç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/swap
pode fornecer uma pista:Observe a parte sobre impasse . Você pode tentar fazer isso
umount -a -t tmpfs
sozinho antes de desativar a troca.Editar:
Provavelmente, você também pode atingir seu objetivo modificando as
sysctl
configurações (consulte esta pergunta ).fonte
swap
eminit.d
, nem eu tê-lo emfstab
, mas eu tenho/etc/init.d/mountoverflowtmp
que montatmpfs
para gravações de log de emergência. O daemon de trocatmpfs
também usa ?grep -RF swap /etc/
se desejar encontrá-lo. Mas para desativar um serviço, você usaria um comando comoservice
(IIRC; eu não uso o Debian).tmpfs
, porquetmpfs
é um sistema de arquivos em memória (RAM). Mas outros serviços / programas que usamtmpfs
podem 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 otmpfs
driver reivindica acesso para trocar espaço.swapoff
e viavm.swappiness=0
. No entanto,kswapd0
ainda corre! Gostaria de saber se isso é uma regressão dos 2,4 dias ...É melhor comentar a entrada da partição swap do
/etc/fstab
que executarswapoff -a
após cada inicialização.Eu tenho o mesmo problema com o kswapd0 no meu hardware.
O
vm.swappiness
parâmetro do sistema de ajuste não ajuda para mim.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
kswapd0
desativado.fonte
kswapd0
enlouquecer e você não tiver a troca ativada, ficará sem memória RAM. Suas opções são OOM Killer oukswapd0
. O Linux seguekswapd0
porque 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.No meu sistema (debian sid 15/11/2016), fiz o seguinte:
desative a troca agora:
comente a linha com a partição swap no / etc / fstab
desative a montagem do swap no systemd:
Seria suficiente. Há referência da troca no
/etc/initramfs-tools/conf.d/resume
arquivo. 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;)).fonte
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
echo 1 | sudo tee /proc/sys/vm/drop_caches
quandoActive(file):
(de / proc / meminfo) é mais de 2Gb (em um sistema RAM 16G) -é pode ir para máximo 4G