Eu tento ajustar meu sistema de desenvolvimento para a confiabilidade máxima. Desabilitei o swap, porque, para o uso da GUI, ela geralmente deixa a máquina sem resposta, de tal maneira que não é mais utilizável. No entanto, se aplicativos agressivos consomem a memória, alguns mecanismos parecem funcionar, tirando o máximo proveito disso no custo da velocidade. Não há operação de troca do disco rígido, mas o sistema está ficando sem resposta da mesma forma. Então, quero deixar o assassino da OOM entrar em ação antes que o sistema faça esforços especiais no ganho de memória. É possível configurar o killer OOM para agir se houver menos de 100 MB de memória física livre, por exemplo?
linux-kernel
memory-management
dronus
fonte
fonte
Respostas:
Eu também lutei com esse problema. Eu só quero que meu sistema permaneça responsivo, não importa o que aconteça, e prefiro perder processos do que esperar alguns minutos. Parece não haver maneira de conseguir isso usando o kernel oom killer.
No entanto, no espaço do usuário, podemos fazer o que quisermos. Então, escrevi o Early OOM Daemon ( https://github.com/rfjakob/earlyoom ) que matará o maior processo (por RSS) quando a RAM disponível ficar abaixo de 10%.
Sem o earlyoom, foi fácil bloquear minha máquina (8 GB de RAM) iniciando o http://www.unrealengine.com/html5/ algumas vezes. Agora, as guias culpadas do navegador são mortas antes que as coisas saiam do controle.
fonte
earlyoom
agora, ele se sai bem em um primeiro teste de gatilho. Apenas me pergunto por que isso não pode ser implementado pela configuração do kernel ou pelas ferramentas do sistema.A política padrão do kernel é permitir que os aplicativos continuem alocando memória virtual enquanto houver memória física livre. A memória física não é realmente usada até que os aplicativos toquem na memória virtual que eles alocaram, para que um aplicativo possa alocar muito mais memória do que o sistema, em seguida, comece a tocá-lo mais tarde, fazendo com que o kernel fique sem memória e ative a saída assassino de memória (OOM). Porém, antes que o processo de hogging seja interrompido, o cache do disco é esvaziado, o que torna o sistema lento para responder por um tempo até que o cache seja recarregado.
Você pode alterar a política padrão para proibir a confirmação excessiva de memória, escrevendo um valor de 2 em
/proc/sys/vm/overcommit_memory
. O valor padrão/proc/sys/vm/overcommit_ratio
é 50, portanto o kernel não permitirá que os aplicativos aloquem mais de 50% do ram + swap. Se você não tiver troca, o kernel não permitirá que os aplicativos aloquem mais de 50% de sua memória RAM, deixando os outros 50% livres para o cache. Isso pode ser um pouco excessivo, então você pode aumentar esse valor para aproximadamente 85%, para que os aplicativos possam alocar até 85% da sua memória RAM, deixando 15% para o cache.fonte
I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.
. Ele mencionou a GUI, enquanto você assume que ele executa um comando. Comprar mais memória é a primeira solução, usar menos memória é a segunda solução, tornar o sistema instável, mexendo nos padrões estáveis, é a última solução. A pergunta não precisa ser respondida literalmente, então não vejo qual é o seu problema, pois você deve nos incomodar nos comentários. Rant não ajuda .../proc/meminfo
' sCommitted_AS
estados. Com alguns aplicativos em execução, esse valor excede facilmente a memória física, por isso é difícil definir um limite viável para isso.Para mim, definir vm.admin_reserve_kbytes = 262144 faz exatamente isso. OOM killer intervém antes que o sistema fique completamente sem resposta.
fonte
As outras respostas têm boas soluções automáticas, mas acho que também pode ser útil ativar a
SysRq
chave para quando as coisas ficarem fora de controle. Com aSysRq
chave, você enviaria mensagens manualmente para o kernel e poderá fazer coisas como uma reinicialização segura (comSysRQ + REISUB
) mesmo que o espaço do usuário esteja completamente congelado.Para permitir que o kernel ouça solicitações, defina
kernel.sysrq = 1
ou habilite apenas as funções que você provavelmente usará com uma máscara de bits (documentada aqui ). Por exemplokernel.sysrq = 244
, habilitará todos os combos necessários para a reinicialização segura acima, bem como a invocação manual do OOM killerSysRq + F
.fonte
A confiabilidade não é alcançada por condições de pouca memória e por um killer de OOM.
É errado organizar uma festa em um armário e colocar "limpando meu armário" em sua pequena lista de reprodução.
Fazer isso terá resultados colaterais indesejados, porque você não tem controle sobre o que é morto.
A confiabilidade máxima envolve testar seu sistema e aprimorá-lo com base nesses testes.
Apenas ajustar coisas aleatórias não o levará a lugar algum ...
Devido a condições de pouca memória, desabilitar a troca não melhorará o comportamento , mas o contrário .
Para aumentar a confiabilidade nessa situação, adicione mais memória para que seu sistema seja mais responsivo e não haja processos aleatórios sendo mortos sem a intenção do usuário. Você não deve recorrer a condições de pouca memória e a um mecanismo como esse, especialmente não em um ambiente de desenvolvimento ...
As condições de pouca memória realmente resultam em falta de resposta, independentemente de você ter uma troca ou não.
Esforços especiais que farão mais mal do que bem, como expliquei acima. Em vez disso, você pode matar processos dos quais não precisa, mas acho que você não pode fazer isso, para que o OOM acabe com os processos necessários.
Pode ser, mas você obtém um retorno mais alto do investimento se comprar apenas uma memória extra que atualmente não custa muito. Considere que você vai bater no pé a longo prazo se continuar trabalhando em condições de pouca memória. OOM é como um oficial de justiça, não ajuda, ajuda o sistema operacional ...
fonte
kill
cego.