abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 16:44 | Nová verze

    Byl vydán Mozilla Firefox 127.0. Přehled novinek v poznámkách k vydání, poznámkách k vydání pro firmy a na stránce věnované vývojářům. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 127 je již k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    dnes 15:11 | Nová verze

    Byla vydána (𝕏) nová verze 9.5 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    dnes 11:44 | IT novinky

    Společnost Raspberry Pi dnes vstoupila na Londýnskou burzu jako Raspberry Pi Holdings plc (investor).

    Ladislav Hagara | Komentářů: 0
    dnes 01:22 | IT novinky

    Do 17. června do 19:00 běží na Steamu přehlídka nadcházejících her Festival Steam Next | červen 2024 doplněná demoverzemi, přenosy a dalšími aktivitami. Demoverze lze hrát zdarma.

    Ladislav Hagara | Komentářů: 0
    včera 22:33 | IT novinky

    Apple na své vývojářské konferenci WWDC24 (Worldwide Developers Conference, keynote) představil řadu novinek: svou umělou inteligenci pojmenovanou jednoduše Apple Intelligence, iOS 18, visionOS 2, macOS Sequoia, iPadOS 18, watchOS 11, …

    Ladislav Hagara | Komentářů: 8
    včera 21:44 | Nová verze

    Vyšla nová verze XMPP (Jabber) klienta Gajim, která přidává podporu reakcí pomocí emoji (XEP-0444: Message Reactions) a citace zpráv (XEP-0461: Message Replies). Přehled dalších vylepšení je k dispozici na oficiálních stránkách.

    sonicpp | Komentářů: 1
    včera 15:00 | Nová verze

    Po po téměř roce vývoje od vydání verze 5.38 byla vydána nová stabilní verze 5.40 programovacího jazyka Perl (Wikipedie). Do vývoje se zapojilo 75 vývojářů. Změněno bylo přibližně 160 tisíc řádků v 1 500 souborech. Přehled novinek a změn v podrobném seznamu.

    Ladislav Hagara | Komentářů: 7
    včera 12:00 | Zajímavý článek

    Uroš Popović popisuje, jak si nastavit Linux na desce jako Raspberry Pi Zero, aby je šlo používat jako USB „flešku“.

    Fluttershy, yay! | Komentářů: 1
    včera 08:44 | Zajímavý software

    Andreas Kling oznámil, že jelikož už se nevěnuje nezávislému operačnímu systému SerenityOS, ale výhradně jeho webovému prohlížeči Ladybird, přičemž vyvíjí primárně na Linuxu, SerenityOS opustí a Ladybird bude nově samostatný projekt (nový web, repozitář na GitHubu).

    Fluttershy, yay! | Komentářů: 2
    včera 02:22 | Nová verze

    Po dvou měsících vývoje byla vydána nová verze 0.13.0 programovacího jazyka Zig (GitHub, Wikipedie). Přispělo 73 vývojářů. Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    Rozcestník

    Jaderné noviny - 4. 2. 2009

    6. 3. 2009 | Jirka Bourek | Jaderné noviny | 2499×

    Aktuální verze jádra: 2.6.29-rc3. Citáty týdne: Gustavo Duartes, Jevgenij Poljakov, James Laska. Dracut se snaží nahradit patche initramfs. Online defragmentace ext4. Zkrocení OOM killera (Proč OOM zabiják? Kdo je špatný? Přesouvání politiky OOM zabíjení do uživatelského prostoru. Nedostatek paměti v embedded systémech).

    Obsah

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

    link

    Současné vývojové jádro 2.6 je stále 2.6.29-rc3. V době psaní tohoto článku bylo od vydání 2.6.29-rc3 začleněno jenom něco přes 500 sad změn; většinou jde o opravy, ale také jsou mezi nimi nějaká vylepšení UBIFS (včetně podpory přímého I/O), ovladač pro PATA řadiče AMD CS5536 a podpora SPARC64 NMI watchdogu. Zkušenosti z minula naznačují, že vydání 2.6.29-rc4 lze očekávat několik milisekund poté, co bude publikována tato stránka.

    Současné stabilní jádro 2.6 je 2.6.28.3 vydané 2. února; ve stejné době bylo vydáno 2.6.27.14. Obě aktualizace obsahují dlouhý seznam oprav vážných problémů.

    V době psaní tohoto článku jsou aktualizace 2.6.28.42.6.27.15 revidovány; pravděpodobné datum vydání je 6. února.

    Citáty týdne: Gustavo Duartes, Jevgenij Poljakov, James Laska

    link

    Jádro je líný zrádný pytel šmejdu; to je základní princip virtuální paměti. Platí pro všechny situace, některé zjevné a některé překvapující, ale pravidlem je, že VMA obsahují informace o tom, co bylo dohodnuto, zatímco PTE ukazují, co ve skutečnosti líné jádro udělalo.

    -- Gustavo Duartes popisuje správu paměti.

    [graf výkonnosti]

    -- Jevgenij Poljakov ukazuje menší výkonnostní rozdíl.

    Pokud neobjevíme devastující problémy přechodu z ext3 na ext4 jako výchozího souborového systému, systémy s nainstalovanou Fedorou 11 budou používat ext4.

    -- James Laska

    Dracut se snaží nahradit patche initramfs

    link

    Vytvoření obrazů initramfs pro použití jádrem v době "časného bootu", je poněkud zmatená záležitost. To je ještě umocněno tím, že každá jednotlivá distribuce má k vytvoření obrazu své vlastní nástroje stejně jako svou vlastní sadu nástrojů uvnitř obrazu. Na Jaderném summitu 2008 Dave Jones strávil nějaký čas diskutováním problému a návrhem začít opětovným vytvořením mezidistribučního initramfs. To vedlo k vzniku projektu Dracut, který v prosinci oznámil Jeremy Katz, a nové mailové konference, vhodně pojmenované "initramfs", ve které o něm lze diskutovat.

    Initramfs je cpio archiv počátečního souborového systému, který je nahrán do paměti, když je zavedeno jádro. Tento souborový systém musí obsahovat všechny ovladače a nástroje potřebné k připojení skutečného kořenového souborového adresáře. Mít initramfs není striktně nutné, minimální /dev společně se všemi potřebnými ovladači zabudovanými do jádra je další alternativa. Všechny distribuce nicméně používají initramfs a postupem času každá přišla se svým způsobem, jak tento proces zvládnout. Davy, Jeremy a další by raději viděli něco standardizovanějšího, co by bylo protlačeno do upstreamu a distribuce by mohly přestat poskakovat okolo tohoto problému.

    Tento přístup má několik výhod. Vytvoření initramfs ze zdrojových kódů jádra by odstranilo problémy, na které občas naráží uživatelé, kteří si překládají vlastní jádro. Jestliže se schéma initramfs v distribuci nějakým způsobem opozdí za tempem vývoje jádra, uživatelé mohou zjistit, že nelze vytvořit kombinaci jádro+initramfs, která by fungovala. Také se doufá, že dracut pomůže urychlit proces bootování použitím udev, jak to říká Jeremy:

    Tím, že se místo toho přesuneme ke způsobu, kde se všechno zakládá na uevent, budeme se snad moci zbavit obrovských zkázonosných shellových skriptů, zrychlit boot a možná se i dostat někam, kde bude možné vytvořit obecnější initramfs s jádrem místo v každém systému jinak.

    Protože je initramfs tak důležitý v počátečních fázích bootu - a tím obtížně laditelný, když nastanou problémy - vznikly obavy z toho, že se bude začínat odznova. Není tedy překvapující, že se objevil nějaký odpor vůči zahození roků těžce nabytých zkušeností, které jsou zabudovány v různých distribučních způsobech práce s initramfs, což Maximiliana Attemse vedlo k otázce:

    Mj. proč vůbec potřebujeme dracut? Tvůj blog obsahuje nějaké narážky proti initramfs-tools, které jsou mnohem lépe testované a prověřené v boji.

    Krom toho, že má více vlastností a je flexibilnější, není v něm natvrdo zadrátované použití udev ani bashe, proč by neměl být zvážen hned zezačátku!?

    To je otázka, která je pokládána často, Davy na ni ale má odpověď:

    "Proč nepoužít ten z Ubuntu?"
    "Proč nepoužít ten ze SUSE?"

    Všechny mají svá pro a proti. Distro X má vlastnost Y, kterou nemá nikdo jiný atd.

    Když tento projekt začal, strávili jsme nějaký čas tím, co mají všichni ostatní a "začněme znovu a doufejme, že se ostatní přidají" se zdálo být atraktivnější, než vzít něco, co existuje, a snažit se to ohnout, aby to vyhovělo.

    Minimálně lidé od Red Hatu tedy pracují s dracutem. Davy nedávno ve svém blogu zaslal hlášení, které shrnulo, co funguje a co je potřeba udělat. I když je to fedorocentrické a několik předpokladů je natvrdo zadrátováno, takže to pravděpodobně zhavaruje na ostatních distrech, opravování je zjevně vysoko na seznamu priorit. Hlášení znamená snahu seznámit s projektem lidi, aby ho mohly začít zkoušet i ostatní distribuce. Davy navíc plánuje začít testování na jiných distribucích sám.

    Ve své současné podobě je dracut vcelku minimalistický. Obsahuje skript pojmenovaný dracut, který vygeneruje zagzipovaný cpio soubor pro obraz initramfs, stejně jako shellový skript init, který v tomto obrazu skončí. Davy říká, že init toho zvládne hodně vzhledem ke svým 119 řádkům: nastaví uzly zařízení, nastartuje udev, počká na to, až se objeví kořenové zařízení, a připojí ho, připojí /proc/sys a další. Jestliže se během tohoto procesu cokoliv pokazí, init spadne do shellu, který umožní diagnózu problému. Zatím podporuje pouze jednodušší případy, co se umístění kořenového souborového systému týče:

    V současnosti dracut podporuje kořenový oddíl pouze přímo na discích (/dev/sda), lvm (/dev/mapper...) a připojení podle názvu [label] nebo uuid. Pokud máte esoteričtější nastavení kořenového souborového systému, jako je například kořenový adresář na NFS, momentálně to ošklivě selže.

    Zbývá pouze jediná překážka, která brání zbavit se nikým neoplakávaného nash, a to je utilita, která by zajistila switch_root (tj. přepnutí do nového kořenového adresáře a spuštění init odtud). V plánu je napsat samostatný nástroj, který by byl přidán do balíku util-linux. Prostředí poskytnuté initramfs by obsahovalo util-linux, bash a používalo glibc, což některým lidem od embedded zařízení příliš nesedlo - ti obecně preferují staticky linkované prostředí busybox. Kay Sievers shrnul důvody pro standardní prostředí:

    Busybox je hezká volba, která umožní záchranu/programování. Rozhodně by měl být poskytován jako volitelný "plugin" pro lidi, kteří ho potřebují. Není ale žádná šance na něm ve výchozím nastavení záviset z úplně stejného důvodu, proč není možné použít klibc ani jinou libc.

    Distra se vším všudy, která své peníze vydělávají podporou, si prostě nemohou dovolit podporovat nástroje překládané odlišně od toho, jak jsou překládány nástroje ve skutečném kořenovém souborovém systému. SUSE používalo klibc v jednom vydání a okamžitě toho nechali, protože když narazíš na sestavách [zákazníků] na problémy při bootu, které nemůžeš s nástroji z reálného kořenového souborového systému reprodukovat, je to ke zbláznění.

    Zbývá toho udělat spousta, aby se z dracutu stal skutečný nástroj pro vytváření obrazů initramfs - přinejmenším takových, které by fungovaly víc než jenom na Fedoře - je potřeba řešit více typů kořenových souborových systémů, je potřeba rozpoznat a reagovat na signatury hibernace, pravidla pro udev je nutné pročistit, je potřeba podporovat obrazy kdump atd. Hlavní otázka ale je: začnou na dracutu pracovat i další distribuce? Pokud Davy (nebo ostatní) dostanou věci do takového stavu, aby dracut alespoň kulhal s Debianem/Ubuntu a/nebo SUSE, přidají se na palubu i tyto distribuce? Zatím není moc důkazů o tom, že by na dracutu pracoval někdo jiný než Red Hat.

    V plánu je nicméně nakonec dracut zaslat do hlavní řady jádra, aby make initramfs fungovalo na standardním jaderném stromě. Zdálo by se, že mnoho jaderných vývojářů vidí potřebu standardizace initramfs a i jeho začlenění do jádra, jak poznamenává Ted Ts'o:

    [...] Takže nápad, který byl zkoumán, bylo přidat běžné mkinitramfs se základními funkcemi do zdrojových kódů jádra s možností, že by různé distribuce přidávaly různá vylepšení, pokud by chtěly. Pokud by jádro chtělo přesunout více funkcí (například v oblasti probouzení z hibernace) z jádra do initramfs, tímto způsobem by to šlo udělat bez toho, aby starší distribuce ztratily možnost používat jádra z kernel.org.

    IMHO je tedy důležité, aby se nejenom v distribucích standardizoval framework initramfs, ale aby byl tento framework zahrnut do zdrojových kódů jádra.

    Nikdo není příliš šťastný ze ztráty své konkrétní verze nástrojů pro vytváření initramfs - i kdyby jenom kvůli tomu, že je na ně zvyklý - ale standardizované řešení je věc, jejíž čas nadešel. Pravděpodobně by bylo jako výchozí bod možné použít kterýkoliv existující nástroj, ale z politických důvodů dává smysl začít odznova. V existujících nástrojích se také vyvinulo mnoho odpadu, na který by se pravděpodobně narazilo, takže jsou zde i technické důvody začít znovu. Nemělo by být překvapením, že projekt, který byl započat Red Hatem, by mohl být ve své počáteční fázi poněkud fedorocentrický, ale zjevným záměrem je distribuční agnosticismus. Zdá se, že přišel čas, kdy by se další distribuce a ostatní zájemci (například z řad embedded) měli zapojit, aby pomohli zformovat dracut do podoby užitečné pro všechny.

    Online defragmentace ext4

    link

    Jakýkoliv souborový systém navržený pro používání na rotujícím médiu musí dávat velký pozor na rozvržení souborů. Jestliže mohou být bloky souboru na zařízení uloženy sekvenčně, lze je číst a zapisovat naráz bez posouvání hlaviček během práce, které má špatný dopad na výkon. I tak se ale i těm nejopatrnějším souborovým systémům občas nezdaří rozvrhnout soubory do minimálního počtu spojitých rozsahů [extent]. Když například soubor roste a bloky těsně za předchozím koncem souboru nejsou k dispozici, souborový systém nemá jinou možnost, než umístit nové bloky někde jinde. Podle toho, jak moc je souborový systém zaplněn, mohou tyto bloky skončit opravdu daleko a tento druh fragmentace může vést k tomu, že se souborové systémy postupem času zpomalí.

    Problémy s fragmentací lze napravit. Nejzjevnější způsob, jak defragmentovat disk, je vytvořit na něm nový souborový systém; konec konců, prázdné souborové systémy s fragmentací problémy nemívají. Nový souborový systém ale bude méně fragmentován, i když je na něm obnoven jeho starý obsah. Když je konečná velikost každého souboru známa dopředu, je relativně jednoduché dospět ke správným rozhodnutím o jejich rozvržení. Správci systémů toto ví a cyklus záloha-obnovení používali po mnoho let jako způsob, jak pročistit příliš fragmentovaný disk.

    Tento přístup má samozřejmě problém, který je ještě větší, než riziko toho, že člověk zjistí, že jeho záloha není tak dobrá, jak si myslel. Výpadek spojený s přepisováním disku může být pro uživatele nevítaný; souborový systém, který je odpojen, reaguje ještě pomaleji než souborový systém s problémy s fragmentací. Bylo by tedy hezké mít způsob, jak defragmentovat souborový systém a přitom ho mít stále připojen a k dispozici. Tato defragmentace za běhu [online defragmentation] byla v seznamu "plánovaných vlastností" ext4 po dlouhou dobu; v tuto chvíli je to v podstatě jediná plánovaná vlastnost, která ještě nebyla začleněna do hlavní řady.

    V minulosti došlo k několika pokusům o defragmentaci za běhu, ale ještě se nedostaly přes revize. Akira Fujita nyní přišel s novým patchem defragmentace ext4 za běhu, který by se díky jinému pohledu na problém mohl do hlavní řady dostat. Předchozí pokusy znamenaly rozhraní, ve kterém by aplikace v uživatelském prostoru mohla požádat souborový systém, aby defragmentoval konkrétní soubor tak, že pro něj alokuje nové (spojité) bloky. Ukázalo se, že to znamená naložit jádru příliš mnoho práce; s tímto patchem Akira vytvořil rozhraní, které přesouvá část této práce do uživatelského prostoru.

    V novém schématu defragmentační démon v uživatelském prostoru vybere soubor, který je podle jeho mínění příliš rozprostřen na disku. Démon potom začne s vytvářením nového, méně fragmentovaného souboru, kterým by ten původní nahradil. Provádí se to vytvořením nového dočasného souboru na stejném souborovém systému, potom jeho vymazáním [unlink] (s tím, že popisovač je stále otevřen). Potom lze použít volání fallocate(), které do nového souboru přidá potřebný počet bloků. Jakmile má nový soubor správnou velikost, může démon použít ioctl() FS_IOC_FIEMAP, aby zjistil, z kolika rozsahů (fragmentů) se tento soubor skládá. Jestliže nový soubor neznamená oproti původnímu zlepšení, démon by ho měl prostě zavřít a vzdát se; souborový systém prostě nemá dostatečné množství spojitého místa.

    V tomto bodě by démon mohl jednoduše zkopírovat starý soubor do nového a potom umístit nově defragmentovanou verzi na místo starého. Problémy s tímto přístupem zahrnují výkonnost (všechna data musí být kopírována přes uživatelský prostor) a robustnost. Jestliže jiný proces změní soubor během kopírování, nový soubor může tyto změny ztratit. A skutečně - pokud má nějaký proces starý soubor otevřený, nemusí si vůbec všimnout, že dochází k výměně. Je tedy potřeba něco chytřejšího.

    Akirův patch tyto problémy řeší vytvořením nového, kouzelného ioctl volání pro ext4. Defragmentující aplikace musí vyplnit strukturu jako:

    struct move_extent {
        int org_fd;           /* původní popisovač souboru */
        int dest_fd;          /* cílový popisovač souboru */
        ext4_lblk_t start;    /* logický offset org_fd a dest_fd*/
        ext4_lblk_t len;      /* délka měněného bloku */
    };

    Tato struktura, když je předána novému ioctl() EXT4_IOC_DEFRAG, vyjadřuje požadavek, že má jádro přesunout len bloků z původního souboru počínaje pozicí start. V podstatě zkopíruje data odpovídající rozsahu do (kompletně alokovaného a hezky spojitého) prostoru v novém souboru a potom provede kouzelné prohození bloků. Tyto spojité bloky z nového souboru jsou patchovány do starého souboru, zatímco fragmentované bloky jsou naopak vloženy do nového souboru. Jakmile je tímto způsobem ošetřen celý soubor, je defragmentován, aniž by se viditelně cokoliv přesunulo.

    Posledním krokem je smazání "nového" souboru, který nyní obsahuje bloky "starého" souboru. Vzhledem k tomu, že soubor byl smazán, souborový systém si vezme staré bloky zpátky poté, co je úloha dokončena. Pro zvědavce Akira zaslal zdrojový kód pro defragmentační nástroj v uživatelském prostoru, který ukazuje, jak toto rozhraní použít.

    Proti novému kódu nebylo mnoho námitek. Chris Mason podotkl, že systém provede nehezké věci, pokud se změní rozvržení swapovacího souboru. O tomto problému zjevně přemýšlel - v takovém rozsahu, že:

    Btrfs to v současnosti obchází tím, že zahazuje podporu bmap, takže swapovací soubory na btrfs vůbec nebudou fungovat. Je potřeba dlouhodobé řešení ;)

    Krom toho jsou zde nějaké menší záležitosti, jako je definice ABI v typech jako int místo na architektuře nezávislých typech. Byla požadována oddělená čísla bloků pro zdroj a cíl; tato vlastnost by pomohla vývojářům pracujícím na systémech s hierarchickým ukládáním. Možnost řídit alokaci bloků by byla užitečná v situacích, kde lze vylepšit výkonnost seskupením souvisejících souborů na disku.

    Také by mohlo mít cenu najít způsob, jak přesunout většinu této funkce do vrstvy VFS, kde by ji mohly použít i další souborové systémy; to by se ale mohlo ukázat jako složitý úkol a správce ext4 Ted Ts'o příliš netouží to zkoušet.

    Přes tyto menší záležitosti se zdá, že se ext4 blíží k přidání tolik žádané vlastnosti defragmentace zaživa.

    Zkrocení OOM killera

    link

    Originál tohoto článku napsal Goldwyn Rodrigues.

    Při zoufalém nedostatku paměti se nastartuje zabiják při nedostatku paměti [out-of-memory (OOM) killer] a použitím sady heuristik, které se během doby vyvíjely, vybere proces, který zabije. To může být protivné uživatelům, kteří by možná chtěli, aby byl zabit jiný proces. Zabitý proces také může být z hlediska systému důležitý. Mnoho vývojářů má pocit, že je potřeba větší kontrola nad aktivitami OOM zabijáka, abychom se vyhnuli předčasnému zesnutí špatných procesů.

    Proč OOM zabiják?

    link

    Jádra hlavních distribucí nastavují výchozí hodnotu /proc/sys/vm/overcommit_memory na nulu, což znamená, že procesy mohou požadovat víc paměti, než je v současnosti v systému volné. To se dělá na základě heuristiky, že alokovaná paměť se nepoužívá okamžitě a že procesy během svého života nespotřebují veškerou paměť, kterou alokují. Bez přetěžování [overcommit] systém plně nevyužije svou paměť a částí se tedy bude plýtvat. Přetěžování paměti dovolí systému používat ji efektivněji, ale může vést k OOM situacím. Na paměť náročné programy mohou paměť systému vyčerpat, takže se zadrhne a zastaví. Může to vést k situaci, kdy je tak málo paměti, že uživatelskému procesu nelze alokovat ani jedinou stránku, takže správce nemůže zabít vhodnou úlohu, a že jádro nemůže provést důležité úkoly, jako je uvolnění paměti. V takové situaci naskočí OOM zabiják a vybere proces, který se stane obětním beránkem pro dobro zbytku systému.

    Uživatelé a správci systému často žádali o způsoby, jakými řídit chování OOM zabijáka. Proto byl zaveden řídící prvek /proc/<pid>/oom_adj, kterým lze zachránit důležité procesy před zabitím a definovat pořadí zabíjení procesů. Přípustné hodnoty oom_adj jsou v rozsahu -17 až +15. Čím vyšší skóre, tím pravděpodobněji bude s ním spojený proces zabit OOM zabijákem. Jestliže je oom_adj nastaveno na -17, proces je OOM zabijákem ignorován.

    Kdo je špatný?

    link

    Proces, který má být zabit v situaci, kdy je nedostatek paměti, je vybrán podle své špatnosti [badness]. Špatnost je zobrazena v /proc/<pid>/oom_score. Tato hodnota je určena na základě toho, že systém ztrácí minimum udělané práce, získá velké množství paměti, nezabije nevinný proces spotřebovávající hodně paměti a zabije minimální počet procesů (pokud možno pouze jeden). Špatnost procesu se počítá z původní velikosti paměti, času CPU (utime + stime), doby běhu (uptime - start time) a hodnoty oom_adj. Čím více paměti proces spotřebovává, tím vyšší skóre. Čím déle je proces v systému naživu, tím menší skóre.

    Jakýkoliv dostatečně nešťastný proces, který je právě v systémovém volání swapoff() (které odstraňuje odkládací soubor ze systému), je k zabití vybrán jako první. Pro ty ostatní se počáteční velikost paměti stane základním skóre špatnosti procesu. Polovina paměti spotřebované potomky je přidána ke skóre rodiče, pokud nesdílí stejnou paměť. Forkující servery jsou tedy prvními kandidáty na zabití. Pokud má rodič pouze jedno "hladové" dítě, je potomek preferován před rodičem. Nakonec je aplikována následující heuristika, aby se zachránily důležité procesy:

    • Jestliže má úloha hodnotu nice vyšší než nula, její skóre se zdvojnásobuje.

    • Procesům superuživatele nebo úlohám s přímým přístupem k hardwaru (CAP_SYS_ADMIN, CAP_SYS_RESOURCE nebo CAP_SYS_RAWIO) se skóre dělí 4. Tento krok je kumulovatelný, tzn. úloze superuživatele, která má přímý přístup k hardwaru, se skóre dělí 16.

    • Jestliže se stav nedostatku paměti stal na jedné sadě cpu [cpuset], ale kontrolovaná úloha do této sady nepatří, její skóre se dělí 8.

    • Výsledné skóre je násobeno oom_adj-tou mocninou dvou (tj. body <<= oom_adj, když je kladné, a body >>= :-(oom_adj), když ne).

    Poté je vybrána úloha s nejvyšším skóre a její potomci zabiti. Proces sám bude zabit v případě, že nemá potomky.

    Přesouvání politiky OOM zabíjení do uživatelského prostoru

    link

    /proc/<pid>/oom_score je dynamická hodnota, která se během času mění a není flexibilní podle rozdílných a dynamických politik, které potřebuje správce systému. Je obtížné odhadnout, který proces bude v případě OOM situace zabit. Správce musí přenastavit skóre pro každý vytvořený proces a pro každý proces, který skončí. To může být na systému s rychle vytvářenými procesy poměrně obtížné. Aby se pokusil zjednodušit implementaci politiky OOM zabijáka, navrhl Jevgenij Poljakov na jménech založené řešení. S jeho patchem je proces, který má zemřít první, ten, který spustil program, jehož jméno je v /proc/sys/vm/oom_victim. Na jménech založené řešení má ale svá omezení:

    • Jméno úlohy není spolehlivý indikátor skutečného jména a je v poli jména procesu zkráceno. Krom toho s různě pojmenovanými symlinky na spustitelné binární soubory to nebude fungovat.

    • Tento přístup umožňuje specifikovat pouze jedno jméno, čímž vylučuje možnost vytvoření hierarchie.

    • Může běžet několik procesů stejného jména, ale z jiného binárního souboru.

    • Chování se nijak nemění od současné výchozí implementace, pokud neexistuje proces žádného jména, které je definováno v /proc/sys/vm/oom_victim. Zvyšuje to počet hledání, která jsou potřeba k nalezení oběti.

    Alanu Coxovi se toto řešení nelíbilo, naznačil, že nejvhodnějším způsobem, jak přistoupit k problému, jsou kontejnery. Jako reakci na tento návrh zaslal Nikanth Karthikesan oom_killer controller, který poskytuje možnost řízení sekvence procesů, které mají být zabity, když systému dojde paměť. Patch zavádí kontrolní skupinu (cgroup) OOM s polem oom.priority. Proces, který má být zabit, je vybrán ze seznamu procesů, které mají nejvyšší hodnotu oom.priority.

    Pro převzetí kontroly nad OOM zabijákem je potřeba připojit pseudosouborový systém OOM zavedený patchem:

    # mount -t cgroup -o oom oom /mnt/oom-killer

    Adresář OOM zabijáka obsahuje seznam všech procesů v souboru tasks a jejich OOM prioritu v oom.priority. Ve výchozím stavu je oom.priority nastaveno na jedna.

    Když chcete vytvořit zvláštní kontrolní skupinu obsahující seznam procesů, které by jako první měly být středem pozornosti OOM zabijáka, vytvořte pod /mnt/oom-killer adresář, který je bude reprezentovat:

    # mkdir beranci

    Nastavte hodnotu oom.priority na dostatečně vysokou hodnotu:

     # echo 256 > /mnt/oom-killer/beranci/oom.priority

    oom.priority je 64bitový unsigned integer a může obsahovat maximální hodnotu, kterou takové číslo může držet. Když hledá procesy, které mají být zabity, vybírá OOM zabiják proces ze seznamu úloh s nejvyšší hodnotou oom.priority.

    PID procesu lze přidat do seznamu úloh takto:

    # echo <pid> > /mnt/oom-killer/beranci/tasks

    Pokud chcete vytvořit seznam procesů, které OOM zabijákem nebudou zabity, vytvořte adresář, který bude obsahovat jejich seznam:

    # mkdir neznicitelni

    Nastavení oom.priority na nulu vyjme všechny procesy v této kontrolní skupině ze seznamu cílů k zabití.

    # echo 0 > /mnt/oom-killer/neznicitelni/oom.priority

    Více procesů lze do této skupiny přidat zapsáním jejich pid do seznamu úloh nezničitelné skupiny:

    # echo <pid> > /mnt/oom-killer/neznicitelni/tasks

    Důležité procesy jako databáze a jejich řízení lze přidat do této skupiny, takže je OOM zabiják bude ignorovat, když hledá procesy k zabití. Všichni potomci procesu v seznamu jsou automaticky přidáni do stejné kontrolní skupiny a dědí oom.priority rodiče. Když má několik úloh stejnou nejvyšší hodnotu oom.priority, OOM zabiják vybere proces podle oom_scoreoom_adj.

    Tento přístup se ale nelíbí uživatelům sad CPU [cpusets]. Uvažme dvě sady CPU, A a B. Jestliže proces v sadě CPU A má vysokou hodnotu oom.priority, bude zabit, když sadě CPU B dojde paměť, i když sada CPU A jí má dost. Kvůli tomu je potřeba jiný návrh, jak zkrotit OOM zabijáka.

    Zajímavým výsledkem diskuze bylo řešení OOM situací v uživatelském prostoru. Jádro zašle upozornění do uživatelského prostoru a aplikace zareagují zahozením svých cache v uživatelském prostoru. V případě, že procesy v uživatelském prostoru nejsou schopny uvolnit dostatek paměti nebo požadavek jádra na uvolnění paměti ignorují, jádro se uchýlí ke staré dobré metodě zabijení procesů. mem_notify, které vyvinul Kosaki Motohiro, je jeden takový pokus z minulosti. Patch mem_notify nicméně nelze aplikovat na verze jádra po 2.6.28, protože se změnil postup znovuzískávání paměti ve správě paměti, ale návrhové principy a cíle lze převzít. David Rientjes navrhuje mít jedno nebo dvě hybridní řešení:

    Jedno je kontrolní skupina OOM notifikátoru, která umožní připojit úlohu čekající na OOM situaci ke skupině úloh. To uživatelskému prostoru umožňuje reagovat na tuto situaci zahozením cache, přidáváním uzlů do sad CPU, posunutím limitů řízení paměti, vysláním signálu atd. Také se může vrátit zpět k jadernému OOM zabijákovi, když nebude jiná možnost.

    Druhým je /dev/mem_notify, které umožňuje tázat se pomocí poll() na souboru zařízení a informovat se na události nedostatku paměti. To může zahrnovat OOM oznamovač kontrolní skupiny, když sadě úloh zcela dojde paměť, ale také varovat, když se taková situace blíží. Navrhuje, aby se toto implementovalo jako klient kontrolních skupin, takže by za různé skupiny úloh mohly být odpovědné různé obsluhy.

    Většina vývojářů preferuje udělat z /dev/mem_notify klienta kontrolních skupin. To lze dále rozšířit začleněním navrhovaného oom-řadiče [oom-controller].

    Nedostatek paměti v embedded systémech

    link

    Vývojáři Androidu potřebovali větší stupeň kontroly nad situacemi, kdy je nedostatek paměti, protože OOM zabiják nenastartuje, dokud není hodně pozdě v takové situaci, tj. dokud nejsou prázdné všechny cache. Android chtěl řešení, které by se spustilo brzy v případě, že dochází volná paměť. Proto zavedli ovladač "lowmemory", který má pro nedostatek paměti několik hranic. V situaci, kdy je nedostatek paměti a jsou splněny podmínky pro první hranici, na problém jsou upozorněny procesy na pozadí. Neukončují se, ale uloží svůj stav. To ovlivňuje zpoždění při přepínání aplikací, protože aplikace se musí při aktivaci znovu nahrát. Při dalším tlaku lowmemory zabiják zabije nekritické procesy na pozadí, jejichž stav byl uložen při předchozí hranici a nakonec jsou zabíjeny i procesy v popředí.

    Několik spouštěčů [triggers] dává procesům dostatek času uvolnit své cache, protože v OOM situaci nemusí být procesy v uživatelském prostoru vůbec schopné běžet. Může stačit jediná alokace interních struktur jádra nebo výpadek stránky a systému dojde paměť. Předběžné upozornění na situaci nedostatku paměti může předejít vzniku situace, kdy paměť úplně dojde, tak, že aplikace v uživatelském prostoru zareagují na dané upozornění.

    Zabíjení procesů založené na heuristice jádra není optimální řešení a tyto nové snahy nabídnout lepší kontrolu uživateli, aby mohl vybrat proces, který se stane obětním beránkem, jsou kroky k robustnímu návrhu, který dává větší možnosti řízení do rukou uživateli. Může nicméně nějaký čas trvat, než vznikne konsenzus o tom, jak bude konečné řešení vypadat.

           

    Hodnocení: 100 %

            špatnédobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    6.3.2009 11:22 Radek Podgorny | skóre: 16
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009
    Dekuji za super clanek. Precetl jsem ho jak pohadku od zacatku do konce "jednim dechem". ;-)
    6.3.2009 13:00 Filip Jirsák | skóre: 68 | blog: Fa & Bi
    Rozbalit Rozbalit vše Dracut vs. dracut
    V článku je pak Dracut minimálně jednou s velkým D a několikrát s malým. Nevím, zda malé "d" není přímo součást "loga" projektu -- ale osobně bych psal všude velké, protože už mne rozčiluje ta záplava jmen, která se chtějí odlišit tím, že začínají malým písmenem. Ať si klidně mají malé písmeno v logu, ale pokud není v textu vloženo logo jako obrázek, ale je tam název napsán, držel bych se pravidel pravopisu a psal velké písmeno. Ale je to otázka do diskuse, možná většina nebude tak radikální.
    6.3.2009 16:51 trekker.dk | skóre: 72
    Rozbalit Rozbalit vše Re: Dracut vs. dracut
    pokud není v textu vloženo logo jako obrázek, ale je tam název napsán, držel bych se pravidel pravopisu a psal velké písmeno.
    Nejde o žádné logo, všechno byl text - velké či malé D je v daném místě podle toho, jak to bylo v originálu.
    Quando omni flunkus moritati
    6.3.2009 17:09 Filip Jirsák | skóre: 68 | blog: Fa & Bi
    Rozbalit Rozbalit vše Re: Dracut vs. dracut
    Že v tomto případě nejde o logo je mi jasné, to už jsem psal obecně. Jak to bylo v originále s velikostí písmen není pro překlad moc podstatné, protože angličtina má pravidla pro psaní velkých písmen určitě odlišná od češtiny. Jinak ten můj komentář určitě neměl být kritikou (sám píšu náhodně někdy velká a jindy malá písmena u názvů, které jsou oficiálně s malým písmenem). Měla to být jen výzva, zda by nebylo vhodné pro tohle dohodnout nějaké redakční pravidlo, jak takováhle jména psát.
    6.3.2009 18:08 trekker.dk | skóre: 72
    Rozbalit Rozbalit vše Re: Dracut vs. dracut
    Jak to bylo v originále s velikostí písmen není pro překlad moc podstatné, protože angličtina má pravidla pro psaní velkých písmen určitě odlišná od češtiny.
    Což to jo, ale pokud vím, tak v angličtině se velké písmeno vyskytuje častěji než v češtině (např. V Názvu Všechna Velká), takže když už tam bylo malé, nechal jsem to tak. (Jestli k tomu byl nějaký důvod nebo autor psal, jak mu to přišlo pod ruku, to nevím)

    Quando omni flunkus moritati
    Jardík avatar 6.3.2009 19:05 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009
    Z prdele jsem se kouknul do zdrojáku toho defragmentačního nástroje a absolutně nechápu prasárny tohoto typu:
    #define insert(list1, list2)			\
    	do {					\
    		list2->next = list1->next;	\
    		list1->next->prev = list2;	\
    		list2->prev = list1;		\
    		list1->next = list2;		\
    	} while (0)
    
    Smysl toho cyklu se mi nějak vytrácí ...
    Věřím v jednoho Boha.
    6.3.2009 20:00 Karell
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009

    Je to nejspis zpusob jak se vyporadat s tim, ze to vypada jako jeden statement a uzivatel by za to chtel napsat strednik, coz vadi kdyz se to napise pred else. Slozenou zavorkou se cely prikaz uzavre jakoby tam strednik uz byl a tohle je zpusob jak udelat blok, ktery se strednikem uzavrit musi a pak to vypada hezky a uzivatel nemusi resit, ze to je makro.

    Jardík avatar 6.3.2009 21:45 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009
    Tohle by mě nenapadlo. Stejně je to hnusný hack :-)
    Věřím v jednoho Boha.
    6.3.2009 23:38 Miloš Jakubíček
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009
    Pouziva se to uplne bezne a uplne vsude, vcetne jaderneho kodu -- mozna proto, ze zadny jiny zpusob, jak zajistit slusne chovani makra pred else ani neni ;) Viz treba http://mail.nl.linux.org/kernelnewbies/2001-09/msg00230.html
    Jardík avatar 7.3.2009 11:01 Jardík | skóre: 40 | blog: jarda_bloguje
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009
    Doufám, že je alespoň gcc tak schopné a díky optimalizaci to vypustí ...
    Věřím v jednoho Boha.
    9.3.2009 09:55 kokes
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009

    Samozřejmě, že vypustí (a to dokonce i pro úrověň optimalizace -O0). Výsledek překladu typu nahraj nulu do registru, nahraj nulu do dalšího registru, porovnej registry a skoč při neshodě na začátek (či nějak podobně) by byl opravdu dost hloupý.

    9.3.2009 10:12 snehuliak
    Rozbalit Rozbalit vše Re: Jaderné noviny - 4. 2. 2009 - POHMELFS vs NFS

    Kde je popis k POHMELFS? Inak som pozreal na googli a zda sa za randomread nema taky dobry ako NFS, v ostatnych testoch ho predbieha.

    9.3.2009 10:29 snehuliak
    Rozbalit Rozbalit vše Dracut a bash

    Podla mna by mal byt dracut flexibilnejsi, nemyslim si ze bash sa bude pacit napriklad vyvojarom z Ubuntu, ktori na vsetky systemove scripty pouzivaju /bin/sh ktory je v skutocnosti dash. Ale napad je to ozaj dobry a dufam ze sa ostatni pripoja.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.