Facebook louvri sous Cinder, yon fouchèt nan CPython itilize pa Instagram

Facebook te pibliye kòd sous la pou Project Cinder, yon fouchèt nan CPython 3.8.5, aplikasyon prensipal referans lang pwogramasyon Python. Cinder yo itilize nan enfrastrikti pwodiksyon Facebook pou pouvwa Instagram epi li gen ladan optimize pou amelyore pèfòmans.

Kòd la pibliye pou diskite sou posibilite pou pote optimize yo prepare nan fondasyon prensipal CPython ak ede lòt pwojè ki enplike nan amelyore pèfòmans CPython. Facebook pa gen entansyon sipòte Cinder nan fòm lan nan yon pwojè sous louvri apa ak kòd la prezante nan fòm nan ki li se itilize nan enfrastrikti konpayi an, san yo pa penyen adisyonèl ak dokiman. Yo menm tou yo pa eseye ankouraje Cinder kòm yon altènativ a CPython - objektif prensipal devlopman se dezi a amelyore CPython tèt li.

Kòd Cinder la te note kòm jistis serye ak teste nan anviwònman pwodiksyon, men si yo idantifye pwoblèm, ou pral oblije rezoud yo tèt ou, depi Facebook pa garanti ke li pral reponn a mesaj erè ekstèn ak demann rale. An menm tan an, Facebook pa eskli koperasyon konstriktif ak kominote a epi li pare pou diskite sou ide sou fason pou fè Cinder menm pi vit oswa ki jan yo pi vit transfè a nan chanjman prepare nan pati prensipal la nan CPython.

Optimize prensipal yo aplike nan Cinder:

  • Cache aliye bytecode ("lonbraj bytecode"). Sans nan metòd la se idantifye sitiyasyon kote yon opcode tipik egzekite ki ka optimize, ak dinamik ranplase yon opcode tankou pi vit opsyon espesyalize (pa egzanp, ranplase fonksyon yo rele souvan).
  • Evalyasyon koroutin anvi. Pou apèl fonksyon async ki trete imedyatman (atant pa lakòz yon tann ak fonksyon an rive nan deklarasyon an retounen pi bonè), rezilta a nan fonksyon sa yo dirèkteman ranplase san yo pa kreye yon koroutin oswa enplike yon bouk evènman. Nan kòd Facebook ki itilize anpil async / tann, optimize rezilta yo nan yon vitès apeprè 5%.
  • Konpilasyon selektif JIT nan nivo metòd endividyèl ak fonksyon (metòd-a-a-time). Pèmèt atravè opsyon "-X jit" la oswa PYTHONJIT = 1 anviwònman varyab epi pèmèt ou akselere ekzekisyon anpil tès pèfòmans pa 1.5-4 fwa. Depi konpilasyon JIT se sèlman ki enpòtan pou fonksyon souvan egzekite, li pa rekòmande pou sèvi ak li pou fonksyon ki raman itilize, konpilasyon an sou tèt ki ka sèlman ralanti ekzekisyon pwogram nan.

    Atravè opsyon "-X jit-list-file=/path/to/jitlist.txt" oswa varyab anviwònman an "PYTHONJITLISTFILE=/path/to/jitlist.txt" ou ka presize yon dosye ak yon lis fonksyon pou ki JIT. ka itilize (fòma chemen .to.module:funcname oswa path.to.module:ClassName.method_name). Yo ka detèmine lis fonksyon pou ki JIT ta dwe pèmèt yo baze sou rezilta profilage yo. Nan lavni an, sipò pou konpilasyon JIT dinamik espere ki baze sou analiz entèn nan frekans nan apèl fonksyon, men pran an kont spesifik yo nan pwosesis lanse sou Instagram, konpilasyon JIT se tou apwopriye pou Facebook nan etap inisyal la.

    JIT premye konvèti Python bytecode nan yon wo nivo reprezantasyon entèmedyè (HIR), ki se jistis pre Python bytecode, men ki fèt pou itilize yon machin vityèl ki baze sou rejis olye pou yo yon sèl ki baze sou pile, epi tou li itilize enfòmasyon sou kalite ak adisyonèl. detay ki enpòtan pou pèfòmans (tankou konte referans). Lè sa a, HIR la konvèti nan fòm SSA (estatik sèl plasman) epi li ale nan etap optimize ki pran an kont rezilta konte referans ak done konsomasyon memwa. Kòm yon rezilta, yon ba nivo reprezantasyon entèmedyè (LIR) se pwodwi, tou pre lang asanble. Apre yon lòt faz nan optimize ki baze sou LIR, enstriksyon asanble yo pwodwi lè l sèvi avèk bibliyotèk asmjit la.

  • Mòd strik pou modil. Fonksyonalite a gen ladan twa eleman: Kalite StrictModule. Yon analizè estatik ki ka detèmine ke ekzekisyon yon modil pa gen okenn enpak sou kòd deyò modil sa a. Yon chajè modil ki detèmine modil yo nan mòd strik (kòd la espesifye "enpòte __strict__"), tcheke pou absans entèseksyon ak lòt modil, epi chaje modil strik nan sys.modules kòm yon objè StrictModule.
  • Static Python se yon konpilateur bytecode eksperimantal ki sèvi ak anotasyon kalite pou jenere bytecode ki espesifik ki kouri pi vit gras a konpilasyon JIT. Nan kèk tès, konbinezon Static Python ak JIT demontre amelyorasyon pèfòmans jiska 7 fwa konpare ak CPython estanda. Nan anpil sitiyasyon, yo estime rezilta yo tou pre lè l sèvi avèk MyPyC ak Cython konpilateur yo.

Sous: opennet.ru

Add nouvo kòmantè