Portál AbcLinuxu, 9. května 2025 05:50
Podpora velkého počtu vláken. AccessFS. Řízení názvu souboru s core dumpem.
Do konference přišlo celkem 1481 emailů, nejvíce psali Andrew Morton, Ingo Molnar a William Lee Irwin III.
Ingo Molnar oznámil:
I když ani největší internetové servery zatím neobsluhují milion současně
připojených uživatelů, i mnohem menší počet desíti tisíc vláken způsobí explozi
algoritmu o složitosti O(N^2) ve funkci get_pid()
po vyčerpání
souvislého rozsahu PIDů. Sto tisíc a více vláken pak způsobí zatuhnutí systému
na několik minut. Kromě toho, že algoritmus je pomalý, on se navíc dotýká
spousty cachelines, čímž efektivně vyprázdní cache v CPU.
Existuje spousta patchů, které řeší nejhorší scénář a většinou k tomu
používají dynamicky tvořenou bitmapu, kterou prohledávají => špatný výkon,
ničí cache a je to vůbec ošklivý přístup. Ten problém je velmi složitý, neboť
get_pid()
musí vzít v úvahu nejen PIDy, ale i TGID, session ID a
skupiny procesů.
Až jsem našel jeden patch, který jde správným (ale složitým) směrem: vytváří
obecnou hashovací tabulku pro PIDy, session ID, TGID a process group ID, kterou
správně vytváří a uvolňuje. Tento způsob nejenže poskytuje škálovatelnou a
časově omezenou implementaci get_pid()
, ale navíc odstraňuje
polovinu iterací for_each_process()
, což je také cenné. Nyní
můžeme čistě iterovat skrze všechny procesy ve session group nebo process
group.
Vzal jsem patch, upravil jej pro současné změny, opravil pár chyb a
zprovoznil to. Fungovalo to dobře, pěkná práce Williame! Napsal jsem zcela
novou implementaci alloc_pid()
, která poskytuje alokaci PIDů bez
zamykání a časově omezenou. Nejhorší případ trvá 10 mikrosekund na Pentium IV
bez cache, s cachí dvě mikrosekundy (pid_max je nastaven na 1 000 000).
Například pokud už bylo alokováno 999 999 PIDů, trvá méně než 10 mikrosekund
najít jeden zbývající PID).
William Lee Irwin III, originální autor patche, poděkoval Ingovi za dokončení patche a přenechal mu další vývoj. Nicméně ne všichni vývojáři byli přesvědčeni o užitečnosti patche. Jedním z nich byl i Linus Torvalds, jenž považoval patch za přidávání příliš složitého kódu výměnou za příliš málo. Nicméně byl ochoten jej přídat, pokud bude vyčištěn. Ingo tedy na kódu velmi zapracoval a podstatně jej vylepšil a dále zrychlil. Linus jej na to začlenil do jádra.
Olaf Dietsche napsal nový souborový systém, který umožňuje řídit přístup k systémovým zdrojům. V současnosti ovládá přístup k portům menším než 1024. Díky tomuto patchi již nikdy nebudete muset spouštět internetové démony jako root. Můžete individuálně nastavit, který uživatel/program se smí připojit ke kterému portu. Patch najdete zde.
Michael Sinz napsal patch, díky němuž je možné nastavit název souboru s core dumpem přes sysctl. Takto můžete zvolit místo, kam se budou core dumpy ukládat a pomocí vzorů [pattern] vložit do názvu UID, jméno programu, počítače či PIDu procesu, který způsobil core dump. Toto je velice šikovné pro bezdiskové clustery. Patch je k dispozici zde.
Andrew Morton cítil, že sysctl -w
"kernel.core_name_format=/coredumps/%H-%N-%P.core"
je příliš komplexní a
navrhnul alternativní řešení, nicméně Bill Davidsen s ním nesouhlasil. Podle
něj můžete řídit i takové vlastnosti, jako výběr adresáře, kam se budou ukládat
dumpy. Líbila se mu flexibilita, kterou tento patch dává administrátorům. To
dalo smysl Andrewovi a Michael byl okouzlen nápadem používat jméno programu
jako adresář.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.