kvm morto por oomkiller

7

versão kvm: QEMU emulator version 1.1.2 (qemu-kvm-1.1.2+dfsg-6+deb7u3, Debian), Copyright (c) 2003-2008 Fabrice Bellard
versão libvirtd: libvirtd (libvirt) 0.9.12.3
versão debian: 7.5

Estou executando várias VMs em uma máquina com 16 GB de RAM, todas juntas usam ~ 9 GB de RAM.

De vez em quando o linux oom killer vem e mata um processo. Eu acho que escolhe o processo usando a maior parte da memória - neste caso, uma VM de 6 GB do Windows:
[431215.778365] Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child

IMHO a máquina não deve estar em uma situação OOM, pois há ~ 6,6 GB de memória cache disponível. Você pode ver a distribuição de memória e o resultado resultante matar aqui:

Agora eu configurei o oom_adj para o pid do kvms para -17 , para que o oom-killer não mate esse processo.

Mas ainda não consigo entender por que o kernel acha que precisa matar um processo e não vai liberar memória em cache.

  • Alguém pode explicar por que isso acontece?
  • Você pode me dizer como eu posso evitar que o assassino mate meus processos kvm sem conhecer o PID?
por Momo 02.07.2014 / 11:45

1 resposta

2

Desative apenas o OOM Killer para o processo específico com:

for p in $(pidof kvm qemu-system32_x64); do
  echo -n '-17' > /proc/$p/oom_adj
done

ou pelo sabor oom_score adj .

No entanto:

Out of memory: Kill process 25086 (kvm) score 192 or sacrifice child

No seu caso, é também definir 192 .

Veja também Domando o Assassino OOM

Em qualquer caso, você deve verificar também o que causa o estouro de memória, já que o OOM Killer mata outros processos importantes.

Freqüentemente é observado um fenômeno chamado overtuning . Neste caso, o overcommit_memory como descrito aqui .

Fonte sistemas de arquivos proc :

oom_adj:

For backwards compatibility with previous kernels, /proc/<pid>/oom_adj may also
be used to tune the badness score.  Its acceptable values range from -16
(OOM_ADJUST_MIN) to +15 (OOM_ADJUST_MAX) and a special value of -17
(OOM_DISABLE) to disable oom killing entirely for that task.  Its value is
scaled linearly with /proc/<pid>/oom_score_adj.

oom_score_adj:

The value of /proc/<pid>/oom_score_adj is added to the badness score before it
is used to determine which task to kill.  Acceptable values range from -1000
(OOM_SCORE_ADJ_MIN) to +1000 (OOM_SCORE_ADJ_MAX).  This allows userspace to
polarize the preference for oom killing either by always preferring a certain
task or completely disabling it.  The lowest possible value, -1000, is
equivalent to disabling oom killing entirely for that task since it will always
report a badness score of 0.
    
por 02.07.2014 / 12:26