Facebook iturri irekiko Cinder, Instagramek erabiltzen duen CPython-en sardexka

Facebook-ek Project Cinder-en iturburu-kodea argitaratu du, CPython 3.8.5-en sardexka bat, Python programazio-lengoaiaren erreferentziazko inplementazio nagusia. Cinder Facebook-en ekoizpen-azpiegituretan erabiltzen da Instagram elikatzeko eta errendimendua hobetzeko optimizazioak biltzen ditu.

Kodea argitaratzen da prestatutako optimizazioak CPython esparru nagusira eramateko aukera eztabaidatzeko eta CPython-en errendimendua hobetzen parte hartzen duten beste proiektu batzuei laguntzeko. Facebook-ek ez du Cinder kode irekiko proiektu bereizi baten moduan onartzen eta kodea konpainiaren azpiegituran erabiltzen den moduan aurkezten da, orraztu eta dokumentazio gehigarririk gabe. Gainera, ez dira Cinder CPython-en alternatiba gisa sustatzen saiatzen - garapenaren helburu nagusia CPython bera hobetzeko nahia da.

Cinder kodea nahiko fidagarria dela eta ekoizpen-inguruneetan probatua dela adierazten da, baina arazoak identifikatzen badira, zuk zeuk konpondu beharko dituzu, Facebookek ez baitu bermatzen kanpoko errore-mezuei eta tira-eskaerei erantzungo dienik. Aldi berean, Facebook-ek ez du baztertzen komunitatearekiko lankidetza eraikitzailea eta prest dago Cinder are azkarrago egiteko edo prestatutako aldaketak CPython-en zati nagusira transferitzeko moduari buruzko ideiak eztabaidatzeko.

Cinder-en inplementatutako optimizazio nagusiak:

  • Bytecodearen lineako cachea ("itzal bytecode"). Metodoaren funtsa optimizatu daitekeen operazio-kode tipiko bat exekutatzen den egoerak identifikatzea da eta modu dinamikoan horrelako opcode bat aukera espezializatu azkarragoekin ordezkatzea (adibidez, maiz deitzen diren funtzioak ordezkatzea).
  • Korutinen ebaluazio gogotsu. Berehala prozesatzen diren funtzio asinkronikoen deietarako (wait-ek ez du itxaroterik eragiten eta funtzioa lehenago iristen da return instrukziora), funtzio horien emaitza zuzenean ordezkatzen da korutinarik sortu gabe edo gertaeren begiztarik inplikatu gabe. Async/wait asko erabiltzen duen Facebook kodean, optimizazioak %5 inguruko bizkortzea dakar.
  • JIT konpilaketa selektiboa metodo eta funtzio indibidualen mailan (method-at-a-time). "-X jit" aukeraren edo PYTHONJIT=1 ingurune-aldagaiaren bidez gaitu eta errendimendu-proba askoren exekuzioa 1.5-4 aldiz bizkortzeko aukera ematen du. JIT konpilazioa maiz exekutatzen diren funtzioetarako soilik garrantzitsua denez, ez da komeni gutxitan erabiltzen diren funtzioetarako erabiltzea, eta horien konpilazioaren gainkostuak programaren exekuzioa moteldu dezake.

    "-X jit-list-file=/path/to/jitlist.txt" aukeraren bidez edo "PYTHONJITLISTFILE=/path/to/jitlist.txt" ingurune-aldagaiaren bidez fitxategi bat zehaztu dezakezu JIT horretarako funtzioen zerrenda batekin. erabil daiteke (bide-formatua .to.module:funcname edo path.to.module:ClassName.method_name). JIT gaitu behar duten funtzioen zerrenda profilaren emaitzen arabera zehaztu daiteke. Etorkizunean, JIT konpilazio dinamikorako euskarria espero da funtzio-deien maiztasunaren barne-analisian oinarrituta, baina Instagram-en abiarazteko prozesuak abiaraztearen berezitasunak kontuan hartuta, JIT konpilazioa ere egokia da hasierako fasean Facebookerako.

    JIT-k lehenik eta behin Python bytecode bihurtzen du goi-mailako tarteko irudikapena (HIR), hau da, Python bytecodetik nahiko hurbil dagoena, baina erregistroan oinarritutako makina birtual bat erabiltzeko diseinatuta dago pila batean oinarritutako baten ordez, eta motako informazioa eta osagarriak ere erabiltzen ditu. Errendimendurako xehetasun kritikoak (erreferentziaren zenbaketa, esaterako). HIR SSA (esleipen bakarra estatikoa) formara bihurtzen da eta erreferentzia zenbaketaren emaitzak eta memoria-kontsumoaren datuak kontuan hartzen dituzten optimizazio-urratsetatik igarotzen da. Ondorioz, maila baxuko tarteko irudikapena (LIR) sortzen da, mihiztadura lengoaiatik hurbil. LIRn oinarritutako optimizazioen beste fase baten ondoren, muntatzeko argibideak asmjit liburutegia erabiliz sortzen dira.

  • Moduluetarako modu zorrotza. Funtzionalitateak hiru osagai ditu: StrictModule mota. Modulu baten exekuzioak modulu horretatik kanpoko kodean eraginik ez duela zehaztu dezakeen analizatzaile estatiko bat. Moduluak modu zorrotzean daudela zehazten duen modulu-kargatzailea (kodeak "inportatu __strict__") zehazten du, beste modulu batzuekin elkargunerik ez dagoen egiaztatzen du eta modulu zorrotzak sys.modules-en kargatzen ditu StrictModule objektu gisa.
  • Static Python bytecode konpilatzaile esperimental bat da, motako oharrak erabiltzen dituena JIT konpilazioari esker azkarrago exekutatzen den mota zehatzeko bytecode sortzeko. Zenbait probatan, Static Python eta JIT-ren konbinazioak CPython estandarraren aldean 7 aldiz hobekuntzak erakusten ditu. Egoera askotan, emaitzak MyPyC eta Cython konpilatzaileak erabiltzetik gertu daudela kalkulatzen da.

Iturria: opennet.ru

Gehitu iruzkin berria