Tech Life

Ilustrační obrázek

Procesy, thready a jejich plánování v Linuxu

22. 04. 2010 09:15    kategorie: Tech Life    autor: PMe    komentářů: 1

Pro optimalizaci výkonu aplikací provozovaných na linuxovém systému by administrátor měl znát jak Linux pracuje s thready a procesy, jak může výkon ovlivnit specifické nastavení afinity nebo jaký vliv má změna scheduleru na provozované aplikace.
 

Procesy, thready a tasky

Nejprve si je nutné uvědomit co je proces a co je thread a jaké jsou jejich vlastnosti. Proces je objekt, který pracuje podle kódu programu, využívá přidělené resourcy a využívá služeb jádra, tedy zjednodušeně běžící program. Každý proces je identifikován pomocí PID (process id) a rodičovská závislost je mezi nimi zaznamenána pomocí PPID (process parent  id). Thread (vlákno) je objekt pracující podle kódu programu, který se odlišuje od procesu tím, že sdílí přidělené prostředky s ostatními vlákny v procesu. Thread je identifikován pomocí TID (thread ID) a narozdíl od procesu mezi nimi neexistuje vztah rodiče a potomka. Všechny thready jsou vždy součástí jednoho poolu bez ohledu na to odkud jsou vytvářeny.
V userspacu jsou procesy a thready odlišné objekty avšak jádro s nimi pracuje na stejné úrovni, proto procesy i thready jsou na úrovni jádra pojmenovány jako tasky.

Afinita
Afinita je schopnost jádra přiřadit tasku procesor. Základní principem je to, že task by měl vždy zůstat na procesoru, na kterém byl dříve vykonáván. To plyne z následujících výhod:

  • změna kontextu je velmi náročná operace na většině architektur, tudíž je vhodné ponechávat thready pokud možno na stejném procesoru
  • pokud thread na daném procesoru již běžel je pravděpodobné, že v cache paměti procesoru zůstala některá jeho data, čím lze optimalizovat výkon cache pamětí (hit rate)
  • pokud je aplikace multithreadová je vhodné ponechat thready stejného procesu na stejném procesoru opět z důvodu optimalizace výkonu cache pamětí
  • v případě real-time aplikací je vhodné držet proces na dedikovaných procesorech a osatní běžící procesy přiřadit zbývajícím procesorům

Toto chování se nazývá měkká afinita (soft affinity) a je řízena task schedulerem jádra. V případě, že bychom chtěli toto chování změnit je možné se přiklonit k tzv. tvrdé afinitě (hard affinity). Změna afinity je popsána později.

Změna kontextu
Změna kontextu (context switching) je proces, při kterém dochází ke změně vykonávaného tasku za jiný. Tato operace je na většině architektur velmi časově náročná a proto je vhodné se jí co nevíce vyhýbat. Změna kontextu obsahuje uložení registrů procesoru, načtení nového stavu, vyprázdnění cache pamětí a změnu mapování virtuální paměti. Samotná změna kontextu je závislá na architektuře, na které je systém provozovaný, a není saoučástí scheduleru i když má na jeho design významný vliv.

