Facebook malfermfonte Cinder, forko de CPython uzita fare de Instagram

Facebook publikigis la fontkodon por Project Cinder, forko de CPython 3.8.5, la ĉefa referenca efektivigo de la programlingvo Python. Cinder estas uzata en la produkta infrastrukturo de Facebook por funkciigi Instagram kaj inkluzivas optimumojn por plibonigi rendimenton.

La kodo estas publikigita por diskuti la eblecon porti la pretajn optimumigojn al la ĉefa CPython-kadro kaj helpi aliajn projektojn implikitajn en plibonigo de CPython-agado. Facebook ne intencas subteni Cinder en la formo de aparta malfermfonta projekto kaj la kodo estas prezentita en la formo en kiu ĝi estas uzata en la infrastrukturo de la kompanio, sen plia kombado kaj dokumentado. Ili ankaŭ ne provas reklami Cinder kiel alternativon al CPython - la ĉefa celo de evoluo estas la deziro plibonigi CPython mem.

La Cinder-kodo estas rimarkita kiel sufiĉe fidinda kaj provita en produktadmedioj, sed se problemoj estas identigitaj, vi devos solvi ilin mem, ĉar Facebook ne garantias, ke ĝi respondos al eksteraj erarmesaĝoj kaj tirpetoj. Samtempe, Facebook ne ekskludas konstruivan kunlaboron kun la komunumo kaj pretas diskuti ideojn pri kiel fari Cinder eĉ pli rapide aŭ kiel akceli la translokigon de pretaj ŝanĝoj al la ĉefa parto de CPython.

Ĉefaj optimumigoj efektivigitaj en Cinder:

  • Enlinia kaŝmemoro de bajtkodo ("ombra bajtkodo"). La esenco de la metodo estas identigi situaciojn kie tipa opkodo estas efektivigita kiu povas esti optimumigita, kaj dinamike anstataŭigi tian opkodon kun pli rapidaj specialigitaj opcioj (ekzemple, anstataŭigante ofte nomitajn funkciojn).
  • Fervora korutina taksado. Por nesinkronaj funkciovokoj kiuj estas procesitaj tuj (atendu ne rezultigas atendon kaj la funkcio atingas la revenan deklaron pli frue), la rezulto de tiaj funkcioj estas rekte anstataŭigita sen kreado de korutino aŭ implikado de okazaĵbuklo. En Fejsbuka kodo, kiu forte uzas async/waait, la optimumigo rezultigas plirapidigon de ĉirkaŭ 5%.
  • Selektema JIT-kompilo je la nivelo de individuaj metodoj kaj funkcioj (metodo-a-foje). Ebligita per la opcio "-X jit" aŭ la mediovariablo PYTHONJIT=1 kaj ebligas al vi akceli la plenumadon de multaj agado-testoj je 1.5-4 fojojn. Ĉar JIT-kompilo estas grava nur por ofte ekzekutitaj funkcioj, estas ne konsilinde uzi ĝin por malofte uzataj funkcioj, kies kompilo superkompe povas nur bremsi programekzekuton.

    Per la opcio "-X jit-list-file=/path/to/jitlist.txt" aŭ la mediovariablo "PYTHONJITLISTFILE=/path/to/jitlist.txt" vi povas specifi dosieron kun listo de funkcioj por kiuj JIT uzeblas (vojformato .to.module:funcname aŭ path.to.module:ClassName.method_name). La listo de funkcioj por kiuj JIT devus esti ebligita povas esti determinita surbaze de la profilaj rezultoj. Estontece, subteno por dinamika kompilo de JIT estas atendita surbaze de interna analizo de la ofteco de funkciovokoj, sed konsiderante la specifaĵojn de lanĉaj procezoj en Instagram, JIT-kompilo ankaŭ taŭgas por Facebook en la komenca etapo.

    JIT unue konvertas Python-bajtkodon en altnivelan mezan reprezentadon (HIR), kiu estas sufiĉe proksima al Python-bajtkodo, sed estas dizajnita por uzi registri-bazitan virtualan maŝinon anstataŭe de stak-bazita unu, kaj ankaŭ uzas tipinformojn kaj kromajn. rendiment-kritikaj detaloj (kiel referenckalkulado). La HIR tiam estas konvertita al SSA (senmova ununura asigno) formo kaj trapasas optimumigajn paŝojn, kiuj enkalkulas referenckalkulrezultojn kaj memorkonsumajn datumojn. Kiel rezulto, malaltnivela meza reprezentantaro (LIR) estas generita, proksime al asembla lingvo. Post alia fazo de LIR-bazitaj optimumigoj, asembleaj instrukcioj estas generitaj uzante la asmjit-bibliotekon.

  • Strikta reĝimo por moduloj. La funkcieco inkluzivas tri komponantojn: Tajpu StrictModule. Senmova analizilo kiu povas determini ke la ekzekuto de modulo havas neniun efikon al kodo ekster tiu modulo. Modula ŝargilo kiu determinas ke la moduloj estas en strikta reĝimo (la kodo precizigas "import __strict__"), kontrolas la foreston de intersekciĝoj kun aliaj moduloj, kaj ŝarĝas striktajn modulojn en sys.modules kiel StrictModule objekto.
  • Static Python estas eksperimenta bajtkoda kompililo, kiu uzas tipajn komentadojn por generi tipspecifan bajtkodon, kiu funkcias pli rapide danke al JIT-kompilo. En iuj provoj, la kombinaĵo de Static Python kaj JIT montras rendimentajn plibonigojn ĝis 7 fojojn kompare kun norma CPython. En multaj situacioj, la rezultoj estas taksitaj proksimaj al uzado de la MyPyC kaj Cython-kompiloj.

fonto: opennet.ru

Aldoni komenton