Portál AbcLinuxu, 9. června 2026 13:57

Jaderné noviny – 22. 4. 2009

2. 6. 2009 | Jirka Bourek
Články - Jaderné noviny – 22. 4. 2009  

Aktuální verze jádra: 2.6.30-rc3. Citáty týdne: Ingo Molnár, Rusty Russell. Hledání perfektního changelogu. Mechanismus pomalé práce. DRBD: Distribuované blokové zařízení.

Obsah

Aktuální verze jádra: 2.6.30-rc3

link

Současné vývojové jádro je 2.6.30-rc3 vydané 21. dubna. Diffstat skutečně ukazuje spoustu malých jednořádkových a dvouřádkových patchů, i když jsou oblasti, kam se dostávají větší patche (ignoruji velké, ale nezajímavé aktualizace defconfig pro arm): nějaké aktualizace x86, některé opravy plánování blokového I/O, pročištění a opravy splice a mnoho změn v ovladačích (zvuk, síťování, staging, usb). Zkrácený changelog je v oznámení, všechny detaily vizte v kompletním changelogu.

Současné stabilní jádro 2.6 je 2.6.29.1; od 2. dubna nebyly žádné stabilní aktualizace 2.6.

Pro fanoušky extrémně stabilních jader je tu nicméně 2.4.37.1 vydané 19. dubna. Většina těchto oprav se týká menších bezpečnostních problémů, které byly backportovány z 2.6 (většinou lokální DoSy). Dle mého mínění by aktualizaci měli zvažovat jenom lidé s lokálními uživateli, pokud takoví ještě existují!

Citáty týdne: Ingo Molnár, Rusty Russell

link

Počet přispěvatelů, kteří jsou schopni napsat smysluplné changelogy nebo které lze naučit psát opravdu dobré changelogy, je velmi, velmi malý. Odhaduji něco kolem 5 % ze všech přispěvatelů do Linuxu (Tento odhad je pravděpodobně spíše optimistický.)

-- Ingo Molnár

Žádný předmět by nikdy neměl obsahovat slovo „trivial“. Pokud je to opravdu triviální, lze to shrnout v předmětu a my poznáme, že je to triviální. Krom toho to ukáže diffstat. „triviální“ je propaganda, již cílem je propašovat patch do -rc7.

-- Rusty Russell

V posledních 15 letech Linuxu jsme promarnili spoustu času a úsilí ve snaze obejít a řešit blbosti překladačů. Vyplýtvali jsme spoustu příležitostí letitým čekáním na to, než se u nich objeví příčetné vlastnosti. Tuto snahu jsme klidně mohli investovat do vytvoření vlastního překladače a přestali bychom se obtěžovat s externalitami.

-- Ingo Molnár

Hledání perfektního changelogu

link

Když se jaderný vývojář zapojí do dlouhé diskuze o psaní changelogů k patchům, jeden by si mohl myslet, že mu došly užitečné věci, které by mohl dělat. Hádky o changelozích nicméně nejsou to samé, jako flamewary o pravopisu nebo gramatice. V prostředí, kde se v každém tříměsíčním cyklu do jádra začleňuje okolo 10 000 změn, vývojáři potřebují veškerou dostupnou pomoc k tomu, aby porozuměli tomu, co se v něm děje. Špatně popsaným patchům je těžké porozumět a těžké najít, když se v historii hledá něco specifického. Udělat changelogy správně tedy znamená pomoci vývojovému procesu – a jádru – jako celku.

Celé to nicméně začalo nevinně; Linus se účastnil rutinního flamování o patchích, když narazil na značky „Impact:“ (dopad), které někteří vývojáři (obzvláště ti, kteří pracují se stromy Inga Molnára) začali v nedávných měsících používat:

Dopad: zjednodušuje a rozšiřuje existující API

Postačí říct, že ho to příliš neohromilo:

A co k čertu mají být ty pitomé „Dopad:“ věci? Kdo s tím začal a proč? Jestliže vaše jednořádkové vysvětlení na začátku není dost dobré a víceřádkové vysvětlení není dost jasné, tak byste měli opravit TYTO věci a ne přidávat idiotský řádek „Dopad“.

Od té chvíle se delší konverzace zaměřila na dvě s tím spojená témata: Na hodnotu značky „dopad“ a na to, jak obecně psát lepší changelogy. Co se prvního týče, hlavní (ale ne jediný) propagátor těchto značek je Ingo Molnár, který vyjmenoval několik výhod jejich používání. Používání těchto značek, tvrdí, nutí vývojáře psát menší patche, které lze adekvátně popsat jedinou řádkou. Poskytují správcům subsystémů jednoduchý způsob, jak zhodnotit změny vyvolané sadou patchů a riziko s nimi spojené; také zjednodušují revizi patche jeho srovnáním s předpokládaným „dopadem“ Také se o těchto značkách říká, že vynucují jistou čistotu myšlení, kterou nutí vývojáře přemýšlet o dopadu změny.

