Este artículo fue publicado originalmente en go2linux.org. El dominio ya no me pertenece, pero soy el autor original. Lo republico aquí en garron.me con correcciones y mejoras. Reúne en uno solo varios artículos cortos sobre nice y renice.
Estás trabajando normalmente, arranca una tarea de cron o una compilación larga, y todo lo demás se pone lento. Puedes evitarlo diciéndole al kernel qué procesos importan menos. nice inicia un comando con una prioridad distinta, y renice cambia la prioridad de un proceso que ya está en ejecución.
Niceness
Cada proceso tiene un valor de niceness ("amabilidad") de -20 a 19:
- -20 es la prioridad más alta (el menos "amable" con los demás procesos).
- 0 es el valor predeterminado.
- 19 es la prioridad más baja.
El niceness solo importa cuando los procesos compiten por la CPU. En un equipo sin carga, un proceso con niceness 19 corre a toda velocidad. Cuando la CPU está ocupada, un niceness más alto significa una porción menor de ella. Es un peso, no un límite: un proceso con nice nunca se detiene por completo, y tampoco tiene un tope de CPU que pueda usar.
Iniciar un comando con nice
Sin opciones, nice suma 10 al niceness:
nice make all
Elige el valor con -n:
nice -n 19 tar czf respaldo.tar.gz /home
El número se suma al niceness del shell que inicia el comando, que normalmente es 0. Ejecuta nice sin argumentos para ver el valor actual:
nice
0
Un valor negativo sube la prioridad, y solo root puede hacerlo:
sudo nice -n -5 ./codificador-tiempo-real
Cambiar un proceso en ejecución con renice
Busca el ID del proceso con pgrep, ps o top, y luego:
renice -n 10 -p 1234
1234 (process ID) old priority 0, new priority 10
A diferencia de nice, el número que recibe renice es el nuevo niceness, no un incremento.
Varios procesos a la vez:
renice -n 10 -p 1234 5678
Todos los procesos de un programa, usando pgrep para obtener los IDs:
renice -n 15 -p $(pgrep ffmpeg)
Todos los procesos de un usuario:
sudo renice -n 5 -u backup
Todos los procesos de un grupo de procesos, con -g:
renice -n 10 -g 4321
Los tutoriales antiguos, incluida la versión original de este artículo, usan la forma renice +1 987. Todavía funciona, pero -n y -p son más claros.
Qué puede hacer un usuario normal
- Subir el niceness (bajar la prioridad) de sus propios procesos.
- Nada más.
Un usuario normal no puede asignar un niceness negativo, no puede tocar los procesos de otros usuarios, y no puede volver a bajar el niceness después de subirlo, ni siquiera al valor original:
renice -n 10 -p 1234 # funciona
renice -n 0 -p 1234 # Permission denied
Usa sudo para eso. Un administrador puede permitir que un usuario o grupo baje hasta cierto niceness con el elemento nice en /etc/security/limits.conf.
Ver el niceness de un proceso
Con ps:
ps -o pid,ni,comm -p 1234
PID NI COMMAND
1234 10 tar
En top y htop es la columna NI. Ambos pueden cambiarlo de forma interactiva:
- En
top, presionar, escribe el PID y luego el nuevo valor. - En htop, selecciona el proceso con las flechas y presiona
F8para subir el niceness (menor prioridad) oF7para reducirlo (mayor prioridad, solo root).
Prioridad de disco: ionice
nice solo afecta la planificación de CPU. Un respaldo con niceness 19 todavía puede volver lento el equipo al saturar el disco. ionice establece la prioridad de E/S:
ionice -c 3 tar czf respaldo.tar.gz /home
La clase 3 es "idle": el proceso recibe tiempo de disco solo cuando nadie más lo quiere. Combina ambos para trabajos en segundo plano:
nice -n 19 ionice -c 3 tar czf respaldo.tar.gz /home
Cambia un proceso en ejecución con -p:
ionice -c 3 -p 1234
ionice solo es respetado por los planificadores de E/S que implementan prioridades, como BFQ. Con none o mq-deadline, comunes en discos NVMe, tiene poco o ningún efecto. Revisa el planificador en uso con:
cat /sys/block/sda/queue/scheduler
Ejemplos prácticos
Un respaldo nocturno desde cron que no molesta al resto del sistema:
0 3 * * * nice -n 19 ionice -c 3 /usr/local/bin/respaldo.sh
Compilar usando todos los núcleos sin estorbar:
nice -n 15 make -j"$(nproc)"
Calmar un proceso que ya está acaparando la CPU:
renice -n 19 -p $(pgrep -f "convertir-videos.sh")
Para un servicio de systemd, configúralo en el archivo de la unidad en lugar de envolver el comando:
[Service]
Nice=10
IOSchedulingClass=idle
Ver también
man nice, man renice y man ionice — referencia completa.