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:
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:
7za
quando a memória acabar 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:
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.