Většina těchto argumentů s kritiky nepohnula. Ti by místo přidávání další značky byli raději, kdyby vývojáři rovnou psali lepší changelogy. Ve správně dokumentovaném patchi je nová značka prostě irelevantní. Andrew Morton řekl:

Dostal jsem několik Dopad:ů a musím říct, že řádek Dopad: vždy duplikuje Předmět:. Kromě několika případů a v těch stál Předmět: za prd.

S tímto tvrzením Ingo dlouho diskutoval, což není překvapující. Šel ale dál a tvrdil, že i když by lepší changelogy byly určitě žádoucí, nejsou praktickým cílem. Podle Inga většina vývojářů jednoduše neumí psát dobré changelogy. Část problému často představuje neznalost jazyka, ale je zde i něco navíc: Většina vývojářů jednoduše postrádá spisovatelské schopnosti k tomu napsat changelog jasně a stručně. To Ingo považuje za nezvratný fakt, který nelze změnit, ale většinu vývojářů lze alespoň vycvičit k tomu, aby psali rozumnou značku „dopad“.

Je pravděpodobně férové říci, že většina vývojářů se takto postižena necítí. Na druhou stranu je ale nutné dodat, že mnoho patchů se do hlavní řady dostane bez užitečného changelogu. To lze pravděpodobně změnit – přinejmenším v nějakém rozsahu – tlakem od správců a lepším porozuměním tomu, jak dobrý changelog napsat. Jako pokus o pomoc Jonathan Corbet, autor tohoto článku, navrhl krátký dodatek do Documentation/development-process:

Psaní dobrých changelogů je důležité, ale často opomíjené umění; stojí za to strávit nějaký čas diskuzí o tomto problému. Když píšete changelogy, je dobré mít na mysli to, že mnoho různých lidí bude vaše slova číst. Mezi ně patří správci subsystémů a revidovatelé, kteří se musí rozhodnout, jestli patch má být zahrnut, distributoři a další správci, kteří se rozhodují, jestli patch má být backportován do dalších jader, lovci chyb, které zajímá, jestli je patch odpovědný za problém, který hledají, uživatelé, kteří chtějí vědět, jak se jádro změnilo, a další. Dobrý changelog tuto informaci zprostředkovává všem těmto lidem nejpřímějším a nejstručnějším způsobem.

Za tímto účelem by řádek shrnutí měl popisovat důsledky a motivaci pro danou změnu tak dobře, jak je to jen možné vzhledem k omezení na jeden řádek. Detailní popis by se poté měl zaměřit na daná témata a poskytnout všechny potřebné dodatečné informace. Jestliže patch opravuje chybu, pokud možno citujte commit, který chybu zavedl. Jestliže je problém spojen se specifickým logem nebo výstupem překladače, zahrňte tento výstup, abyste pomohli všem, kteří hledají řešení stejného problému. Jestliže je změna podpůrná pro další změny, které přijdou v pozdějším patchi, řekněte to. Jestliže se změnila interní API, popište tyto změny detailně a udejte, jak by měli zareagovat ostatní vývojáři. Obecně, čím lépe se budete schopni vcítit do každého, kdo bude váš changelog číst, tím lepší changelog (a jádro jako celek) bude.

Další možné dodatky navrhl Ted Ts'oPaul Gortmaker. Všechny tyto patche jsou samozřejmě postaveny na základě optimistického předpokladu, že vývojáři čtou dokumentaci.

Dalo by se dohadovat, že jaderná komunita se k tomuto problému dostává poněkud pozdě. Je to očekávatelné; v době před BitKeeperem (tj. do února 2002) se jednotlivé změny jádra téměř vůbec nesledovaly. To, že se o pouhých sedm let později diskutuje, jak psát správné changelogy, naznačuje, že se věci pohybují správným směrem. Úroveň profesionality jaderné komunity roste již nějaký čas; tento proces bude pravděpodobně pokračovat. Ať už se v budoucnu nějaká forma značky „Dopad“ bude používat, nebo ne, lze předpokládat, že kvalita changelogů jako celku se zlepší.

Mechanismus pomalé práce

link