Plánovače a plánování tasků
Plánování tasků je úloha, při které je přidělen úloze procesor a časová kvóta, po kterou vykonává svůj kód dokud kvótu nevyčerpá nebo jí není plánovačem procesor odebrán. Konkrétní přidělení kvóty je závislé především na:

  • plánovači resp. politice plánování (SCHED_OTHER, SCHED_BATCH, SCHED_FIFO, SCHED_RR, SCHED_IDLEPRIO, SCHED_NORMAL a SCHED_ISO)
  • priorita úlohy - nice (pro běžné úlohy, -20 až 19) a statická priorita (pro real-time úlohy, 1 až 99)
  • preemptivita jádra (nepreemptivni chování (debian etch i lenny), dobrovolně preemptivní chovnání (red hat), preemptivní chování(embedded zařízení)

V Linuxu je pro jádra 2.6 - 2.6.22 požíván O(1) scheduler a pro 2.6.23 a výše CFS (Completely Fair Scheduler). Kromě task schedulerů obsahuje jádro mimo jiné i io schedulery, které mají také významný vliv na výkon (v současné době jsou to CFQ, deadline, noop a anticipatory). Změnu io scheduleru je možné provádět za běhu (přes /sys/) nebo při bootu předat jádru parametrem elevator= a tím nastavit scheduler globalně pro všechny zařízení. Pro ladění výkonu systému je velmi výhodná možnost nastavit io scheduler přímo za běhu a na specifické zařízení, čímž lze nastavit např. dealine io scheduler pro databázi a pro ostatní aplikace ponechat CFQ scheduler.

Ladění pokročilejších parametrů io schedulerů je možné přes /sys/, ladění parametrů task schedulerů je přes sysctl (CFS) nebo úpravou maker ve zdrojovém kódu před kompilací jádra (o(1) scheduler, kernel/sched.c).

Změna afinity
Tvrdou afinitu je možné natavit buď přímo v aplikaci např. pomocí systémového volání sched_setaffinity nebo v systému pomocí příkazu taskset. Pomocí tasksetu lze měnit afinitu jak během spouštění programu tak i během jeho vykonávání nasledovně:

taskset -c <cpu id list> [ <pid> | <cmd> ]

Místo seznamu cpu lze použít i zápis přes bitmasku (0×00000003 je procesor 0 a 1).

Změna scheduleru
Politiku lze volit příkazem schedtool nebo přímo v aplikaci systémovým volání sched_setscheduler. Použití příkazu schedtool může být následující:

schedtool [-M <policy>] [-a <afinita>] [-e <cmd>] [LIST OF PIDS]

Změna priority úlohy
Pro změnu priorit úloh slouží příkazy nice a ionice, které umožňují upravit množství resourců přidělných danému procesu. Místo nice může být výhodnější použít výše zmíněný schedtool. Použití obou příkazů je následující:

nice -n <-20;19> cmd
ionice [-c <] [-n] [-p <pid>] [cmd]


Jak zjistit informace o procesech a threadech

Základní informace o procesu a jeho threadech lze najít v /proc/<pid>/status. Jsou zde uvedeny např. informace o paměti, procesorech, na kterých může proces běžet ale i počet threadů, která v procesu běží.

Podrobnější informace o thredech je možné najít v /proc/<PID>/task/<tid>/stat nebo v lidštější podobě v /proc/<PID>/task/<tid>/status. Bohužel v tomto případě je v mnoha distribucích v manu procu chybný popis. Co se týče samotného výpisu thread/procesor resp. proces/procesor, tak doporučuju projít si fs/proc/array.c a v něm hledat výpis task_cpu(task). Z toho lze určit na které pozici se ve výpisu /proc/<PID>/task/*/stat resp. /proc/<PID>/stat nachází ID procesoru. Stejného výpisu lze dosáhnout samozřejmě i pomocí příkazu ps (ps -L -eo psr,pid,cmd pro procesy nebo ps -L -eo psr,pid,tid,cmd pro thready).

Závěr
Pomocí vhodné volby schedulerů, afinity a priorit úloh lze optimalizovat výkon systému a provozovanou aplikaci. Analýzou informací z procu je pak možné potvrdit nebo vyloučit, zda výkonové problémy nejsou způsobené nevhodným přidělováním prostředkům k taskům (např. všechny procesy příp. thready jsou přiděleny jedinému procesoru) a dále identifikovat zda je případný problém na straně aplikace či systému.

Zdroje
Lukáš Jelínek - Jádro Systému Linux
http://www.linuxjournal.com/article/6799
man proc
http://www.ibm.com/developerworks/linux/library/l-affinity.html
http://www.ibm.com/developerworks/library/l-posix1.html
http://www.redhat.com/magazine/008jun05/features/schedulers/
http://www.ibm.com/developerworks/linux/library/l-scheduler/
http://www.ibm.com/developerworks/library/l-linux-smp/?S_TACT=105AGX01&S_CMP=LP
http://www.ibm.com/developerworks/linux/library/l-cfs/
http://www.cyberciti.biz/tips/setting-processor-affinity-certain-task-or-process.html

Sdílet odkaz:
tisk

Diskuze k článku

kkolakow@gmail.com, 25.4.2012 10:41

Ahoj,

Máš dobře shrnutou affinitu až na to, že ve výhodách furt píšeš o threadech a měl bys mít na mysli task - protože se to netýká jen vlákna ale i procesu.

Tady to máš:
změna kontextu je velmi náročná operace na většině architektur, tudíž je vhodné ponechávat THREADY - má tam být tasky týka se to i procesu nejen vlákna
Tady to stejné
pokud THREAD na daném procesoru již běžel je pravděpodobné, že v cache paměti procesoru zůstala některá jeho data, čím lze optimalizovat výkon cache pamětí (hit rate)

Jinak článek pěkný

Měj se

K

Přidat příspěvek

 

Kontakt pro média


Máte zájem o další informace, odborný článek či přednášku na konferenci? Kontaktujte nás prosím na pr@etnetera.cz.

RSS - Tech life


RSS kanál Tech Life Blogu

Offlineblog

Offlineblog

Ljama


Komix z prostředí imaginární firmy.

ljama

Ještě jste ho nečetli? Tak tudy ...

 
Doporučujeme: Nabídka práce, volná pracovní místa - pracovní portál SPRÁVNÝKROK.CZ