.[ ČeskéHry.cz ].
Vyzna se tu nekdo v planovani v jadru linuxu?

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Fila



Založen: 31. 07. 2007
Příspěvky: 853

PříspěvekZaslal: 21. listopad 2007, 21:01:24    Předmět: Vyzna se tu nekdo v planovani v jadru linuxu? Odpovědět s citátem

Narazil jsem na problem, ktery zrejme vyzaduje celkem slusnou znalost chovani planovace v linuxu, kterou ja nemam Sad. Zna-li nekdo odpoved, ma u me cokoladu nebo flasku -- dle osobni preference Smile.

Jde o to -- vyvijim haptickou aplikaci simulujici interakci biomolekul. Vypada to asi tak, ze mam na n-procesorovem stroji n-1 procesu, ktere pocitaji sily mezi molekulami, a jeden master proces, ktery se sklada z threadu, ktery pocita sily (stejne jako slavove), threadu ktery posila data renderovacimu programu, threadu ktery prijima prikazy od renderovaciho programu, threadu ktery komunikuje s haptickym zarizenim a threadu ktery vytvori knihovna pro hapticke zarizeni (ten jej udrzuje v jakemsi "konzistentnim stavu" nez prijde prikaz menici sily ktere na nej pusobi). Vsechny tyto thready, krome toho co pocita sily mezi molekulami, temer nic nedelaji a vetsinu casu travi budto primo ve usleep(), nebo se alespon cyklicky vzdavaji vypocetniho casu pomoci sched_yield(). To je nutne u threadu majicich primou navaznost na hapticke zarizeni, protoze to potrebuje min. 1 000 updatu za vterinu a na to je i usleep() prilis pomaly (usleep(1) nespi zdaleka jen jednu mikrosekundu).

No a kde je problem? Na singleprocesorovem stroji nikde. Na multiprocesoru se ale zacnou dit veci (tim casteji, cim je vic CPU)... Vypocetni cas se totiz zacne pridelovat dosti podivnym zpusobem. Muze se napr. stat, ze obnovovaci frekvence haptickeho zarizeni spadne z 1kHz klidne na nejake 2Hz. Pritom se vsechny thready vehementne vzdavaji vypocetniho casu, takze by se mel kazdy z nich dostat k lizu.

Proc si myslim, ze je problem nekde hluboko v linuxu a ne v me aplikaci? Protoze kdyz aplikaci spoustim na n-1 procesorech, je vse OK, kdyz ji spoustim na n procesorech, nastane zcela nahodne jeden z techto pripadu:
- aplikace bezi ocekavane, tedy rychleji nez na n-1 procesorech
- aplikace bezi pomaleji nez na n-1 procesorech, ale spomaleni neni dramaticke (treba dvojnasobne, petinasobne...)
- aplikace bezi extremne pomalu (spomaleni je klidne 500-nasobne)

Pricemz zduraznuji, ze vubec nic nemenim, jen opakovane spoustim. Zda se tedy, ze si planovac nejakym neprijemnym zpusobem v momente kdy ma vic threadu nez procesoru a stejny pocet threadu jako je procesoru vetsinu casu hodne intenzivne pocita postavi priority tak, ze se ostatni thready skoro nedostanou ke slovu, respektive jim to muze trvat i desetiny sekundy.

Jeste jedno voditko -- mel jsem v jednom threadu omylem blokujici volani send() na UDP port. Jelikoz to viselo v systemovem volani, tak se periodicky telo teto funkce vzdavalo CPU casu, presto ale byl zmineny problem daleko vetsi. Cely system bezel extremne pomalu i bez haptickeho zarizeni (bral jen fake data), zrejme se sukovala MPI komunikace (tu sprostredkovava daemon -- asi se tez nedostaval k casu). Cely system mel tendenci bezet napr. minutu extremne pomalu, pak najednou zrychlit (zase klidne tisicinasobne) a pak zase spomalit, nekdy bezel porad pomalu, nekdy porad rychle. Opet pri alokaci n-1 procesoru zadny problem.

Vypada to tedy, ze i kdyz se thready samy vzdavaji vypocetniho casu, planovac nedokaze v pripade, ze mame stejny pocet narocnych threadu jako CPU, spoustet mene narocne thready s dostatecnou frekvenci. Jedine reseni, co me zde napada, je udelat extra proces pracujici s haptickym zarizenim a ten spoustet s realtime planovanim -- to je ale neprijemne z toho hlediska, ze jej muze spustit jen root.

Ma-li kdokoliv napad k reseni ci vysvetleni, proc se system chova tak jak se chova, budu rad Smile.