Před mnoha lety slyšel Jonathan, autor tohoto článku, Vana Jacobsona prohlásit, že algoritmus „pomalého startu“ byla jedna z největších chyb, kterou kdy udělal. Jméno algoritmu se odkazuje na techniku zvyšování rychlosti přenosů pomalu, dokud není určena přenosová kapacita spojení. Ostatní ale uviděli „pomalého“ a stěžovali si, že nechtějí, aby jejich spojení byla pomalá. Faktu, že díky „pomalému startu“ se síť zrychlila, si nevšimli. Jeden by se mohl ptát sám sebe, jestli mechanismus „pomalé práce“ Davida Howella – začleněný do 2.6.30 – narazí na podobné problémy; žádný vývojář nechce, aby věci běžely pomalu. To ale, stejně jako u pomalého startu, není cílem.

Pomalá práce je implementace fondu vláken [thread pool] – dalšího fondu vláken, dalo by se říci. Jádro již má pracovní fronty [workqueue] a infrastrukturu pro asynchronní volání funkcí; modul distribuovaného úložiště (DST) přidaný do 2.6.30 do stromu -staging v sobě také skrývá fond vláken. Každý z těchto fondů je zaměřen na jinou sadu uživatelů. Pracovní fronty poskytují vlákna samostatně pro jednotlivá CPU dedikovaná specifickým subsystémům, zatímco asynchronní volání funkcí je optimalizováno pro specifické řazení úloh. Pomalá práce vypadá spíše jako nástroj pro "dávkové zpracování úloh", který mohou využít jaderné subsystémy ke spuštění úloh, od kterých se očekává, že jejich zpracování spotřebuje větší množství času.

Jaderný subsystém, který chce spustit pomalou úlohu, musí nejprve deklarovat svůj záměr kódu pomalé práce:

#include <linux/slow-work.h>

int slow_work_register_user(void);

Volání slow_work_register_user() zajišťuje, že fond vláken bude nastaven a připraven k práci – než se registruje první uživatel, nejsou vytvořena žádná vlákna. Návratová hodnota je buď nula (úspěch) nebo obvyklý záporný chybový kód.

Skutečná úloha pomalé práce vyžaduje vytvoření dvou struktur:

struct slow_work;

struct slow_work_ops {
    int (*get_ref)(struct slow_work *work);
    void (*put_ref)(struct slow_work *work);
    void (*execute)(struct slow_work *work);
};

Struktura slow_work je vytvářena volajícím, ale jinak je neprůhledná. Skutečná práce se provádí ve struktuře slow_works_ops vytvářené odděleně. Funkci execute() volá kód pomalé práce k vykonání daného úkolu. Předtím se ale volá get_ref(), aby se získala reference na strukturu slow_work. Jakmile se práce dokončí, volání put_ref() tuto referenci vrátí. Položky pomalé práce se mohou nějaký čas poté, co byly předány, ještě potulovat po okolí, takže počítání odkazů je nutné, aby se zajistilo, že budou uvolněny ve správný čas. Implementace funkcí get_ref()put_ref() není volitelná.

Prakticky jaderný kód využívající pomalou práci vytvoří svou vlastní strukturu, která bude obsahovat strukturu slow_work a nějaký druh primitiva pro počítání odkazů. Struktura slow_work() musí být inicializována jedním z následujících:

void slow_work_init(struct slow_work *work, const struct slow_work_ops *ops);
void vslow_work_init(struct slow_work *work, const struct slow_work_ops *ops);

Rozdíl mezi těmito dvěma spočívá v tom, že vslow_work_init() úkol identifikuje jako „velmi pomalou práci“, od které se očekává, že poběží (nebo bude spát) významné množství času. Dokumentace naznačuje, že zápis do souboru může být „pomalá práce“, zatímco „velmi pomalá práce“ může být sekvence vyhledávání souborů, jejich vytváření a operací mkdir(). Kód pomalé práce upřednostňuje „velmi pomalou práci“ nad pouze pomalou, ale jenom do bodu, kdy využívá 50 % (výchozí nastavení) dostupných vláken. Jakmile běží maximální počet velmi pomalých úloh, vykonají se pouze úkoly „pomalé práce“.

Skutečné spuštění úlohy pomalé práce se provede voláním:

int slow_work_enqueue(struct slow_work *work);

Tato funkce naplánuje úlohu k běhu. Uspěje, pokud neselže s ní spojená funkce get_ref(), v takovém případě je vráceno -EAGAIN.

Úlohy pomalé práce lze naplánovat několikrát, ale neexistuje žádný čítač, takže úloha naplánovaná několikrát před svým spuštěním proběhne pouze jednou. Úloha, která je naplánována, když běží, je opravdu vložena zpět do fronty pro pozdější opětovné spuštění. Je garantováno, že stejná úloha nepoběží simultánně na několika CPU.

