O Linux trava quando é executado em memória insuficiente

4

Estou recebendo um comportamento inesperado quando minha máquina fica sem memória.

Eu tenho um Intel i7-6700 com 32GB de RAM e estou executando o Arch Linux com o kernel 4.14.8 vanilla. Eu tenho uma troca de 32GB em um volume LVM criptografado no disco SSD.

Durante a operação normal eu corro alguns convidados QEMU / KVM, juntamente com outras coisas (XFCE, Firefox etc.). O uso normal da memória é de cerca de 20 a 30%, quase sem troca.

Mas quando executo algo com uso intensivo de memória (por exemplo, 7za a -md=29 para compactar um arquivo grande), o sistema trava / congela quando o uso da memória chega a 100%. O teclado e o mouse param de responder completamente, a tela fica paralisada, a atividade do disco é interrompida e qualquer conexão TCP para interromper a máquina na fase SYN. A única maneira de se recuperar dessa situação é ligar e desligar a máquina.

No momento anterior à interrupção, pode-se ver que praticamente não há espaço de troca sendo usado. É claro que a troca está ativada, e eu não estou usando nenhuma configuração sysctl específica relacionada à memória (em particular, meu vm.swappiness possui o valor padrão de 60).

O que eu não entendo é isto:

  • Por que o kernel não usa o espaço de troca?
  • Por que o assassino não entra em ação quando a memória está esgotada?

Eu não sou um especialista em kernel, mas pelo que entendi, o sistema não deve congelar / travar quando ficar sem memória. O que eu esperaria ver é isto:

  • Quando há espaço de troca disponível, nenhum processo deve ser eliminado até que a memória e o swap sejam consumidos (no meu caso, 64G).
  • Mesmo sem swap, o oom-killer deve matar 7za quando a memória acabar
  • Mesmo sem os dois acima, qualquer processo que tente alocar mais memória do que o disponível deve receber um erro e falhar normalmente.

Portanto, existem três mecanismos independentes para evitar a falta de memória, mas todos parecem falhar. Eu percebo que pode haver alguns problemas sutis que eu não conheço (por exemplo, balonismo de memória em VMs convidadas, memória bloqueada etc.), mas realmente não consigo pensar em nada que explique o comportamento que estou vendo.

Alguém pode explicar o que está acontecendo aqui e por quê? Estou apenas sentindo falta de algo? Posso fazer algo para impedir deterministicamente pendurar?

EDITAR:

Eu fiz alguns testes diferenciais e descobri que:

  • Troca criptografada no volume LVM = > máquina congela.
  • Troca criptografada na partição = > tudo OK (swap é usado como esperado, a máquina não congela).

Parece que o problema está de alguma forma relacionado ao LVM. Eu usei a mesma partição física em ambos os casos, por isso não é relacionado ao disco. Durante os testes, deixei vm.swappiness para 60 (padrão).

Assim como uma nota lateral - durante um teste em particular, eu notei que no htop, um "notch" apareceu na barra de troca pouco antes da máquina congelar. Então, o kernel realmente começou a usar swap, mas durou apenas 3 segundos.

O problema deve ser facilmente reproduzível.

    
por jurez 30.12.2017 / 08:40

0 respostas