Jak nastavit priority procesů S nice and renice na Linuxu
Příkazy nice a renice představují nástroje pro jemné ladění chování jádra operačního systému při správě spuštěných procesů. Umožňují vám upravovat priority procesů a ovlivňovat tak jejich přidělování systémových zdrojů. V tomto článku se dozvíte, jak tyto příkazy využívat v operačních systémech Linux a jemu podobných, jako je macOS.
Základní princip: Procesy a jejich správa
Ve vašem počítači s Linuxem či Unixem běží mnoho procesů ještě před spuštěním vámi zvolené aplikace. Většina z nich jsou klíčové součásti systému nebo podpůrné procesy pro grafické prostředí. Systém neustále pracuje na pozadí a má k dispozici omezené množství systémových prostředků a času procesoru. Jádro Linuxu hraje roli koordinátora těchto procesů.
Jádro rozhoduje o tom, které procesy získají aktuálně prioritu a které musí počkat. Neustále analyzuje a žongluje s prioritami, aby zajistilo plynulý chod počítače a spravedlivé přidělení systémových prostředků. Některé procesy jsou pro správnou funkci systému klíčové a mají prioritu před ostatními, jako například před webovým prohlížečem.
Co je to "nice" hodnota?
Jedním z klíčových kritérií, podle kterých jádro rozhoduje o prioritě procesu, je tzv. "nice" hodnota. Každý proces má přidělenu tuto hodnotu, která se pohybuje v rozmezí od -19 do 20. Standardně jsou všechny procesy spouštěny s "nice" hodnotou 0.
Platí, že čím vyšší je "nice" hodnota, tím "ohleduplnější" je daný proces k ostatním. Jádru sděluje, že proces klidně počká. Naopak, záporná "nice" hodnota značí sobeckost procesu, který se snaží získat co nejvíce procesorového času bez ohledu na ostatní běžící procesy.
Příkaz nice slouží k nastavení "nice" hodnoty při spouštění procesu, zatímco renice umožňuje upravit tuto hodnotu u již spuštěného procesu. Další informace naleznete v manuálových stránkách: nice a renice.
Příkaz nice v praxi
Příkaz nice umožňuje ovlivnit prioritu procesu při jeho spuštění, čímž můžeme zvýšit nebo snížit jeho nároky na systémové zdroje ve srovnání s ostatními procesy.
Představme si situaci, kdy programátor vytvořil program s názvem ackermann, který počítá Ackermannovy funkce. Tento výpočet je náročný na procesor a paměť. Programátor by mohl program spustit pomocí příkazu:
./ackermann
Pro monitorování spuštěných procesů a jejich priorit můžeme použít příkaz top:
top

Informace o procesu ackermann najdeme v horní části výpisu. Sloupec "NI" udává "nice" hodnotu, která je standardně nastavena na 0.
Nyní zkusíme proces spustit znovu, ale tentokrát mu nastavíme nižší prioritu. Použijeme příkaz nice s "nice" hodnotou 15. Příkaz má následující syntaxi: nice -[hodnota] [příkaz], kde [hodnota] je nová "nice" hodnota a [příkaz] je spouštěný program. V našem příkladě:
nice -15 ./ackermann

Pozor, -15 zde neznamená zápornou hodnotu -15, ale kladnou 15. Znak - je použit pro signalizaci parametru. Pro nastavení záporné "nice" hodnoty je potřeba použít dva znaky -.
Spuštěním příkazu top znovu uvidíme změnu v chování procesu ackermann:
top

S "nice" hodnotou 15 proces ackermann již nespotřebovává tolik procesorového času. Procesy jako GNOME a Rhythmbox nyní využívají více zdrojů, čímž se dosáhlo snížení priority procesu ackermann.
Nyní si ukážeme opačný případ, kdy procesu ackermann přiřadíme zápornou "nice" hodnotu. Všimněte si použití dvou znaků -. Pro nastavení procesu s vyšší prioritou (nižší "nice" hodnota) je potřeba použít sudo. Každý uživatel si může nastavit nižší prioritu procesu, ale vyšší prioritu může nastavit pouze administrátor (root):
sudo nice --10 ./ackermann

Opětovným spuštěním příkazu top můžeme pozorovat změnu:
top

Proces ackermann má nyní "nice" hodnotu -10 a opět se nachází na vrcholu seznamu spotřeby procesorového času.
Příkaz renice - úprava priority běžících procesů
Příkaz renice nám umožňuje měnit "nice" hodnotu u již spuštěných procesů bez nutnosti je zastavovat a restartovat. Nová hodnota se nastaví za běhu.
renice přijímá jako parametr ID procesu (PID). PID můžeme získat ze sloupce "PID" v příkazu top, nebo pomocí ps a grep. Níže je uveden příklad vyhledání PID procesu ackermann spuštěného uživatelem dave:
ps -eu dave | grep ackermann

Nyní, když máme PID, můžeme ho použít s renice. V následujícím příkladu nastavíme procesu ackermann novou "nice" hodnotu 5:
sudo renice -n 5 2339

Příkaz renice nám potvrdí změnu "nice" hodnoty a ukáže původní i novou hodnotu.
Jádro obvykle spravuje priority procesů velmi efektivně. Pokud ale spouštíte dlouhý proces, který je náročný na CPU a nezáleží vám na tom, kdy skončí, může být pro plynulý chod celého systému přínosné, pokud tomuto procesu nastavíte vyšší "nice" hodnotu. Tím se zlepší uživatelský komfort a celková odezva systému.