Není žádný způsob, jak z fronty odstranit naplánované úlohy, a není žádný způsob (zabudovaný do mechanismu pomalé práce), kterým by bylo možné čekat na dokončení těchto úloh. Funkci „vyčkej na dokončení“ může zajisté vytvořit volající, pokud ji potřebuje. Obecný předpoklad nicméně je, že položky pomalé práce mohou přetrvávat neomezeně dlouho. Dokud existují úlohy s nenulovým počtem odkazů, všechny zdroje, na kterých závisí, musí zůstat dostupné.

V /proc/sys/kernel/slow-work jsou tři parametry, kterými lze řídit pomalou práci: min-threads (minimální velikost fondu), max-threads (maximální velikost) a vslow-percentage (maximální procento dostupných vláken, které lze použít pro „velmi pomalé“ úlohy). Výchozí nastavení je mezi dvěma a čtyřmi vlákny, z nichž 50 % může spouštět „velmi pomalé“ úlohy.

Jediný uživatel pomalé práce v jádře 2.6.30 je cachovací souborový systém FS-Cache. Funkce fondu vláken je nicméně zjevně zapotřebí, takže nebude překvapivé, když se v budoucích vydáních objeví další uživatelé. Co by bylo více překvapující (nicméně žádané) by byla konzolidace implementací fondu vláken v budoucím vývojovém cyklu.

DRBD: Distribuované blokové zařízení

link

Originál tohoto článku pro lwn.net napsal Goldwyn Rodrigues

Základem vysoké dostupnosti jsou tři R: redundance, redundance a redundance. Nicméně na typické sestavě vytvořené z běžného hardwaru není možné dosáhnout redundance nad určitý limit tak, aby se počet devítek vaší dostupnosti (tj. 99,999 %) zvýšil. Vezměme jednoduchý příklad: iSCSI server s clusterovými uzly používající distribuovaný systém, jako je GFS2 nebo OCFS2. I s redundantním napájením a datovými kanály na úložném iSCSI serveru je zde bod selhání: úložiště.

Patch distribuovaného replikovaného blokového zařízení [distributed replicated block device, DRBD] vyvinutý firmou Linbit zavádí síťové duplikované blokové úložiště se synchronní replikací dat. Jestliže jeden z úložných uzlů v replikovaném prostředí selže, systém má další blokové zařízení, na které se může spolehnout a bezpečně na něj přepnout. V krátkosti to lze považovat z implementaci RAID1 zrcadlení používajícího kombinaci místního disku a vzdáleného uzlu, ale s lepší integrací s clusterovým softwarem, jako je heartbeat, a efektivní resynchronizací se schopností vyměňovat bitmapy špinavých stránek a identifikátorů generace dat. DRBD v současnosti funguje s pouze dvouuzlovými clustery, ale lze použít hybridní verzi, se kterou lze tento limit rozšířit. Když jsou oba uzly aktivní, zápisy se replikují a posílají jak na lokální disk, tak na druhý uzel. Z důvodů efektivity se čte z lokálního disku.

Úroveň párování dat záleží na zvoleném protokolu:

DRBD klasifikuje clusterové uzly jako "primární" nebo "sekundární". Primární uzly mohou zahájit modifikace nebo zápisy, zatímco sekundární uzly ne. To znamená, že sekundární DRBD uzel neposkytuje žádný přístup a nelze ho připojit. Z důvodů koherence cache je zakázán i přístup pouze pro čtení. Sekundární uzel je přítomen hlavně k tomu, aby sloužil jako záložní zařízení v případě chyby. V závislosti na konfiguraci sítě se sekundární uzel může stát primárním. Přiřazování rolí provádí software pro správu clusteru.

Jsou dva způsoby, jakými lze uzel označit jako primární:

Pracovní vlákna

link

Aby bylo možné se vyhnout komplexním problémům návrhu a deadlockům, je část komunikace mezi uzly obsluhována vlákny. Tato vlákna používaná pro komunikaci jsou:

Selhání

link

DRBD potřebuje malou rezervní oblast pro metadata, aby mohlo řešit operace po selhání (jako je například resynchronizace) efektivně. Tuto oblast lze konfigurovat buď na odděleném zařízení (externí metadata), nebo na blokovém zařízení (interní metadata) DRBD. Metadata drží s ohledem na disk, včetně logu aktivity a bitmapě špinavých stránek (popsáno níže.)

Selhání uzlu

link