Ps. studenti FI kteri najdou stejnou otazku na foru v ISu necht me prosim nekamenuji -- je to natolik specificke tema, ze jsem povazoval za rozumne zeptat se na dvou mistech...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1536
Bydliště: u Prahy

PříspěvekZaslal: 21. listopad 2007, 21:44:11    Předmět: Odpovědět s citátem

Jen uvazuju - podle me je problem v tom, ze se thready opakovane vzdavaji vypocetniho casu. Planovac je pak asi nesmyslne prehazuje mezi procesory. Priklad: thread1 usne, thread2 usne, thread3 usne -> planovac je prehodi na stejny CPU/jadro, protoze nejaka systemova low priority vec v tu chvili vytezuje system vic nez tyhle 3 thready dohromady (malo je vic nez nic - muze to byt cokoli v pozadi, co se v tu chvili prihlasi o slovo). Pak se ty 3 thready probudi a vytezuji chvilku na 100 % (nez zas usnou) -> planovac je rozhodi na volne CPU.

Jenze premistovani procesu mezi CPU je dost pomale, prakticky je to okamzite vymazani vsech dat procesu ve vsech urovnich CPU cache, ktere nejsou sdilene mezi CPU (u modernich vicejadrovych procesoru muzou byt nektere urovne cache sdilene nebo rychle propojene, u samostatnych CPU sdilene samozrejme neni), a natahani do CPU cache noveho CPU.

Overit se to da tim, ze se procesory nebudou vzdavat CPU (cekat budou cyklem), pak budou vsechny furt vytezovat, takze je planovac rozhodi na vsechna CPU a nehybe s nimi.

Ve Windows se da treba myslim proces uzamknout na nejakem CPU, ale nevim, jestli se to da aplikacne udelat i per thread.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
rezna



Založen: 27. 07. 2007
Příspěvky: 2156

PříspěvekZaslal: 21. listopad 2007, 21:46:53    Předmět: Odpovědět s citátem

per thread je to SetThreadAfinity
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Mem



Založen: 28. 07. 2007
Příspěvky: 1959
Bydliště: Olomouc

PříspěvekZaslal: 21. listopad 2007, 22:25:57    Předmět: Odpovědět s citátem

Jj, to by mohlo být ono, např. v SQL Serveru 2005 se dá afinita nastavit a parametrizovat a jsou kolem toho dost důrazná varování, že to může s výkonem zamávat
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 22. listopad 2007, 08:46:59    Předmět: Odpovědět s citátem

Pokaždé, když jsem se setkal s podobným náhodným chováním, tak se jednalo o chybu v mém programu. V žádném případě ne zjevnou, obvykle toto způsoboval nějaký fígl, který se projevil až právě na fyzicky dvou a více jádrech. Např. dvoufázové uzamykání (nebo jak se přesně tomu idiomu nadává). Dokonce jsem o tom vygooglil i článek s vysvětlením, ale nezapamatoval jsem si ho Sad ...jen si pamatuju že se dá narazit na desítky různých takovýchle problémů, takže možná že jsi narazil na jeden z nich.

Asi bych hned neobviňoval plánovač Wink ...třeba ten nevyužitý procesor o kterém píšeš má na práci něco jiného (přerušení) a tím že jej použiješ se to rozhodí. Každopádně používat nějaké yieldy na taktování je prasárna, minimálně na windows to může vytížit procesory na 100% s tím že tohle vytížení se ve většině indikátorů neukáže, protože se většina času tráví v režimu jádra (opět popisuju jen jak to je na Windows).

Trochu jsme s kolegy o tom diskutovali a další věc, která s tím možná souvisí je, že plánovač je uzamykán globálně (teda v aktuální verzi linuxového kernelu, v příští už to má být zase o něco lepší), tedy skoky do plánovače (yieldy) se serializují napříč všemi procesory.

Já bych vývoj směřoval k nahrazení těch yieldů za nějaký kvalitnější mechanizmus. Na Windows bych pomocí timeBeginPeriod zvýšil "kadenci" plánovače, a vlákna spouštěl z toho centrálního pomocí SetWaitableTimer (a funkcí kolem něj). Předpokládám, že linuxový plánovač bude mít alternativu k těmto.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Fila



Založen: 31. 07. 2007
Příspěvky: 853

PříspěvekZaslal: 22. listopad 2007, 10:15:52    Předmět: Odpovědět s citátem

Ladis napsal:
Jen uvazuju - podle me je problem v tom, ze se thready opakovane vzdavaji vypocetniho casu. Planovac je pak asi nesmyslne prehazuje mezi procesory. Priklad: thread1 usne, thread2 usne, thread3 usne -> planovac je prehodi na stejny CPU/jadro, protoze nejaka systemova low priority vec v tu chvili vytezuje system vic nez tyhle 3 thready dohromady (malo je vic nez nic - muze to byt cokoli v pozadi, co se v tu chvili prihlasi o slovo). Pak se ty 3 thready probudi a vytezuji chvilku na 100 % (nez zas usnou) -> planovac je rozhodi na volne CPU.

