Eu tenho experimentado com echo 1 | sudo tee /proc/sys/vm/oom_kill_allocating_task
, mas ainda demora alguns minutos antes de realmente matar o programa problemático. Nos meus testes earlyoom
é o melhor para este caso, para instalá-lo, basta digitar:
yaourt --needed --noconfirm -S --force earlyoom
sudo cp /usr/bin/earlyoom /usr/local/bin/
sudo systemctl enable earlyoom
sudo systemctl start earlyoom
Agora tente compilar e executar este programa novamente:
echo '
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char** argv) {
int max = -1;
int mb = 0;
char* buffer;
if(argc > 1) max = atoi(argv[1]);
while((buffer=malloc(1024*1024)) != NULL && mb != max) {
memset(buffer,0,1024*1024);
printf("Allocated %d MB\n", ++mb);
}
return 0;
}
' > munch.c && gcc -O2 -o munch munch.c
./munch
Isso daria uma saída assim:
Allocated 1 MB
Allocated 2 MB
Allocated 3 MB
...
Allocated 4367 MB
Allocated 4368 MB
Allocated 4369 MB
Killed
O programa com maior uso de memória agora é eliminado automaticamente e seu sistema sempre será responsivo. Para ver o registro em tempo real do tipo de serviço journalctl -f -u earlyoom
, seria mostrado algo assim:
-- Logs begin at Mon 2014-11-03 10:54:39 WIB. --
Feb 20 13:25:25 s497 earlyoom[20041]: earlyoom v0.3-15-g528196e
Feb 20 13:25:25 s497 earlyoom[20041]: total: 7800 MiB
Feb 20 13:25:25 s497 earlyoom[20041]: min: 780 MiB
Feb 20 13:25:25 s497 earlyoom[20041]: avail: 4963 MiB
Feb 20 13:33:10 s497 earlyoom[20041]: Out of memory! avail: 519 MiB < min: 780 MiB
Feb 20 13:33:10 s497 earlyoom[20041]: Killing process 24984 (munch)
pressione Ctrl+C
para fechar esse comando.