Polecenie nice w Linuksie: ustawianie priorytetu, zmiana przez renice i pomiar udziału CPU przy rywalizacji
Polecenie nice w Linuksie ustawia wartość nice programu (od -20 do 19), która decyduje, ile CPU oddaje on innym procesom podczas działania. Pomiary na serwerze AlmaLinux 9, z dwoma zadaniami przypiętymi do jednego rdzenia i zmienianą wartością nice, pokazały, że CPU dzieli się tylko wtedy, gdy zadania o nie rywalizują, a zadanie z nice 19 zużyło zaledwie 1,4%.
Już działające procesy zmienia się przez renice, a ustępowanie po stronie dysku zapewnia ionice. Dla wszystkich trzech poleceń podano wynik dokładnie taki, jaki wypisały na koncie root i zwykłym.
1️⃣ Polecenie nice w Linuksie: zakres wartości i udział w CPU przy rywalizacji
Wartość nice to liczba określająca, ile proces ustępuje przy podziale czasu CPU; można ją ustawić od -20 do 19. Programy zwykle działają z 0; -20 jest obsługiwane najpierw, a 19 ustępuje najbardziej.
Łatwo założyć, że większa liczba oznacza pierwszeństwo, ale wartości nice działają odwrotnie. Harmonogram Linuksa przypisuje każdej wartości nice wagę i dzieli czas CPU w tej proporcji: nice 0 to 1024, 10 to 110, a 19 to 15.
Ustępowanie zachodzi tylko wtedy, gdy zadania rywalizują o CPU. Jeśli jest wolny procesor, nawet zadanie z nice 19 działa bez czekania. To jak miejsca uprzywilejowane w autobusie: gdy są wolne, każdy siada, a ustępuje się tylko w tłoku.
Tabela wag to tablica [sched_prio_to_weight] w źródłach jądra Linuksa [kernel/sched/core.c]; ułożono ją tak, by każdy wzrost nice o 1 zmniejszał czas CPU o około 10%.
2️⃣ Podstawy nice: +10 bez liczby i wartości spoza zakresu
Dodaj polecenie po nice, a uruchomi się ze zmienioną wartością nice; samo nice wypisuje wartość nice bieżącej powłoki.
nice0W przykładach poniżej uruchomiony bash wypisuje własną wartość nice przez [ps -o ni=]. Bez -n do bieżącej wartości dodaje się 10, a z -n 5 dodaje się 5.
nice bash -c 'ps -o ni= -p $$' 10nice -n 5 bash -c 'ps -o ni= -p $$' 5Wartości spoza zakresu są bez błędu przycinane do granicy, więc -n 50 działa z 19.
nice -n 50 bash -c 'ps -o ni= -p $$' 19Tylko root może przyspieszyć proces wartością ujemną. Zwykły użytkownik dostaje ostrzeżenie [cannot set niceness], a polecenie i tak działa z nice 0.
# jako zwykły użytkownik
nice -n -5 bash -c 'ps -o ni= -p $$'nice: cannot set niceness: Permission denied
0# jako root
nice -n -5 bash -c 'ps -o ni= -p $$' -5Procesy potomne uruchamiane przez polecenie pod nice też działają z tą samą wartością nice.
nice -n 7 bash -c 'sleep 1 & ps -o ni= -p $!' 7Dlatego gdy uruchomisz skrypt przez nice, ustępuje też każde polecenie w środku.
3️⃣ renice: zmiana wartości nice działającego procesu
nice ustawia wartość tylko przy starcie, więc dla działającego procesu używa się renice. Najpierw sprawdź PID i bieżącą wartość w kolumnie NI w top albo przez 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 10Jak widać w wyniku, renice -n nie dodaje do bieżącej wartości, lecz ustawia podaną: wynik to 10, a nie 5 + 10 = 15. To nie jak naciśnięcie ▲ na pilocie klimatyzatora o jeden stopień, tylko jak ustawienie docelowej temperatury na 24 stopnie.
Oficjalna dokumentacja util-linux też opisuje -n jako wartość bezwzględną; dodawanie obsługuje w nowszych wersjach opcja [--relative]. Testowany util-linux 2.37.4 tej opcji nie miał.
Zwykły użytkownik może tylko podnosić wartość własnych procesów i nie może jej z powrotem obniżyć.
# jako zwykły użytkownik
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 może ją też obniżyć; w tym samym teście zmienił 10 od razu na 3.
🔲 Symulator nice · renice
W symulatorze poniżej, zalogowanym jako zwykły użytkownik, sam wpiszesz nice i renice i zobaczysz zmianę wartości nice.
4️⃣ Pomiar udziału w CPU przy rywalizacji: nice 0 vs 0·10·19
Podniesienie wartości nice nie zawsze spowalnia zadanie. Jego udział maleje tylko wtedy, gdy rywalizuje z innym zadaniem o ten sam CPU.
Dwa zadania przypięto do jednego rdzenia CPU (taskset), a poniższy skrypt, który przez 5 sekund liczy po jednym, uruchomiono w obu jednocześnie. Im większa liczba, tym więcej czasu CPU zużyło zadanie.
#!/bin/bash
end=$((SECONDS+5)); n=0
while [ $SECONDS -lt $end ]; do n=$((n+1)); done
echo $nSkrypt zwiększa n o 1, aż minie 5 sekund, a potem wypisuje końcową wartość.
Dwa zadania nice 0 podzieliły się po połowie, nice 10 zużyło około 10%, a nice 19 tylko 1,4%. To zgadza się z proporcjami wyliczonymi z wag jądra (1024 : 110 daje 90,3 : 9,7, a 1024 : 15 daje 98,6 : 1,4).
Uruchomione samo na tym samym rdzeniu zadanie z nice 19 doliczyło w 5 sekund do około 650 000–1 140 000. Bez nikogo, komu trzeba ustąpić, nawet nice 19 w pełni korzysta z CPU; obciążenie serwera (load average) w czasie testu wynosiło 3–5.
5️⃣ ionice: ustępowanie przy I/O dysku i sprawdzanie harmonogramu
nice ustala tylko udział w CPU, więc przy zadaniach długo czytających i zapisujących dysk, jak kopie zapasowe, ustąp też kolejności dysku przez ionice. Z -c3 (idle) zadanie jest obsługiwane tylko wtedy, gdy żaden inny program nie używa dysku.
ionice -c3 bash -c 'ionice -p $$'idleionice -p $$none: prio 0Proces bez ustawionej klasy jest pokazywany jako [none]; według dokumentacji jądra traktuje się go jako best-effort, a priorytet wylicza się z wartości nice CPU.
Klasy ionice działają tylko, gdy harmonogram dysku je obsługuje; dokumentacja jądra wymienia bfq i mq-deadline jako obsługujące. Ten w nawiasach kwadratowych jest obecnie używany.
cat /sys/block/nvme0n1/queue/scheduler[none] mq-deadline kyber bfqDysk NVMe na serwerze testowym używa [none], więc według oficjalnej dokumentacji ionice może tam nie działać; efektu nie mierzono osobno. Nazwę dysku sprawdzisz przez lsblk.
6️⃣ Gdzie używać nice: kopie zapasowe · cron · wp-cli
Dodawaj nice do zadań długich, ale niepilnych. Kompresja kopii zapasowej używa CPU i dysku, więc ustaw razem nice i ionice.
nice -n 19 ionice -c3 tar czf backup.tgz /home/exampleJeśli działające zadanie spowalnia serwer, znajdź PID w top i podnieś wartość przez renice; w codziennych zadaniach cron dopisz nice przed poleceniem.
0 3 * * * nice -n 10 /usr/local/bin/backup.shNa serwerze WordPress, gdy duże zadania wp-cli, jak search-replace czy ponowne generowanie obrazów, uruchomisz z nice -n 10, php-fpm obsługujący odwiedzających dostanie CPU jako pierwszy, gdy jest zajęty.
nice -n 10 wp media regenerate --yesNatomiast nie podnoś wartości nice php-fpm ani samego serwera WWW. Jeśli procesy odpowiadające odwiedzającym będą ustępować, strony odpowiedzą wolniej przy zajętym CPU.
🔢 FAQ & polecane treści









ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.