Jenze premistovani procesu mezi CPU je dost pomale, prakticky je to okamzite vymazani vsech dat procesu ve vsech urovnich CPU cache, ktere nejsou sdilene mezi CPU (u modernich vicejadrovych procesoru muzou byt nektere urovne cache sdilene nebo rychle propojene, u samostatnych CPU sdilene samozrejme neni), a natahani do CPU cache noveho CPU.

Overit se to da tim, ze se procesory nebudou vzdavat CPU (cekat budou cyklem), pak budou vsechny furt vytezovat, takze je planovac rozhodi na vsechna CPU a nehybe s nimi.

Ve Windows se da treba myslim proces uzamknout na nejakem CPU, ale nevim, jestli se to da aplikacne udelat i per thread.


Nene, problem je jiny. Kdyby procesy migrovaly mezi CPU, bude to uplne jine spomaleni nez tisicinasobne (u vytizeni n-1 procesoru take muzou migrovat a zadne spomaleni se nekona). Tady je opravdu problem v tom, ze nektere vlakna vali plnou rychlosti a jine se vubec nedostavaji ke slovu a ze se to deje nedeterministicky.
Kdybych cekal aktivne, jak navrhujes, pak se tyto nevypocetni vlakna nedostanou vubec ke slovu -- to by nefungovalo ani na jednom CPU!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Fila



Založen: 31. 07. 2007
Příspěvky: 853

PříspěvekZaslal: 22. listopad 2007, 10:23:02    Předmět: Odpovědět s citátem

Tringi napsal:
Pokaždé, když jsem se setkal s podobným náhodným chováním, tak se jednalo o chybu v mém programu. V žádném případě ne zjevnou, obvykle toto způsoboval nějaký fígl, který se projevil až právě na fyzicky dvou a více jádrech. Např. dvoufázové uzamykání (nebo jak se přesně tomu idiomu nadává). Dokonce jsem o tom vygooglil i článek s vysvětlením, ale nezapamatoval jsem si ho Sad ...jen si pamatuju že se dá narazit na desítky různých takovýchle problémů, takže možná že jsi narazil na jeden z nich.

Asi bych hned neobviňoval plánovač Wink ...třeba ten nevyužitý procesor o kterém píšeš má na práci něco jiného (přerušení) a tím že jej použiješ se to rozhodí. Každopádně používat nějaké yieldy na taktování je prasárna, minimálně na windows to může vytížit procesory na 100% s tím že tohle vytížení se ve většině indikátorů neukáže, protože se většina času tráví v režimu jádra (opět popisuju jen jak to je na Windows).

Trochu jsme s kolegy o tom diskutovali a další věc, která s tím možná souvisí je, že plánovač je uzamykán globálně (teda v aktuální verzi linuxového kernelu, v příští už to má být zase o něco lepší), tedy skoky do plánovače (yieldy) se serializují napříč všemi procesory.

Já bych vývoj směřoval k nahrazení těch yieldů za nějaký kvalitnější mechanizmus. Na Windows bych pomocí timeBeginPeriod zvýšil "kadenci" plánovače, a vlákna spouštěl z toho centrálního pomocí SetWaitableTimer (a funkcí kolem něj). Předpokládám, že linuxový plánovač bude mít alternativu k těmto.


Ale no tak, ja nejsu zase tak blby, jak vypadam Smile. Samozrejme ze nechci obvinovat jadro z chyby, kdyz k tomu nemam duvod. Vede me k tomu jednak funkcnost na 1CPU, druhak funkcnost na n-1 CPU a totalni ale nedeterministicka nefunkcnost na n CPU.

