Facebook åpen kildekode Cinder, en gaffel av CPython brukt av Instagram

Facebook har publisert kildekoden for Project Cinder, en gaffel av CPython 3.8.5, hovedreferanseimplementeringen av Python-programmeringsspråket. Cinder brukes i Facebooks produksjonsinfrastruktur for å drive Instagram og inkluderer optimaliseringer for å forbedre ytelsen.

Koden er publisert for å diskutere muligheten for å portere de forberedte optimaliseringene til CPython-rammeverket og for å hjelpe andre prosjekter involvert i å forbedre CPython-ytelsen. Facebook har ikke til hensikt å støtte Cinder i form av et eget åpen kildekode-prosjekt og koden presenteres i den formen den brukes i selskapets infrastruktur, uten ytterligere kjemming og dokumentasjon. De prøver heller ikke å promotere Cinder som et alternativ til CPython – hovedmålet med utvikling er ønsket om å forbedre selve CPython.

Cinder-koden er notert som ganske pålitelig og testet i produksjonsmiljøer, men hvis problemer blir identifisert, må du løse dem selv, siden Facebook ikke garanterer at den vil svare på eksterne feilmeldinger og pull-forespørsler. Samtidig utelukker ikke Facebook konstruktivt samarbeid med fellesskapet og er klar til å diskutere ideer om hvordan man kan gjøre Cinder enda raskere eller hvordan man kan fremskynde overføringen av forberedte endringer til hoveddelen av CPython.

Hovedoptimaliseringer implementert i Cinder:

  • Inline bufring av bytekode ("skyggebytekode"). Essensen av metoden er å identifisere situasjoner der en typisk op-kode utføres som kan optimaliseres, og å dynamisk erstatte en slik op-kode med raskere spesialiserte alternativer (for eksempel å erstatte ofte kalte funksjoner).
  • Ivrig coroutine-evaluering. For asynkronfunksjonskall som behandles umiddelbart (avvent resulterer ikke i ventetid og funksjonen når retursetningen tidligere), erstattes resultatet av slike funksjoner direkte uten å lage en korutine eller involvere en hendelsesløkke. I Facebook-kode som i stor grad bruker async/wait, resulterer optimaliseringen i en hastighetsøkning på omtrent 5 %.
  • Selektiv JIT-kompilering på nivå med individuelle metoder og funksjoner (metode-om-gangen). Aktivert via "-X jit"-alternativet eller miljøvariabelen PYTHONJIT=1 og lar deg fremskynde utførelsen av mange ytelsestester med 1.5-4 ganger. Siden JIT-kompilering kun er relevant for ofte utførte funksjoner, er det ikke tilrådelig å bruke den for sjelden brukte funksjoner, hvis kompileringsoverhead bare kan redusere programkjøringen.

    Via alternativet “-X jit-list-file=/path/to/jitlist.txt” eller miljøvariabelen “PYTHONJITLISTFILE=/path/to/jitlist.txt” kan du spesifisere en fil med en liste over funksjoner for hvilke JIT kan brukes (baneformat .to.module:funcname eller path.to.module:ClassName.method_name). Listen over funksjoner som JIT skal være aktivert for kan bestemmes basert på profileringsresultatene. I fremtiden forventes støtte for dynamisk JIT-kompilering basert på intern analyse av frekvensen av funksjonsanrop, men tatt i betraktning spesifikasjonene ved lanseringsprosesser på Instagram, er JIT-kompilering også egnet for Facebook i det innledende stadiet.

    JIT konverterer først Python-bytekode til en høynivå-mellomrepresentasjon (HIR), som er ganske nær Python-bytekode, men er designet for å bruke en registerbasert virtuell maskin i stedet for en stabelbasert, og bruker også typeinformasjon og tillegg ytelseskritiske detaljer (som referansetelling) . HIR-en konverteres deretter til SSA-form (statisk enkeltoppdrag) og går gjennom optimaliseringstrinn som tar hensyn til referansetellingsresultater og minneforbruksdata. Som et resultat genereres en lav-nivå mellomrepresentasjon (LIR) nær assemblerspråk. Etter en ny fase med LIR-baserte optimaliseringer, genereres monteringsinstruksjoner ved hjelp av asmjit-biblioteket.

  • Streng modus for moduler. Funksjonaliteten inkluderer tre komponenter: Type StrictModule. En statisk analysator som kan fastslå at kjøringen av en modul ikke har noen innvirkning på kode utenfor den modulen. En modullaster som bestemmer at modulene er i streng modus (koden spesifiserer "import __strict__"), sjekker for fravær av skjæringspunkter med andre moduler, og laster strenge moduler inn i sys.modules som et StrictModule-objekt.
  • Static Python er en eksperimentell bytekode-kompilator som bruker typekommentarer for å generere typespesifikk bytekode som kjører raskere takket være JIT-kompilering. I noen tester demonstrerer kombinasjonen av Static Python og JIT ytelsesforbedringer på opptil 7 ganger sammenlignet med standard CPython. I mange situasjoner anslås resultatene å være nær bruk av MyPyC- og Cython-kompilatorene.

Kilde: opennet.ru

Legg til en kommentar