Portál AbcLinuxu, 26. dubna 2024 20:10

Unixové nástroje – 22 (taskset, ionice, chrt)

2. 5. 2012 | Luboš Doležel
Články - Unixové nástroje – 22 (taskset, ionice, chrt)  

Tentokrát se podíváme na méně obvyklé nástroje z balíčku schedutils.

Obsah

taskset

link

Prvním nástrojem je taskset, který dokáže omezit běh procesu na vybrané procesory. Považuji jej za nástroj, který v ideálním případě není nikdy zapotřebí, protože jím zpravidla řešíme nějakou překážku nebo problém. Mně osobně slouží ke zkrocení programu, který „záhadně“ funguje bez problémů na jednojádrovém CPU, ale na SMP systému vykazuje zvláštní chyby. Mimo to – což je pro mě informace z doslechu – se může hodit například při provozu databázového serveru Oracle, pokud máte licenci na méně procesorů, než máte v systému.

Obecně ale nemá smysl snažit se docílit méně migrací procesu na jiné CPU pomocí taskset – plánovač Linuxu tak jako tak dělá vše pro to, aby se tak nedělo.

Způsoby použití jsou dva: spouštění procesu s daným nastavením a změna (případně zjištění) nastavení existujícího procesu. V obou případech se zadává seznam povolených procesorů, tedy procesorů, na kterých program může (ale nemusí) běžet. A způsoby, jak povolené procesory vyjádřit, jsou dva. Pro fajnšmekry jsou tu hrátky s jedničkami a nulami, tedy nastavení masky, pro línější je tu výřečnější forma vypsání povolených procesorů.

Chceme-li spustit program pouze na prvním a třetím procesoru, můžeme tak učinit následovně:

# 'program argument' je příklad programu

# Za použití masky:
# číslo 0x5 = nastaven první a třetí bit
taskset 0x5 program argument

# To samé za použití výčtu procesorů:
# CPU se indexují od nuly
taskset -c 0,2 program argument

Ve výčtu je možné určit i neexistující procesory, pokud ale ani jeden povolený procesor nebude platný, obdržíme chybu. Výčet je možné zapsat i rozsahem (např. 0-5).

Potřebujeme-li trochu přidusit existující proces, pomůže nám přepínač -p, pomocí kterého určíme PID procesu.

program &
pid=$!

taskset -p 0x5 $pid

Povšimněte si zápisu, kdy nedáváme PID za parametr -p, ale nejdříve určíme masku. A pokud masku neurčíme, ale jen zadáme PID, dostaneme informaci o aktuálním nastavení pro proces. Nastavení se při forkování dědí.

# Zjistíme nastavení procesu init
$ taskset -p 1
pid 1's current affinity mask: 3

# 3 = povolen první a druhý procesor (spuštěno na CPU se dvěma jádry)

ionice

link

ionice je blízký příbuzný příkazů nice a renice (díl 18), jen se zde nestanovuje priorita při přidělování procesorového času, nýbrž při I/O (tedy čtení a zápisu dat na disky). I/O niceness (priorita) je na současných jádrech ve výchozím stavu odvozována od CPU niceness – pokud tedy potřebujeme zajistit, že něco „proběhne rozumně rychle“, stačí ve většině situací použít jen nice/renice. To nám ale nebrání v tom podívat se i na ionice a poladit si to ručně.

Procesy mohou spadat do tří tříd priority:

V případě tříd běžné priority a reálného času existuje ještě 8 podskupin (hodnoty 0 až 7), které určují prioritu v rámci dané třídy. Nula znamená nejvyšší priorita.

Příklad: potřebujeme udělat nějakou zálohu, ale nechceme, aby měla dopad na ostatní procesy:

# Třídu určíme přepínačem -c
ionice -c 3 rsync ...

Příklad: velmi urgentně potřebujeme vytvořit kopii souboru na zatíženém systému:

# Prioritu v rámci skupiny nastavíme přepínačem -n
ionice -c 1 -n 0 cp /a/soubor.bin /b/

ionice má ještě dva další přepínače. Prvním je -p, pomocí kterého můžeme určit PID existujícího procesu. Druhým je pak -t, který zajistí ignorování chyby, pokud nelze prioritu nastavit z důvodu příliš starého jádra nebo chybějících práv.

chrt

link

chrt je nástroj pro nastavení priority procesoru, co se procesorového času týče. Od známého nice/renice se liší tím, že zařazuje procesy do zvláštních tříd. Těchto tříd máme několik (přesné informace o nich v man sched_setscheduler):

U realtime tříd se je možné přes chrt nastavit prioritu v rámci dané třídy a na Linuxu může tato priorita nabývat hodnot od 1 do 99 (nejnižší až nejvyšší). U tříd SCHED_OTHER a SCHED_BATCH k nastavení priority slouží nice/renice. Takto spustíme proces s nejvyšší možnou prioritou:

# Třída FIFO, priorita v rámci třídy 99
chrt -f 99 program argument

Takto změníme třídu vybraného existujícího procesu na minimální možnou:

chrt -i -p $pid

Můžeme si například zobrazit prioritu jaderného vlákna migration/0:

$ chrt -p $(pgrep migration/0)
pid 6's current scheduling policy: SCHED_FIFO
pid 6's current scheduling priority: 99

To je pro tentokrát vše.

Seriál Unixové nástroje (dílů: 27)

První díl: Unixové nástroje – 1 (úvod, cat, head, tail), poslední díl: Unixové nástroje – 26 (triky pro práci v Bashi).
Předchozí díl: Unixové nástroje – 21 (awk)
Následující díl: Unixové nástroje – 23 (chattr, setfattr)

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.