A razão pela qual o OOM-killer não é chamado automaticamente é, porque o sistema, embora completamente desacelerado e sem resposta já quando próximo a falta de memória y, não atingiu realmente o situação de memória.
simplificado demais, o RAM quase completo contém 3 tipos de dados:
- dados do kernel, isso é essencial
- páginas de dados essenciais do processo (por exemplo, quaisquer dados que o processo criou apenas em memória RAM)
- páginas de dados de processo não essenciais (por exemplo, dados como o código de executáveis, para os quais há uma cópia no disco / no sistema de arquivos e que, embora atualmente mapeados para a memória, podem ser "relidos" do disco no momento do uso )
Em uma situação de falta de memória, o kernel do linux, tanto quanto eu posso dizer, é kswapd0
kernel thread, para evitar perda de dados e perda de funcionalidade, não posso descartar 1. e 2., mas está livre para pelo menos temporariamente remova os dados de arquivos mapeados em memória de ram que são processos de formulário que não estão atualmente em execução.
Embora este seja um comportamento que envolva disco-thrashing , para jogar dados fora constantemente e relê-los disco, pode ser visto como útil, pois evita, ou pelo menos adia, a remoção necessária / morte de um processo e a liberação de sua memória, mas tem um preço alto : desempenho .
[load pages from disk to ram with code of executable of process 1]
[ run process 1 ]
[evict pages with binary of process 1 from ram]
[load pages from disk to ram with code of executable of process 2]
[ run process 2 ]
[evict pages with binary of process 2 from ram]
[load pages from disk to ram with code of executable of process 3]
[ run process 3 ]
[evict pages with binary of process 3 from ram]
....
[load pages from disk to ram with code of executable of process 1]
[ run process 1 ]
[evict pages with binary of process 1 from ram]
é claramente IO caro e o sistema provavelmente não responderá, apesar de tecnicamente ainda não ter esgotado de memória.
De uma perspectiva do usuário, aparentemente, ser travada / congelada e a UI resultante sem resposta pode não ser realmente preferível, simplesmente matando o processo (por exemplo, de uma guia do navegador, cujo uso da memória pode ter sido a causa raiz / culpado para começar.)
É aqui que, como a pergunta indicou, o gatilho Magic SysRq para iniciar a OOM manualmente parece ótimo, como o Magic O SysRq é menos impactado pela falta de resposta do sistema.
Embora possa haver casos de uso em que é importante preservar os custos de todos os processos ( desempenho ), para um desktop, é provável que os usuários preferissem o OOM-killer sobre o congelado UI. Existe um patch que reivindica a isenção de arquivos fs limpos e mapeados da memória em tal situação nesta resposta em stackoverflow .