En este artículo vamos a ver cómo administrar las prioridades de ejecución de procesos en Linux. También, veremos brevemente el programador o planificador de procesos del kernel (también conocido como kernel scheduler o process scheduler) y aprenderemos a cómo lanzar y cambiar la prioridad de los procesos.
Qué es el kernel scheduler de Linux
Linux, como la mayoría de sistemas operativos modernos, puede ejecutar múltiples procesos. Esto lo hace compartiendo la CPU y otros recursos entre los procesos.
El kernel scheduler o planificador de procesos es la parte del kernel de Linux que se encarga de ir ordenando los procesos (planificándolos) para ver cuáles son los procesos que deben ejecutarse a continuación. De esta manera distribuye el tiempo de ejecución del procesador entre los diferentes procesos.
Como veremos a continuación, clasifica los procesos en función de los más necesarios (prioridad), aunque también tiene en cuenta otros parámetros.
La prioridad de procesos en Linux
En Linux hay un total de 140 valores de prioridades, aunque se dividen en dos rangos o tipos de prioridad distintos:
- El primero es parámetro de nice, también conocido como nivel de cortesía, que va de -20 (valor de prioridad más alta) a 19 (valor de prioridad más baja). El valor predeterminado es 0.
- La otra, es la prioridad en tiempo real, que oscila entre 1 y 99
Cómo comprobar la prioridad de los procesos
Como para casi todo en Linux, tenemos distintos comandos para poder conocer los valores de prioridad de los procesos que están ejecutándose. En este caso, vamos a utilizar ps, top y htop.
Con ps:
También podemos ver los valores de nice con top y htop:
Diferencia entre PR o PRI y NI
Vamos a ver qué significa cada cosa:
- NI: es el valor de amabilidad o cortesía (nice) que hemos visto antes, a nivel del espacio de usuario (user-space)
- PR o PRI: es la prioridad real del proceso, a nivel del kernel de Linux.
Cómo ejecutar un comando con prioridad de ejecución determinada (comando nice)
Vamos a ver cómo lanzar procesos o comandos con una prioridad determinada.
Para ello se usa el comando nice, que tiene las siguientes sintaxis:
A mi la forma que más fácil me resulta es la primera, por ejemplo si quiero lanzar un script con poca prioridad (alto valor de cortesía) lanzaría:
Hay que tener en cuenta que:
- Sin lanzamos un comando normal, sin nice, la prioridad por defecto es de 0.
- Si lanzamos un comando con nice, pero no le damos ningún valor, la prioridad por defecto es de 10.
- Solo el usuario root puede ejecutar un comando con una prioridad mayor (menor amabilidad) que 0.
Cómo cambiar la prioridad de un comando en ejecución (comando renice)
Una característica importante de Linux es la programación dinámica basada en prioridades, que permite que el valor nice se modifique (aumente o disminuya) según sus necesidades, para ello usaremos el comando renice (con la misma sintaxis que nice aunque apuntando al PID del proceso).
Por ejemplo:
Si te encuentras muy a menudo utilizando los comando nice y renice, es posible que te venga bien cambiar los valores por defecto de la prioridad para un usuario en particular. Para ello dirígete al fichero /etc/security/limits.conf y fija los nuevos valores según la sintaxis: