Comando nice de Linux: asignar la prioridad, cambiarla con renice y medir el reparto de CPU cuando hay competencia

El comando nice de Linux asigna el valor nice (de -20 a 19), que decide cuánta CPU cede un programa a los demás al ejecutarse. En un servidor AlmaLinux 9 se fijaron dos tareas a un solo núcleo de CPU y se midió cambiando el valor nice: el reparto solo se produjo cuando competían por la CPU, y la tarea con nice 19 usó apenas un 1,4 %.
Los procesos que ya están en ejecución se cambian con renice, y ceder el disco le corresponde a ionice. De los tres comandos se muestra tal cual la salida obtenida al ejecutarlos como root y como usuario normal.
1️⃣ Comando nice de Linux: rango de valores y reparto de CPU cuando hay competencia
El valor nice es un número que fija cuánto cede un proceso cuando se reparte el tiempo de CPU, y puede ir de -20 a 19. Los programas suelen ejecutarse con 0; -20 se atiende primero y 19 es el que más cede.
Es fácil pensar que un número mayor se atiende antes, pero con el valor nice es al revés. El planificador de Linux asigna un peso a cada valor nice y reparte el tiempo de CPU en esa proporción: nice 0 pesa 1024, 10 pesa 110 y 19 pesa 15.
Ceder solo ocurre cuando hay competencia por la CPU. Si hay una CPU libre, hasta una tarea con nice 19 se ejecuta sin esperar. Es como los asientos reservados del autobús: si están libres, cualquiera se sienta, y solo se ceden cuando va lleno.
La tabla de pesos es el array [sched_prio_to_weight] del código fuente del kernel de Linux [kernel/sched/core.c], y está pensada para que cada punto que sube el valor nice reduzca el tiempo de CPU en torno a un 10 %.
2️⃣ Uso básico de nice: +10 si se omite el número y valores fuera de rango
Si pones un comando después de nice, ese comando se ejecuta con otro valor nice; si escribes nice solo, muestra el valor nice de la shell actual.
nice0En los ejemplos siguientes, el bash que se lanza muestra su propio valor nice con [ps -o ni=]. Sin -n se suma 10 al valor actual, y con -n 5 se suma 5.
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5Los valores fuera de rango se ajustan al límite sin dar error, así que -n 50 se ejecuta con 19.
nice -n 50 bash -c 'ps -o ni= -p $$' 19Solo root puede adelantar un proceso con un valor negativo. Un usuario normal ve la advertencia [cannot set niceness] y el comando se ejecuta igualmente con nice 0.
# como usuario normal
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# como root
nice -n -5 bash -c 'ps -o ni= -p $$' -5Los procesos hijo que lanza un comando ejecutado con nice también se ejecutan con el mismo valor nice.
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7Por eso, si ejecutas un script con nice, todos los comandos que contiene ceden.
3️⃣ renice: cambiar el valor nice de un proceso en ejecución
nice solo fija el valor al arrancar, así que un proceso que ya está en ejecución se cambia con renice. Primero consulta el PID y el valor actual en la columna NI de top o con ps.
ps -o pid,ni,cmd -p 201643 PID NI CMD
201643 5 sleep 600renice -n 10 -p 201643201643 (process ID) old priority 5, new priority 10Como muestra la salida, renice -n no suma al valor actual sino que lo fija en el valor indicado: el resultado es 10, no 5 + 10 = 15. No es como pulsar ▲ en el mando del aire acondicionado para subir un grado, sino como fijar la temperatura deseada en 24 grados.
La documentación oficial de util-linux también describe -n como un valor absoluto; sumar le corresponde a la opción [--relative] de las versiones nuevas. util-linux 2.37.4, la versión probada, no tenía esta opción.
Un usuario normal solo puede subir el valor de sus propios procesos y, una vez subido, no puede volver a bajarlo.
# como usuario normal
renice -n 10 -p 201649201649 (process ID) old priority 0, new priority 10renice -n 5 -p 201649renice: failed to set priority for 201649 (process ID): Permission deniedroot también puede bajarlo; en la misma prueba cambió 10 directamente a 3.
🔲 Simulador de nice · renice
En el simulador de abajo, conectado como usuario normal, puedes escribir nice y renice tú mismo y ver cómo cambia el valor nice.
4️⃣ Medición del reparto de CPU con competencia: nice 0 vs 0·10·19
Subir el valor nice no siempre hace más lenta la tarea. Su parte solo se reduce cuando compite con otra tarea por la misma CPU.
Se fijaron dos tareas a un solo núcleo de CPU (taskset) y se ejecutó a la vez en ambas el script de abajo, que cuenta de uno en uno durante 5 segundos. Cuanto mayor es la cuenta, más tiempo de CPU usó la tarea.
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nEl script suma 1 a n hasta que pasan 5 segundos y luego muestra el valor final.
Dos tareas con nice 0 se repartieron la CPU a medias, mientras que nice 10 usó cerca del 10 % y nice 19 solo el 1,4 %. Coincide con las proporciones calculadas a partir de los pesos del kernel (1024 : 110 da 90,3 : 9,7, y 1024 : 15 da 98,6 : 1,4).
Ejecutada sola en el mismo núcleo, la tarea con nice 19 contó entre unas 650.000 y 1.140.000 veces en 5 segundos. Sin nadie a quien ceder, incluso nice 19 usa la CPU por completo; la carga del servidor (load average) fue de 3 a 5 durante la prueba.
5️⃣ ionice: ceder el disco y comprobar el planificador
nice solo decide el reparto de CPU, así que las tareas que leen y escriben en disco durante mucho tiempo, como las copias de seguridad, ceden también su turno de disco con ionice. Con -c3 (idle), solo se atienden cuando ningún otro programa usa el disco.
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0Un proceso sin clase asignada aparece como [none]; según la documentación del kernel, se trata como best-effort y su prioridad se calcula a partir del valor nice de CPU.
Las clases de ionice solo tienen efecto si el planificador de disco las admite, y la documentación del kernel cita bfq y mq-deadline como planificadores compatibles. El que aparece entre corchetes es el planificador en uso.
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqEl disco NVMe del servidor de prueba usa [none], así que, según la documentación oficial, ionice puede no tener efecto; el efecto no se midió por separado. El nombre del disco se consulta con lsblk.
6️⃣ Dónde usar nice: copias de seguridad · cron · wp-cli
Añade nice a las tareas largas pero sin prisa. La compresión de copias de seguridad usa CPU y disco a la vez, así que se indican nice e ionice juntos.
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleSi una tarea que ya está en marcha ralentiza el servidor, busca su PID en top y súbele el valor con renice; en las tareas cron que se ejecutan a diario, pon nice delante del comando.
0 3 * * * nice -n 10 /usr/local/bin/backup.shEn un servidor WordPress, si ejecutas tareas grandes de wp-cli como buscar y reemplazar o regenerar imágenes con nice -n 10, cuando la CPU está ocupada la usa primero php-fpm, que atiende las solicitudes de los visitantes.
nice -n 10 wp media regenerate --yesEn cambio, no subas el valor nice de php-fpm ni del propio servidor web. Si los procesos que responden a los visitantes ceden, las páginas tardan más en responder cuando la CPU está ocupada.
🔢 FAQ & contenido recomendado









ℹ️ Aviso de afiliados
El contenido de este sitio incluye enlaces de afiliado. Cuando un visitante compra un producto o servicio a través de uno de ellos, el sitio recibe una comisión del vendedor. El importe que paga el comprador(baja durante las promociones ↓)no aumenta. Los precios, descuentos y existencias publicados corresponden al momento de redacción y pueden variar, así que confírmalos con el vendedor antes de comprar. Los productos se eligen y evalúan con criterios propios, y las comisiones no influyen en el orden ni en el contenido de las reseñas.
