Pelo que entendi, quando o sistema está perto de não ter memória livre, o kernel deve começar a matar processos para recuperar alguma memória. Mas no meu sistema isso não acontece.
Suponha um script simples que aloque muito mais memória do que a disponível no sistema (uma matriz com milhões de strings, por exemplo). Se eu executar um script como este (como um usuário normal), ele receberá toda a memória até o sistema congelar completamente (apenas o SysRQ REISUB funciona).
A parte estranha aqui é que, quando o computador congela, o led do disco rígido liga e permanece assim até a reinicialização do computador, se eu tiver uma partição swap montada ou não!
Então, minhas perguntas são:
- Esse comportamento é normal? É estranho que um aplicativo executado como usuário normal possa travar o sistema dessa maneira ...
- Existe alguma maneira de fazer o Ubuntu simplesmente matar automaticamente esses aplicativos quando eles recebem muita (ou mais) memória?
Informação adicional
- Ubuntu 12.04.3
- Kernel 3.5.0-44
RAM: ~ 3.7GB a partir de 4GB (compartilhado com a placa gráfica). *
$ tail -n+1 /proc/sys/vm/overcommit_* ==> /proc/sys/vm/overcommit_memory <== 0 ==> /proc/sys/vm/overcommit_ratio <== 50 $ cat /proc/swaps Filename Type Size Used Priority /dev/dm-1 partition 4194300 344696 -1
tail -n+1 /proc/sys/vm/overcommit_*
e adicione a saída. Veja aqui também: Como configurar oom-killerAllocation failed
). Mas, sem troca, apenas congela o computador. É suposto funcionar desta maneira (apenas matar quando se usa swap)?Respostas:
A partir da documentação oficial
/proc/sys/vm/*
:Para resumir, ao definir
oom_kill_allocating_task
para1
, em vez de varrer seu sistema à procura de processos para matar, o que é uma tarefa cara e lenta, o kernel simplesmente mata o processo que causou a falta de memória no sistema.De minhas próprias experiências, quando um OOM é acionado, o kernel não tem mais "força" suficiente para fazer essa verificação, tornando o sistema totalmente inutilizável.
Além disso, seria mais óbvio apenas matar a tarefa que causou o problema, por isso não entendo por que ela está definida como
0
padrão.Para testar, basta escrever no pseudo-arquivo adequado
/proc/sys/vm/
, que será desfeito na próxima reinicialização:Para uma correção permanente, escreva o seguinte em
/etc/sysctl.conf
ou para um novo arquivo em/etc/sysctl.d/
, com uma.conf
extensão (/etc/sysctl.d/local.conf
por exemplo):fonte
0
padrão". - porque o processo que solicitou memória não é necessariamente aquele que "causou o problema". Se o processo A consumir 99% da memória do sistema, mas o processo B, que usa 0,9%, for o que aciona o assassino da OOM por azar, B não "causa o problema" e não faz sentido kill B. Tendo isso em consideração, a política corre o risco de processos de baixa memória totalmente sem problemas serem mortos por acaso devido ao uso de memória descontrolada de um processo diferente .vm.admin_reserve_kbytes
aumentado para, digamos, 128 MB . A configuraçãovm.oom_kill_allocating_task = 1
parece aliviar o problema, na verdade não o resolve (e o Ubuntu já lida com garfos por padrão).sudo sysctl -w vm.oom_kill_allocating_task=1
Atualização: O bug foi corrigido.
A resposta de Teresa é suficiente para solucionar o problema e é boa.
Além disso, arquivei um relatório de bug, porque esse é definitivamente um comportamento defeituoso.
fonte
Você pode tentar o earlyoom , um assassino de OOM que opera no espaço do usuário e tenta matar o maior processo em uma situação de OOM.
fonte
Antes de tudo, recomendo a atualização para 13.10 (instalação limpa, salve seus dados).
Se você não deseja atualizar, mude o vm.swappiness para 10 e se encontrar problemas com o seu ram, instale o zRAM.
fonte
vm.swappiness
faz mais mal do que bem, ainda mais em sistemas que sofrem de problemas de pouca memória.