Jinak v linuxu samozrejme vidim cas jadra -- pokud nejake vlakno v cyklu "yielduje", zere to 100% CPU, ale samozrejme v kernelu a ne systemu -- a v tomto momente se okamzite dostava ke slovu jakekoliv vlakno co chce neco spocitat. Kdyz si ubijes vykon jednoprocesoroveho stroje pomoci yes > /dev/null a pustis nejaky vypocet, bezi polovicni rychlosti, pokud jej ubyjes pomoci for (;Wink sched_yield();, bezi ti vedle vypocet temer stoprocentni rychlosti, protoze planovac prepina dva procesy, z nichz jeden jakmile dostane casove kvantum tak jej okamzite vrati a zaradi se na konec fronty.

S globalnim uzamykanim planovace to nechapu -- prosim dovysvetlit Smile.

Trochu se vic podivam co vsechno muzu v linuxovem planovaci nastavit -- ale tady bohuzel plati, ze jsou Windowsy o dost dal, to je znama vec.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 22. listopad 2007, 10:35:07    Předmět: Odpovědět s citátem

Fila napsal:
S globalnim uzamykanim planovace to nechapu -- prosim dovysvetlit Smile.

Bylo mi to popsáno takto: Jak plánovač na Windows, tak současný v jádře Linuxu (ale bylo mi řečeno že nějaká vyvíjená verze už je lepší), je blokován aby v jednom okamžiku běžel jen jednou (systémová kritická sekce, mutex) bez ohledu na množství procesorů. Tedy vláknům běžícím na ostatních procesech už dávno mohlo vypršet kvantum, nebo chtějí začít blokovat (třeba tím yield), ale dokud neskončí plánovač na tom prvním procesoru, nezačne se vybírat nové vlákno pro ty ostatní, které jsou tak celkem dlouho vlastně nevyužité, i když existují připravená vlákna.
Snad je to srozumitelné, nicméně nemám to zatím ničím podložené, jen mi to říkalo už víc lidí.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Fila



Založen: 31. 07. 2007
Příspěvky: 853

PříspěvekZaslal: 22. listopad 2007, 13:16:30    Předmět: Odpovědět s citátem

Dobre, ale to by zpusobovalo zasekavani vypoctu na max. 4ms, po kterych se spousti planovac -- pri neprijemne desynchronizaci by tak slo do kelu 50 % vykonu ostatnich CPU -- coz porad nevysvetluje spomaleni v radu stovek az tisicu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Tringi



Založen: 28. 07. 2007
Příspěvky: 290

PříspěvekZaslal: 22. listopad 2007, 14:22:00    Předmět: Odpovědět s citátem

Možná. Nevím jak dále bys měl pokračovat ...jak jsem psal, já bych zkusil nahradit ten taktovací systém nějakým jiným, ale prostředky jádra Linuxu neznám. Pokud nemá ten tvůj projekt jinou závislost na Linuxu, zkus to pod Windows (jak přes yield, tak za pomocí waitable timerů) a uvidíš Neutral
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Fila



Založen: 31. 07. 2007
Příspěvky: 853

PříspěvekZaslal: 22. listopad 2007, 15:10:23    Předmět: Odpovědět s citátem

Ted jsem jeste delal pokus -- postupne jsem nahazoval procesy zerouci nezrizene cas (yes > /dev/null) a po nekolikatem se stalo, ze jeden z procesu meho programu se nedostal temer vubec k CPU (ostatni jely na 100 % nebo treba 50 % protoze se delily o CPU s jednim yes > /dev/null) a ten jeden se nedostal ani k 1 % CPU -- vykon tim sel samozrejme kompletne do prdele.

Normalne bych to cele resil pres futexy, ale tady tim muzu umravnit thready hlavniho procesu, ostatni v principu nemuzu, protoze komunikuju pres MPI a nemam zadne sdilene prostredky.

Napadlo me ale jedno snad-reseni -- slavovske procesy volaji blokujici MPI operace, coz v principu nevadi, protoze ty lezou do jadra a tim umozni planovaci prepnout na jiny proces, nicmene je mozne, ze se mu zdaji prilis aktivni, takze prepina na ne a nedostane se na thready ovladajici hapticke zarizeni. Pokud je prepisu tak, ze zavolaji neblokujici MPI operaci a pak budou cyklit nad sched_yield(), je dost dobre mozne, ze se problemu zbavim, jelikoz si vynutim jejich zarazeni na konec planovane fronty.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crusty



Založen: 28. 08. 2007
Příspěvky: 120
Bydliště: Praha

PříspěvekZaslal: 22. listopad 2007, 15:58:30    Předmět: Odpovědět s citátem

zde http://tldp.org/LDP/tlk/tlk.html v sekci 4.3.1 Scheduling in Multiprocessor Systems mozna neco uzitecneho najdes.

pak jsem jeste nasel toto http://www.ibm.com/developerworks/linux/library/l-scheduler/
_________________
http://www.2ox.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Fila



Založen: 31. 07. 2007
Příspěvky: 853

PříspěvekZaslal: 22. listopad 2007, 17:43:21    Předmět: Odpovědět s citátem

Kdyz jsme dali vlaknu ktere ovsluhuje hapticke zarizeni RT prioritu, tak to zaclo fungovat, takze se reseni uz i rysuje Smile.
Krom toho si myslim ze tam mam vec kterou casovac uplne nezvlada a jeste ji muzu poopravit, aby se to nesukovalo i v momente, kdyz se nekdo rozhodne docasne vyzrat nejaky procesor.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Obecné Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna