Portál AbcLinuxu, 27. května 2024 20:38

Jaderné noviny – 9. 12. 2009

8. 1. 2010 | Jirka Bourek
Články - Jaderné noviny – 9. 12. 2009  

Aktuální verze jádra: 2.6.32. Citáty týdne: Paul McKenney, Linus Torvalds, Steven „Bam Bam“ Rostedt. Vyřešeno pojmenování spinlocků. Začleňovací okno 2.6.33, část první. Minimalizace dopadů osazování jádra.

Obsah

Aktuální verze jádra: 2.6.32

link

Jádro 2.6.32 je venku, vydáno bylo 2. prosince. Mezi významnější vlastnosti v 2.6.32 patří devtmpfs, kus práce na škálovatelnosti blokové vrstvy, HWPOISON, jádrem sdílená paměť, mnoho přírůstků do subsystému událostí výkonnosti [perf events] a další. Spoustu detailů vizte na stránce o 2.6.32 na KernelNewbies.

Začleňovací okno 2.6.33 je otevřené; v článku níže vizte shrnutí nejvýznamnějších změn, které byly zatím začleněny.

Stabilní aktualizace jádra: 2.6.31.7 obsahující velmi dlouhý seznam oprav, bylo vydáno 8. prosince. Ve stejnou dobu bylo vydáno 2.6.27.40 rychle následované 2.6.27.41, které opravovalo problém při překladu.

Citáty týdne: Paul McKenney, Linus Torvalds, Steven „Bam Bam“ Rostedt

link

Bohužel ani ty nejlepší lidské reflexy prostě nemohou stačit 5GHz CPU. I kdybychom si představili kofeinem nadopovaného 5GHz superhrdinu, musel by se měřit s několika miliony počítačů. A tak moderní mikroprocesor překonává nesčetná milénia evoluce a frustruje tím nesčetné počty rádoby počítačových profesionálů.

-- Paul McKenney

Faktem je, že pokaždé, když někdo přijde s novým mechanismem pro zamykání, VŽDYCKY HO MÁ BLBĚ. Nedělejte to.

-- Linus Torvalds

Ale my jaderní vývojáři zůstáváme vzhůru pozdě do noci, pijeme Jolt (nebo pivo, pokud jste v Evropě) a naše mozkové buňky se spékají do logických obvodů, takže chápání konceptů, které nejsou vytesány do kamene, pro nás postupně začíná být příliš namáhavé a my se nakonec musíme vzdát a přestat řešit tu jednu poslední chybu, abychom si mohli odpočinout se svou drahou polovičkou, která spí od devíti od večera.

To znamená, že používání DECLARE_* a DEFINE_* nás přehoupne do normálnosti a je potřeba se tomu vyhnout. Je potřeba zavést nové jméno, které by jasně popisovalo mystickou CPP magii, ze které se skládá TRACE_EVENT. Nějaké, které nás dokáže přivést zpět ke kořenům. Někam, kde všechno začíná. Do doby kamenné.

Proto tento patch přejmenovává MAKRA na nejzjevnější možné definice. Na takové, na které jsme měli myslet hned ze začátku.

s/DEFINE_EVENT_CLASS/FRED/g
s/DEFINE_EVENT/WILMA/g
s/TRACE_EVENT/BARNEY/g

-- Steven „Bam Bam“ Rostedt

Vyřešeno pojmenování spinlocků

link

Případné začlenění spících spinlocků ze stromu realtime preempce vyžaduje rozdělení existujících zámků na dva typy: Na ty, které v realtime stromě smí spát (většina), a ty, které musí zůstat skutečnými spinlocky. Na Jaderném summitu 2009 se rozhodlo proti přejmenovávání velkého počtu běžných zámků, ale nevzešlo odtud jméno pro typ „čistého“ spinlocku.

Jednou možností bylo raw_spinlock_t, ale toto jméno se již používá v kódu lockdep. Po mnoha dalších možných jménech, která byla zvažována, vyhrál Linusův návrh: arch_spinlock_t. Toto jméno nese informaci o tom, že se jedná o nízkoúrovňový spinlock, který je implementován kódem specifickým pro architekturu; lepší nápad se neobjevil, takže u tohoto jména zůstalo.

Thomas Gleixner zaslal patch, který změnu provádí. Stojí za to poznamenat, že i když nový typ není raw_spinlock_t, stále se k získání zámku arch_spinlock_t volá raw_spin_lock(). V době psaní tohoto článku nebyl tento patch začleněn do 2.6.33, ale je šance, že bude.

Začleňovací okno 2.6.33, část první

link

Linus začal začleňovat patche pro vývojový cyklus 2.6.33 5. prosince. Začleňovací okno začalo pomalu, ale pak Linus začal dohánět ztracený čas; v době psaní tohoto článku bylo začleněno nějakých 3900 sad změn.

Mezi změny viditelné pro uživatele patří:

Mezi změny viditelné pro jaderné vývojáře patří:

Začleňovací okno by mělo zůstat otevřené alespoň ještě jeden týden; očekávejme začlenění o trochu většího množství kódu, než se okno uzavře.

Minimalizace dopadů osazování jádra

link

Minimalizace režie různých jaderných mechanismů pro ladění a sledování je důležitá z několika důvodů. Pro statické sledovací nástroje, jako jsou sledovací body, platí, že jejich vliv na systém, když nejsou zapnuty, musí být velmi nízký, jinak je nikdo nebude používat – nebo nebudou začleněny. Krom toho – jako u jakéhokoliv jiného sledovacího nástroje – musí být jejich vliv, když jsou zapnuty, co nejmenší, aby se sledované chování v důsledku sledování významně nezměnilo. Dva oddělené návrhy, návěští skoků [jump labels] pro sledovací body a optimalizace skoků ksond [kprobes], se oba snaží omezit vliv, který má osazení sledovacími nástroji na výkonnost. Krom toho sdílí nějaký kód.

Optimalizaci skoků ksond navrhl Masami Hiramatsu, režii volání ksondy snižuje přibližně na pětinu a za to platí spotřebou paměti navíc. Podle Masamiho se trvání ksond, když byly touto technikou optimalizovány, snížilo z 0,68 μs (32 bit) a 0,91 μs (64 bit) na 0,06 μs (oba). Návratové ksondy [kretprobes] spadly z 0,95 μs (32 bit) a 1,21 μs (64 bit) na 0,30 μs a 0,35 μs v uvedeném pořadí. Veškeré testování probíhalo na 2,33GHz procesoru Xeon.

Kvůli takovým číslům člověk vyvalí oči, obzvlášť když optimalizace přidává přibližně jenom 200 bytů za sondu. Základním nápadem je použít místo bodu přerušení [breakpoint] instrukci skoku a tak implementovat sondy, kdekoliv je to možné. Patch obsahuje poměrně složité „bezpečnostní kontroly“, které se ujišťují, že je optimalizaci možné provést. Navíc předtím, než je cokoliv z toho provedeno, je vložena ksonda běžná založená na bodě přerušení – pokud optimalizaci nelze provést, použije se ta.

Instrukce skoku, která se má vkládat na adresu, kde se má sledovat, je delší než jeden byte, takže je nutné se při optimalizaci dívat na kód, který tím bude ovlivněn. Pokud zasažená oblast leží na hranici mezi funkcemi (tj. instrukce skoku by vytekla ze sledované funkce do další), optimalizace se neprovádí. Sledovaná funkce se poté dekóduje a hledá se instrukce skoku, která by do ovlivněné oblasti mohla skočit; pokud žádná není nalezena, optimalizace pokračuje.

Instrukce umístěné na adrese, která se bude sledovat, je samozřejmě nutné vykonat, i když jsou nahrazeny skokem, takže je vytvořen buffer pro „objížďku“. Objížďkový buffer emuluje výjimku, která obsahuje instrukce zkopírované ze sledovaného místa následované skokem na původní cestu vykonávání. Buffer je použit poté, co se vykoná samotný kód ksondy, aby mohl doběhnout kód za touto sondou.

Jakmile je vytvořen objížďkový buffer, je ksonda zařazena do pracovní fronty optimalizátoru ksond, kde je do místa sledování patchován skok. Optimalizátor se musí ujistit, že neprobíhají žádná přerušení, a to udělá použitím synchronize_sched() ve funkci pracovní fronty. Když se ta dokončí, funkce text_poke_fixup(), která je přidána jako součást sady patchů, modifikuje kód a vloží do něj skok.

Patch text_poke_fixup() je ten kousek, který je sdílen s návěštími skoků. Vypadá takto:

void *text_poke_fixup(void *addr, const void *opcode, size_t len,
                      void *fixup);

kde addr ukazuje na pozici, která se má změnit, opcodelen specifikují nový operační kód (a jeho délku), který tam má být zapsán. fixup je adresa, kam má procesor skočit, pokud narazí na addr, když probíhá modifikace.

text_poke_fixup() v podstatě vloží přerušovací bod, který vykoná kód na fixup místo na addr a ten synchronizuje na všechna CPU. Potom modifikuje všechny ostatní byty (kromě prvního) v oblasti a opět vše synchronizuje na všechna CPU. Další krok je modifikace prvního byte, což opět vyžaduje synchronizaci, načež je bod přerušení vymazán. Všechna volání provedená během modifikace jsou bodem přerušení přesměrována do kódu fixup.

Návěští skoků používají stejnou techniku, ale vzhledem k tomu, že se vztahují ke statickému osazení (sledovacím bodům [tracepoint]), jejich úkolem je minimalizovat dopad v pravděpodobném případě, že je sledovací bod zakázán. To dělá použitím konstrukce asm goto v assembleru, která bude k dispozici v blížícím se GCC 4.5 a která umožňuje skok na návěští.

Pro sledovací bod je to myšleno tak, že v zakázaném případě bude tvořen pětibytovým NOP (velikost vhodná k tomu, aby ho bylo možné přepsat skokem) následovaným skokem, který přeskakuje zakázaný sledovací kód. Když je sledovací bod povolen, text_poke_fixup() změní NOP na skok na návěští v makru DECLARE_TRACE() – na kód, který byl přeskakován původním nepodmíněným skokem.

Patch pro návěští skoků obsahuje kód, který se stará o stav sledovacích bodů včetně návěští a adres společně s aktuálním stavem povoleno/zakázáno sledovacího bodu. Je to trochu hackoidní zneužívání preprocesoru a assembleru, ale podle Jasona Barona, který patch navrhl, je výsledkem průměrné zlepšení o 30 cyklů na sledovací bod na x86_64 systémech, které jsem testoval.

Návěští skoků odstraňují současný test a skok, který se provádí pro každý sledovací bod, protože dokáže dynamicky vypínat a zapínat kód sledovacího bodu. Přidání NOPu a nepodmíněného skoku přidává oproti vynechanému skoku 2-4 cykly, říká Jason, což je pro tento druh sledování poměrně levné.

Obě tyto techniky pravděpodobně budou potřebovat „trochu povařit“, než budou připraveny pro hlavní řadu. Návěští skoků jsou poměrně mladý návrh a spoléhají se na vlastnost překladače, který ještě nebyl vydán, což je bude brzdit. Reakce na oba návrhy byly nicméně vcelku pozitivní, což naznačuje obecný souhlas s jejich cíli. Omezení režie sledování a ladění je něco, s čím bude nesouhlasit jenom málokdo.

Související články

Jaderné noviny – 2. 12. 2009
Jaderné noviny – 25. 11. 2009
Jaderné noviny – 18. 11. 2009
Jaderné noviny – 11. 11. 2009

Odkazy a zdroje

Kernel coverage at LWN.net: December 9, 2009

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

Jaderné noviny – přehled za duben 2024
Jaderné noviny – přehled za březen 2024
Jaderné noviny – přehled za únor 2024
Jaderné noviny – přehled za leden 2024
Jaderné noviny – přehled za prosinec 2023

Diskuse k tomuto článku

8.1.2010 10:01 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
Rozbalit Rozbalit vše Re: Jaderné noviny – 9. 12. 2009
Odpovědět | Sbalit | Link | Blokovat | Admin
používání DECLARE_* a DEFINE_* bychom nás
- to bychom je tam navíc.

Jinak díky za překlad.
When your hammer is C++, everything begins to look like a thumb.
8.1.2010 10:12 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: Jaderné noviny – 9. 12. 2009
Moje chyba, díky.
8.1.2010 11:44 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Jaderné noviny – 9. 12. 2009
A ty hodiny spánku mají být, že spí už od devíti večer. nikoliv od devíti do večera.
8.1.2010 11:56 Robert Krátký | skóre: 94 | blog: Robertův bloček
Rozbalit Rozbalit vše Re: Jaderné noviny – 9. 12. 2009
Vždyť je tam napsáno "od devíti od večera".
8.1.2010 13:08 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Jaderné noviny – 9. 12. 2009
Já původně taky přečetl do večera. IMHO od devíti večer je běžnější a bezpečnější :-)
Ještě na tom nejsem tak špatně, abych četl Viewegha.

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