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, presiona r, escribe el PID y luego el nuevo valor.
  • En htop, selecciona el proceso con las flechas y presiona F8 para subir el niceness (menor prioridad) o F7 para 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.