Facebook oopbron Cinder, 'n vurk van CPython wat deur Instagram gebruik word

Facebook het die bronkode vir Project Cinder gepubliseer, 'n vurk van CPython 3.8.5, die hoofverwysingsimplementering van die Python-programmeertaal. Cinder word in Facebook se produksie-infrastruktuur gebruik om Instagram aan te dryf en sluit optimaliserings in om werkverrigting te verbeter.

Die kode word gepubliseer om die moontlikheid te bespreek om die voorbereide optimaliserings na die hoof-CPython-raamwerk oor te dra en om ander projekte te help wat betrokke is by die verbetering van CPython-prestasie. Facebook is nie van plan om Cinder te ondersteun in die vorm van 'n aparte oopbronprojek nie en die kode word aangebied in die vorm waarin dit in die maatskappy se infrastruktuur gebruik word, sonder bykomende kam en dokumentasie. Hulle probeer ook nie om Cinder as 'n alternatief vir CPython te bevorder nie - die hoofdoel van ontwikkeling is die begeerte om CPython self te verbeter.

Die Cinder-kode word beskou as redelik betroubaar en getoets in produksie-omgewings, maar as probleme geïdentifiseer word, sal jy dit self moet oplos, aangesien Facebook nie waarborg dat dit op eksterne foutboodskappe en trekversoeke sal reageer nie. Terselfdertyd sluit Facebook nie konstruktiewe samewerking met die gemeenskap uit nie en is gereed om idees te bespreek oor hoe om Cinder nog vinniger te maak of hoe om die oordrag van voorbereide veranderinge na die hoofgedeelte van CPython te bespoedig.

Belangrikste optimaliserings wat in Cinder geïmplementeer is:

  • Inlyn-kas van greepkode ("skadubytekode"). Die essensie van die metode is om situasies te identifiseer waar 'n tipiese op-kode uitgevoer word wat geoptimaliseer kan word, en om so 'n op-kode dinamies te vervang met vinniger gespesialiseerde opsies (byvoorbeeld die vervanging van gereeld genoem funksies).
  • Ywerige koroutine-evaluering. Vir asynchrone funksie-oproepe wat onmiddellik verwerk word (wag lei nie tot 'n wag nie en die funksie bereik die terugkeerstelling vroeër), word die resultaat van sulke funksies direk vervang sonder om 'n koroutine te skep of 'n gebeurtenislus te betrek. In Facebook-kode wat baie async/wag ​​gebruik, lei die optimalisering tot 'n versnelling van ongeveer 5%.
  • Selektiewe JIT-samestelling op die vlak van individuele metodes en funksies (metode-op-'n-tyd). Geaktiveer via die "-X jit" opsie of die PYTHONJIT=1 omgewingsveranderlike en laat jou toe om die uitvoering van baie prestasietoetse met 1.5-4 keer te bespoedig. Aangesien JIT-samestelling slegs relevant is vir funksies wat gereeld uitgevoer word, is dit nie raadsaam om dit te gebruik vir funksies wat selde gebruik word nie, waarvan die samestelling bokoste slegs die uitvoering van die program kan vertraag.

    Via die opsie “-X jit-list-file=/path/to/jitlist.txt” of die omgewingsveranderlike “PYTHONJITLISTFILE=/path/to/jitlist.txt” kan jy 'n lêer spesifiseer met 'n lys funksies waarvoor JIT kan gebruik word (padformaat .to.module:funcname of path.to.module:ClassName.method_name). Die lys funksies waarvoor JIT geaktiveer moet word, kan op grond van die profileringsresultate bepaal word. In die toekoms word ondersteuning vir dinamiese JIT-samestelling verwag gebaseer op interne ontleding van die frekwensie van funksie-oproepe, maar met inagneming van die besonderhede van die bekendstelling van prosesse op Instagram, is JIT-samestelling ook geskik vir Facebook in die aanvanklike stadium.

    JIT skakel eers Python-greepkode om in 'n hoëvlak-intermediêre voorstelling (HIR), wat redelik naby aan Python-greepkode is, maar is ontwerp om 'n register-gebaseerde virtuele masjien te gebruik in plaas van 'n stapel-gebaseerde een, en gebruik ook tipe inligting en bykomende prestasie-kritiese besonderhede (soos verwysingtelling) . Die HIR word dan omgeskakel na SSA (statiese enkelopdrag) vorm en gaan deur optimaliseringstappe wat verwysingtellingresultate en geheueverbruikdata in ag neem. As gevolg hiervan word 'n lae-vlak intermediêre verteenwoordiging (LIR) gegenereer, naby aan samestellende taal. Na nog 'n fase van LIR-gebaseerde optimalisering, word samestelling-instruksies gegenereer deur die asmjit-biblioteek te gebruik.

  • Streng modus vir modules. Die funksionaliteit sluit drie komponente in: Tipe StrictModule. 'n Statiese ontleder wat kan bepaal dat die uitvoering van 'n module geen impak op kode buite daardie module het nie. 'n Modulelaaier wat bepaal dat die modules in streng modus is (die kode spesifiseer "invoer __strict__"), kyk vir die afwesigheid van kruisings met ander modules, en laai streng modules in sys.modules as 'n StrictModule-objek.
  • Static Python is 'n eksperimentele greepkode-samesteller wat tipe-aantekeninge gebruik om tipe-spesifieke greepkode te genereer wat vinniger werk danksy JIT-samestelling. In sommige toetse toon die kombinasie van Static Python en JIT prestasieverbeterings van tot 7 keer in vergelyking met standaard CPython. In baie situasies word geskat dat die resultate naby aan die gebruik van die MyPyC- en Cython-samestellers is.

Bron: opennet.ru

Voeg 'n opmerking