Jestliže sekundární uzel odumře, systém jako celek to neovlivní, protože sekundární uzel neiniciuje zápisy. Jestliže selhal primární uzel, data k zapsání na disk, pro která nebyla přijata potvrzení, se mohou ztratit. Aby se tomu vyhnulo, udržuje DRBD "log aktivity"; rezervovanou oblast na lokálním disku, která obsahuje informace o operacích zápisu, jež nebyly dokončeny. Data uložená v jeho rozsazích [extents] jsou udržována v seznamu typu nejdéle nepoužité [least recently used, LRU]. Každá změna v logu aktivity způsobí aktualizaci metadat (zápis jediného sektoru). Velikost logu aktivity je nastavena uživatelem; určuje zde podíl mezi minimalizací aktualizací metadat a času resynchronizace dat po pádu primárního uzlu.

DRBD udržuje "bitmapu špinavých stránek" pro případ, že musí běžet bez uzlu – protějšku nebo bez lokálního disku. Popisuje stránky, které místní uzel zašpinil. Zápisy do bitmapy jsou minimalizovány logem aktivity. Pokaždé, když je rozsah odstraněn z logu aktivity, část bitmapy s ním spojená, která již logem není pokryta, je zapsána na disk. Bitmapy špinavých stránek se posílají přes síť, aby se sdělilo, které stránky jsou špinavé, pokud by byla nutná resynchronizace. Bitmapy jsou před odesláním na síť komprimovány (použitím run-length kódování), aby se omezila režie sítě. Vzhledem k tomu, že je většina map rozptýlená, ukazuje se, že je to poměrně efektivní.

DRBD synchronizuje data, jakmile se spadlý uzel zaktivuje nebo v reakci na nekonzistence způsobené přerušeným spojením. Synchronizace se provádí v lineárním pořadí podle posunu [offset] na disku ve stejném rozvržení disku, jako má konzistentní uzel. Tempo synchronizace lze nakonfigurovat parametrem rate v konfiguračním souboru DRBD.

Selhání disku

link

V případě chyb lokálního disku si systém může vybrat z následujících tří způsobů řešení v závislosti na konfiguraci:

Problémy s nekonzistencí dat

link

V případě dvojité primární konfigurace mohou oba uzly zapsat do stejného sektoru na disku, následkem čehož data nebudou konzistentní. U zápisů na různé offsety není potřeba žádná synchronizace. Aby se odstranily problémy s nekonzistencí,jsou datové pakety pro síť sekvenčně číslovány, aby se určilo pořadí zápisů. Je zde nicméně krajní případ problémů s nekonzistencí, kterým může systém trpět:

Závěr

link

DRBD není jediná implementace distribuovaného úložiště ve vývoji. Implementace distribuovaného úložiště [distributed storage, DST], kterou přispěl Jevgenij Poljakov a která byla přijata do stromu staging, používá jiný přístup. DRBD je omezeno na clustery z 2 aktivních uzlů, zatímco DST může mít větší počet uzlů. DST funguje s klient-server modelem, kde úložiště je server, zatímco DRBD je založeno na principu protějšek-protějšek a navrženo pro vysokou dostupnost v porovnání s distribuovaným úložištěm. DST je na druhou stranu navrženo pro akumulující ukládání, kde lze úložné uzly přidávat podle potřeby. DST umožňuje připojování modulů, kterými akceptuje různé algoritmy pro mapování úložných uzlů do kumulativního úložiště. Zvolený algoritmus může být zrcadlení, které by poskytovalo stejné základní schopnosti replikovaného úložiště jako DRBD.

Kód DRBD je spravován v gitovém repozitáři na git://git.drbd.org/linux-2.6-drbd.git ve větvi drbd. Obsahuje menší komentáře z revizí zaslané na LKML, které byly přidány poté, co Philipp Reisner sadu patchů vydal. Další informace vizte v několika PDF dokumentech zmíněných v zaslání DRBD patchů.

Související články

Jaderné noviny – 15. 4. 2009
Jaderné noviny – 8. 4. 2009
Jaderné noviny - 1. 4. 2009
Jaderné noviny - 25. 3. 2009

Odkazy a zdroje

Kernel coverage at LWN.net: April 22, 2009

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

Jaderné noviny – přehled za duben 2026
Jaderné noviny – přehled za březen 2026
Jaderné noviny – přehled za únor 2026
Jaderné noviny – přehled za leden 2026
Jaderné noviny – přehled za prosinec 2025

Diskuse k tomuto článku

3.6.2009 11:37 polish
Rozbalit Rozbalit vše Re: Jaderné noviny – 22. 4. 2009
Odpovědět | Sbalit | Link | Blokovat | Admin
Krasne popsane drbd.

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