La mayoría de los kernel precompilados que vienen en las distintas distribuciones de Linux, viene habilitada la función de Magic SysRq, con ello podremos ejecutar distintas acciones cuando se requiera.
Una de ellas, consiste en matar uno de los procesos actuales, con la siguiente secuencia de teclas: ALT+ Pet Sis + F
El algoritmo que sigue para la elección de dicho proceso está basado en la “puntuación” que obtenga, a mayor puntuación mayor es la posiblidad de ser uno de los procesos elegidos.Todo esto se puede configurar en:
/proc/PID/oom_adj y /proc/PID/oom_score
Si necesitamos que un proceso no pueda ser elegido por el OOM_killer, bastaría con asignarle el valor -17 ( Disable) , tal que así:
echo “-17″ > /proc/PID/oom_adj
Los valores que se pueden asignar van desde -17 a 16,
Por defecto, todos los procesos tienen un valor de de ajuste de 0 Muchos os preguntareis para que sirve /proc/PID/oom_score, por cierto, este no se puede modificar.La respuesta es muy sencilla, el algoritmo de elección tiene en cuenta los valores de ajuste en /proc/PID/oom_adj, en función de este valor, y teniendo en cuenta factores como el tiempo que lleva funcionando, si accede al hardware, si es un proceso iniciado como root, tiempo de CPU….el algoritmo da una puntua al proceso en cuestión.Para los más puristas, el algoritmo hace lo siguiente:
1.- Score= Num_bytes_total SQRT cpu_time
2.- Score= Score SQRT run_time_seconds
3.- Score= Score * 2
4.- Si el owner del proceso es root -> Score = Score / 4
5.- Si el proceso está accediendo al hardware -> Score = Score / 4
6.- Si el proceso forma parte de una arquitectura SMP -> Score = Score / 8
7.- Score= Score ^ oom_adj
Otro dato a tener en cuenta, es que si el kernel está compilado con soporte OOM, OOM_killler estará siempre operativo por lo que cuando detecte algún proceso esté consumiendo demasiados recursos (puntuación alta), lo eliminará de manera automática.
Actualización: Si por curiosidad, quieres obtener las puntuaciones de todos los procesos en ejecución:
#!/bin/bash
for file in /proc/[0-9]*/oom_score; do
pid=$(echo $file | sed ’s/^[^0-9]*\([0-9]\+\).*$/\1/’);
echo ”$(cat $file) $(ps h -p $pid -ocmd)”;
done | sort -n
