Facebook Cinder s otvoreným zdrojom, fork CPythonu, ktorý používa Instagram

Facebook zverejnil zdrojový kód pre Project Cinder, fork CPythonu 3.8.5, hlavnej referenčnej implementácie programovacieho jazyka Python. Cinder sa používa v produkčnej infraštruktúre Facebooku na podporu Instagramu a zahŕňa optimalizácie na zlepšenie výkonu.

Kód je zverejnený s cieľom diskutovať o možnosti portovania pripravených optimalizácií do hlavného rámca CPython a pomôcť ďalším projektom zapojeným do zlepšovania výkonu CPythonu. Facebook nemieni podporovať Cinder formou samostatného open source projektu a kód je prezentovaný v podobe, v akej sa používa v infraštruktúre spoločnosti, bez dodatočného česania a dokumentácie. Taktiež sa nesnažia propagovať Cinder ako alternatívu k CPythonu – hlavným cieľom vývoja je túžba vylepšiť samotný CPython.

Kód Cinder je známy ako pomerne spoľahlivý a testovaný v produkčnom prostredí, ale ak sa zistia problémy, budete ich musieť vyriešiť sami, pretože Facebook nezaručuje, že bude reagovať na externé chybové správy a žiadosti o stiahnutie. Facebook zároveň nevylučuje konštruktívnu spoluprácu s komunitou a je pripravený diskutovať o nápadoch, ako Cinder ešte zrýchliť alebo ako urýchliť prenos pripravovaných zmien do hlavnej časti CPythonu.

Hlavné optimalizácie implementované v Cinder:

  • Inline ukladanie bajtkódu do vyrovnávacej pamäte („tieňový bajtový kód“). Podstatou metódy je identifikovať situácie, v ktorých sa vykonáva typický operačný kód, ktorý je možné optimalizovať, a dynamicky nahradiť takýto operačný kód rýchlejšími špecializovanými možnosťami (napríklad nahradenie často volaných funkcií).
  • Dychtivé hodnotenie korutínom. Pre asynchrónne volania funkcií, ktoré sú spracované okamžite (čakanie nevedie k čakaniu a funkcia dosiahne príkaz return skôr), je výsledok takýchto funkcií priamo nahradený bez vytvorenia korutíny alebo zapojenia slučky udalostí. V kóde Facebooku, ktorý vo veľkej miere využíva async/wait, má optimalizácia za následok zrýchlenie približne o 5 %.
  • Selektívne zostavovanie JIT na úrovni jednotlivých metód a funkcií (method-at-a-time). Aktivuje sa pomocou možnosti „-X jit“ alebo premennej prostredia PYTHONJIT=1 a umožňuje vám zrýchliť vykonávanie mnohých testov výkonu 1.5 až 4-krát. Keďže kompilácia JIT je relevantná len pre často vykonávané funkcie, nie je vhodné ju používať pre zriedkavo používané funkcie, ktorých réžia kompilácie môže len spomaliť vykonávanie programu.

    Prostredníctvom voľby „-X jit-list-file=/path/to/jitlist.txt“ alebo premennej prostredia „PYTHONJITLISTFILE=/path/to/jitlist.txt“ môžete zadať súbor so zoznamom funkcií, pre ktoré JIT možno použiť (formát cesty .k.modulu:názov_funkcie alebo cesta.k.modulu:Názov_triedy.názov_metódy). Zoznam funkcií, pre ktoré by mal byť povolený JIT, možno určiť na základe výsledkov profilovania. V budúcnosti sa očakáva podpora dynamickej JIT kompilácie na základe internej analýzy frekvencie volaní funkcií, no s prihliadnutím na špecifiká spúšťania procesov na Instagrame je JIT kompilácia v počiatočnej fáze vhodná aj pre Facebook.

    JIT najprv konvertuje bajtový kód Pythonu na strednú reprezentáciu na vysokej úrovni (HIR), ktorá je pomerne blízka bajtovému kódu Pythonu, ale je navrhnutá tak, aby používala virtuálny stroj založený na registroch namiesto toho, ktorý je založený na zásobníku, a používa aj informácie o type a ďalšie detaily kritické pre výkon (ako napríklad počítanie referencií) . HIR sa potom prevedie do formy SSA (statické jednorazové priradenie) a prechádza optimalizačnými krokmi, ktoré zohľadňujú výsledky počítania referencií a údaje o spotrebe pamäte. Výsledkom je, že sa vygeneruje nízkoúrovňová stredná reprezentácia (LIR), blízka jazyku symbolických inštrukcií. Po ďalšej fáze optimalizácií na báze LIR sa pomocou knižnice asmjit vygenerujú pokyny na zostavenie.

  • Prísny režim pre moduly. Funkcionalita zahŕňa tri komponenty: Type StrictModule. Statický analyzátor, ktorý dokáže určiť, že spustenie modulu nemá žiadny vplyv na kód mimo tohto modulu. Zavádzač modulov, ktorý určí, že moduly sú v prísnom režime (kód špecifikuje „import __strict__“), skontroluje neprítomnosť priesečníkov s inými modulmi a načíta prísne moduly do sys.modules ako objekt StrictModule.
  • Static Python je experimentálny kompilátor bajtového kódu, ktorý používa typové anotácie na generovanie typovo špecifického bajtového kódu, ktorý beží rýchlejšie vďaka kompilácii JIT. V niektorých testoch kombinácia statického Pythonu a JIT vykazuje až 7-násobné zlepšenie výkonu v porovnaní so štandardným CPythonom. V mnohých situáciách sa odhaduje, že výsledky sa blížia použitiu kompilátorov MyPyC a Cython.

Zdroj: opennet.ru

Pridať komentár