Você pode definir limites antes de iniciar o processo. Por exemplo, defina o limite de memória virtual (soft) para o shell atual como 1G
ulimit -S 1048576
Você também pode definir esses limites em todo o sistema, por exemplo, eu tenho isso:
-
/etc/security/limits.conf:
* soft as 25165824 * hard as 25165824
-
/etc/systemd/system.conf:
DefaultLimitAS=25769803776
Para limitar todos os processos a 24G nos meus sistemas 32G. Embora dois processos juntos ainda possam causar essa situação de OOM, isso nunca aconteceu na prática.
Em relação a "não responder por muito tempo antes de matar o processo ofensivo":
- Não use uma partição swap, então as coisas serão eliminadas rapidamente.
Note que, na verdade, o malloc (memória virtual) não é o problema real. OOM acontece apenas quando o processo começa a usar essa memória malloc'ed. Infelizmente no Linux você não pode limitar a memória residente. Veja "supercomprometimento de memória":