OO killer não está funcionando?

29

Pelo que eu entendo, 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 de jeito nenhum.

Suponha um script simples que aloque muito mais memória do que a disponível no sistema (um array com milhões de strings, por exemplo). Se eu executar um script como este (como um usuário normal), ele ficará com toda a memória até o sistema congelar completamente (somente o SysRQ REISUB funciona).

A parte estranha aqui é que quando o computador congela, o led do disco rígido liga e fica assim até que o computador seja reinicializado, ou se eu tiver uma partição swap montada ou não!

Então, minhas perguntas são:

  1. Esse comportamento é normal? É estranho que um aplicativo executado como um usuário normal possa simplesmente travar o sistema dessa maneira ...
  2. Existe alguma maneira de eu fazer com que o Ubuntu simplesmente mate automaticamente esses aplicativos quando eles pegam muito (ou mais) memória?

Informações adicionais

  • Ubuntu 12.04.3
  • Kernel 3.5.0-44
  • RAM: ~ 3.7 GB a partir de 4 GB (compartilhados com 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
    
por Salem 31.12.2013 / 19:21

3 respostas

23

Na documentação oficial do /proc/sys/vm/* :

  

oom_kill_allocating_task

     

Isso ativa ou desativa a eliminação da tarefa de acionamento da OOM em   situações de falta de memória.

     

Se isso for definido como zero, o killer da OOM examinará todo o   lista de tarefas e selecione uma tarefa baseada em heurística para matar. Isso normalmente   seleciona uma tarefa desonesta de memória que libera uma grande quantidade de   memória quando morto.

     

Se isso for definido como diferente de zero, o killer da OOM simplesmente mata a tarefa que   desencadeou a condição de falta de memória. Isso evita o dispendioso   varredura da lista de tarefas.

     

Se panic_on_oom for selecionado, terá precedência sobre qualquer valor   é usado em oom_kill_allocating_task.

     

O valor padrão é 0.

Para resumir, ao definir oom_kill_allocating_task para 1 , em vez de varrer seu sistema procurando por processos a serem mortos, o que é uma tarefa cara e lenta, o kernel simplesmente acabará com o processo que causou o sistema sem memória.

De minhas próprias experiências, quando uma OOM é acionada, o kernel não tem mais "força" suficiente para fazer essa varredura, tornando o sistema totalmente inutilizável.

Além disso, seria mais óbvio apenas matar a tarefa que causou o problema, por isso não consigo entender por que ela está definida como 0 por padrão.

Para testes, você pode simplesmente escrever no pseudo arquivo apropriado em /proc/sys/vm/ , que será desfeito na próxima reinicialização:

echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task

Para uma correção permanente, escreva o seguinte em /etc/sysctl.conf ou em um novo arquivo em /etc/sysctl.d/ , com uma extensão .conf ( /etc/sysctl.d/local.conf , por exemplo):

vm.oom_kill_allocating_task = 1
    
por Teresa e Junior 09.01.2014 / 16:42
7

Atualização: o bug foi corrigido.

A resposta de Teresa é suficiente para solucionar o problema e é boa.

Além disso, enviei um relatório de bug: link

Porque esse é definitivamente um comportamento quebrado.

    
por int_ua 21.08.2014 / 16:08
-1

Antes de mais nada, recomendo a atualização para 13.10 (instalação limpa, salvar seus dados).

Se você não quiser atualizar, altere o vm.swappiness para 10 e se encontrar problemas com o seu zRAM de instalação de RAM.

    
por Brask 09.01.2014 / 15:02

Tags