Comando nice di Linux: impostare la priorità, cambiarla con renice e misurare la quota di CPU in competizione

Il comando nice di Linux imposta il valore nice di un programma (da -20 a 19), che decide quanta CPU cede agli altri processi mentre gira. Le misure su un server AlmaLinux 9, con due attività vincolate a un solo core e il valore nice cambiato a ogni prova, hanno mostrato che la CPU veniva divisa solo quando le attività se la contendevano, e l'attività con nice 19 usava solo l'1,4%.
I processi già in esecuzione si cambiano con renice, e ionice si occupa di cedere il passo sul disco. Per tutti e tre i comandi l'output è esattamente quello stampato eseguendoli come root e come utente normale.
1️⃣ Comando nice di Linux: intervallo di valori e quota di CPU in competizione
Il valore nice è un numero che stabilisce quanto un processo cede quando il tempo di CPU viene diviso, e va da -20 a 19. I programmi girano di norma a 0; -20 viene servito per primo e 19 cede di più.
Viene facile pensare che un numero più alto venga servito prima, ma i valori nice funzionano al contrario. Lo scheduler di Linux assegna un peso a ogni valore nice e divide il tempo di CPU in quella proporzione: nice 0 vale 1024, 10 vale 110 e 19 vale 15.
Cedere il passo succede solo quando le attività si contendono la CPU. Se c'è una CPU libera, anche un'attività con nice 19 gira senza aspettare. È come i posti riservati sull'autobus: se sono liberi chiunque si siede, e si cede il posto solo quando l'autobus è pieno.
La tabella dei pesi è l'array [sched_prio_to_weight] nel sorgente del kernel Linux [kernel/sched/core.c], ed è pensata perché ogni aumento di 1 del valore nice riduca il tempo di CPU di circa il 10%.
2️⃣ Uso di base di nice: +10 se manca il numero, e valori fuori intervallo
Metti un comando dopo nice e quel comando gira con un valore nice cambiato; digita nice da solo e stampa il valore nice della shell corrente.
nice0Negli esempi qui sotto la bash avviata stampa il proprio valore nice con [ps -o ni=]. Senza -n al valore corrente si aggiunge 10; con -n 5 si aggiunge 5.
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5I valori fuori intervallo vengono portati al limite senza errore, quindi -n 50 gira a 19.
nice -n 50 bash -c 'ps -o ni= -p $$' 19Solo root può anticipare un processo con un valore negativo. Un utente normale riceve l'avviso [cannot set niceness] e il comando gira comunque a nice 0.
# come utente normale
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# come root
nice -n -5 bash -c 'ps -o ni= -p $$' -5Anche i processi figli avviati da un comando lanciato con nice girano con lo stesso valore nice.
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7Quindi, se esegui uno script con nice, anche ogni comando al suo interno cede il passo.
3️⃣ renice: cambiare il valore nice di un processo in esecuzione
nice imposta il valore solo all'avvio, quindi per un processo già in esecuzione si usa renice. Prima controlla il PID e il valore attuale nella colonna NI di 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 10Come mostra l'output, renice -n non somma al valore attuale ma imposta quello che indichi: il risultato è 10, non 5 + 10 = 15. Non è come premere ▲ sul telecomando del condizionatore per salire di un livello, ma come impostare la temperatura desiderata a 24 gradi.
Anche la documentazione ufficiale di util-linux descrive -n come valore assoluto; la somma la fa l'opzione [--relative] nelle versioni più recenti. util-linux 2.37.4, la versione provata, non aveva questa opzione.
Un utente normale può solo alzare il valore dei propri processi e non può riabbassarlo una volta alzato.
# come utente normale
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 può anche abbassarlo; nella stessa prova ha portato 10 direttamente a 3.
🔲 Simulatore di nice · renice
Nel simulatore qui sotto, connesso come utente normale, puoi digitare nice e renice e vedere cambiare il valore nice.
4️⃣ Misurare la quota di CPU in competizione: nice 0 vs 0·10·19
Alzare il valore nice non rallenta sempre l'attività. La sua quota si riduce solo quando si contende la stessa CPU con un'altra attività.
Due attività sono state vincolate a un solo core (taskset), e lo script qui sotto, che conta di uno in uno per 5 secondi, è stato eseguito in entrambe nello stesso momento. Più alto il conteggio, più tempo di CPU ha usato l'attività.
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nLo script aumenta n di 1 finché non passano 5 secondi, poi stampa il valore finale.
Due attività nice 0 si sono divise a metà, mentre nice 10 ha usato circa il 10% e nice 19 solo l'1,4%. Coincide con le proporzioni calcolate dai pesi del kernel (1024 : 110 dà 90,3 : 9,7 e 1024 : 15 dà 98,6 : 1,4).
Eseguita da sola sullo stesso core, l'attività con nice 19 ha contato circa da 650.000 a 1.140.000 volte in 5 secondi. Senza nessuno a cui cedere, anche nice 19 usa la CPU per intero; il carico del server (load average) durante la prova era tra 3 e 5.
5️⃣ ionice: cedere il passo sull'I/O del disco e controllare lo scheduler
nice decide solo la quota di CPU, quindi per attività che leggono e scrivono a lungo sul disco, come i backup, usa ionice per cedere il passo anche nell'ordine del disco. Con -c3 (idle) un'attività viene servita solo quando nessun altro programma usa il disco.
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0Un processo senza classe impostata compare come [none]; secondo la documentazione del kernel è trattato come best-effort, con la priorità calcolata dal valore nice della CPU.
Le classi di ionice hanno effetto solo se lo scheduler del disco le supporta, e la documentazione del kernel indica bfq e mq-deadline come scheduler compatibili. Quello tra parentesi quadre è lo scheduler in uso ora.
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqIl disco NVMe del server di prova usa [none], quindi secondo la documentazione ufficiale ionice potrebbe non avere effetto; l'effetto non è stato misurato a parte. Controlla il nome del disco con lsblk.
6️⃣ Dove usare nice: backup · cron · wp-cli
Aggiungi nice alle attività lunghe ma non urgenti. La compressione dei backup usa sia CPU sia disco, quindi imposta insieme nice e ionice.
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleSe un'attività già in esecuzione rallenta il server, trova il PID in top e alza il valore con renice; per i job cron giornalieri metti nice davanti al comando.
0 3 * * * nice -n 10 /usr/local/bin/backup.shSu un server WordPress, se esegui grandi lavori wp-cli come search-replace o la rigenerazione delle immagini con nice -n 10, php-fpm, che gestisce le richieste dei visitatori, ottiene per primo la CPU quando è occupata.
nice -n 10 wp media regenerate --yesAl contrario, non alzare il valore nice di php-fpm o del server web stesso. Se i processi che rispondono ai visitatori cedono il passo, le pagine rispondono più lentamente quando la CPU è occupata.
🔢 FAQ & contenuti consigliati









ℹ️ Informativa sull'affiliazione
I contenuti di questo sito includono link di affiliazione. Se un visitatore acquista un prodotto o un servizio tramite uno di questi link, il sito riceve una commissione dal venditore. In questo processo l'importo pagato dall'acquirente (durante le promozioni l'importo scende↓) non aumenta. Prezzi, sconti e disponibilità indicati si riferiscono al momento della stesura e possono differire da quelli reali: prima di acquistare verifica sempre presso il venditore. I prodotti vengono scelti e valutati secondo criteri propri, e le commissioni non influiscono sull'ordine di presentazione né sul contenuto delle valutazioni.
