Ainda não tenho uma solução para o problema, mas posso oferecer duas soluções alternativas que podem ser de interesse para os outros:
1) earlyoom
Esse é um serviço que observa o uso de memória e mata o processo que consome mais memória quando um determinado limite é atingido (consulte também este e esta pergunta sobre o killer da OOM no kernel do linux)
Eu testei com um processo de demonstração que solicita indefinidamente memória em pequenos pedaços. Aqui está minha primeira impressão: Quando eu começo o processo desonesto, ele rapidamente consome toda a minha memória RAM. Em seguida, a troca começa, o sistema torna-se irresponsivo. Alguns segundos depois, o sistema está de volta online. O log de earlyoom mostra que ele matou o processo de consumo de memória após o uso da memória e do swap atingir 90%.
Ainda há o atraso irritante quando a troca inicia e depois que o processo foi eliminado, algumas partes de outros processos geralmente permanecem na troca até que sejam solicitadas, mas é um começo.
2) apenas desabilite o swap
Eu sei que este é um tópico polêmico , mas com a finalidade de sistemas de desktop e especialmente de máquinas de desenvolvimento em que pode acontecer de tempos em tempos que um processo tente consumir toda a sua memória, faz sentido: Sem swap, o killer da OOM simplesmente funciona como planejado. Quando você fica sem memória, ele encontra o melhor processo para matar e se livrar dele. Sem atraso, sem atraso.
Você pode desabilitar o swap para a sessão atual com sudo swapoff -a
ou tornando a alteração permanente .
A solução adequada para o problema seria, claro, que o sistema permaneça responsivo quando a memória principal estiver esgotada e começar a trocar memória como se não houvesse amanhã, mas isso não parece estar acontecendo tão cedo.