Ang Facebook open sourced nga Cinder, usa ka tinidor sa CPython nga gigamit sa Instagram

Gipatik sa Facebook ang source code alang sa Project Cinder, usa ka tinidor sa CPython 3.8.5, ang nag-unang reperensiya nga pagpatuman sa Python programming language. Gigamit ang Cinder sa imprastraktura sa produksiyon sa Facebook aron magamit ang Instagram ug adunay mga pag-optimize aron mapaayo ang pasundayag.

Gipatik ang code aron hisgutan ang posibilidad sa pag-port sa giandam nga mga pag-optimize sa panguna nga balangkas sa CPython ug aron matabangan ang uban pang mga proyekto nga nalambigit sa pagpaayo sa performance sa CPython. Ang Facebook wala magtinguha nga suportahan si Cinder sa porma sa usa ka bulag nga open source nga proyekto ug ang code gipresentar sa porma diin kini gigamit sa imprastraktura sa kompanya, nga wala’y dugang nga pagsukol ug dokumentasyon. Wala usab sila mosulay sa pagpasiugda sa Cinder isip alternatibo sa CPython - ang nag-unang tumong sa kalamboan mao ang tinguha sa pagpalambo sa CPython mismo.

Ang Cinder code nahibal-an nga medyo kasaligan ug gisulayan sa mga palibot sa produksiyon, apan kung nahibal-an ang mga problema, kinahanglan nimo nga sulbaron kini sa imong kaugalingon, tungod kay ang Facebook dili garantiya nga kini motubag sa mga eksternal nga mensahe sa sayup ug mga hangyo sa pagbitad. Sa samang higayon, ang Facebook wala mag-apil sa makapalig-on nga kooperasyon sa komunidad ug andam nga hisgutan ang mga ideya kon unsaon paghimo sa Cinder nga mas paspas o kung unsaon pagpadali sa pagbalhin sa giandam nga mga pagbag-o ngadto sa nag-unang bahin sa CPython.

Panguna nga mga pag-optimize nga gipatuman sa Cinder:

  • Inline nga caching sa bytecode ("shadow bytecode"). Ang esensya sa pamaagi mao ang pag-ila sa mga sitwasyon diin ang usa ka tipikal nga opcode gipatuman nga mahimong ma-optimize, ug sa dinamikong pag-ilis sa ingon nga opcode sa mas paspas nga espesyal nga mga kapilian (pananglitan, pag-ilis sa kanunay nga gitawag nga mga function).
  • Matinguhaon nga pagsusi sa coroutine. Alang sa async function nga mga tawag nga giproseso dayon (ang paghulat dili moresulta sa paghulat ug ang function makaabot sa return statement sa sayo pa), ang resulta sa maong mga function direkta nga gipulihan nga walay paghimo og coroutine ug walay pag-apil sa event loop. Sa code sa Facebook nga daghang gigamit ang async / naghulat, ang pag-optimize nagresulta sa usa ka paspas nga mga 5%.
  • Selective JIT compilation sa lebel sa indibidwal nga mga pamaagi ug mga gimbuhaton (pamaagi-sa-usa ka panahon). Gi-enable pinaagi sa "-X jit" nga kapilian o ang PYTHONJIT=1 environment variable ug nagtugot kanimo sa pagpadali sa pagpatuman sa daghang mga performance test sa 1.5-4 ka beses. Tungod kay ang JIT compilation may kalabutan lamang alang sa kanunay nga gipatuman nga mga gimbuhaton, dili maayo nga gamiton kini alang sa panagsa ra nga gigamit nga mga gimbuhaton, ang compilation overhead nga makapahinay lamang sa pagpatuman sa programa.

    Pinaagi sa opsyon nga “-X jit-list-file=/path/to/jitlist.txt” o ang environment variable “PYTHONJITLISTFILE=/path/to/jitlist.txt” mahimo nimong ipiho ang usa ka file nga adunay lista sa mga function diin ang JIT mahimong gamiton (path format .to.module:funcname o path.to.module:ClassName.method_name). Ang lista sa mga gimbuhaton diin ang JIT kinahanglan nga magamit mahimong matino base sa mga resulta sa profiling. Sa umaabot, ang suporta alang sa dinamikong JIT compilation gilauman base sa internal nga pag-analisa sa frequency sa mga tawag sa function, apan gikonsiderar ang mga detalye sa mga proseso sa paglansad sa Instagram, ang JIT compilation angay usab alang sa Facebook sa inisyal nga yugto.

    Ang JIT una nga nag-convert sa Python bytecode ngadto sa usa ka high-level intermediate representation (HIR), nga medyo duol sa Python bytecode, apan gidesinyo sa paggamit sa usa ka register-based virtual machine imbes sa usa ka stack-based, ug naggamit usab sa type nga impormasyon ug dugang mga detalye nga kritikal sa pasundayag (sama sa pag-ihap sa pakisayran) . Ang HIR dayon gi-convert sa SSA (static single assignment) nga porma ug moagi sa mga lakang sa pag-optimize nga nagkonsiderar sa mga resulta sa pag-ihap sa reference ug data sa konsumo sa memorya. Ingon usa ka sangputanan, usa ka low-level intermediate representation (LIR) ang namugna, duol sa sinultian sa asembliya. Human sa laing hugna sa LIR-based optimizations, ang mga instruksiyon sa asembliya gihimo gamit ang asmjit library.

  • Strict mode para sa mga module. Ang pagpaandar naglakip sa tulo ka mga sangkap: Type StrictModule. Usa ka static analyzer nga makatino nga ang pagpatuman sa usa ka module walay epekto sa code gawas sa maong module. Usa ka module loader nga nagtino nga ang mga module naa sa estrikto nga mode (ang code nagtino sa "import __strict__"), nagsusi kung wala ang mga intersection sa ubang mga module, ug nagkarga sa mga estrikto nga module sa sys.modules ingon usa ka butang nga StrictModule.
  • Ang Static Python kay usa ka experimental bytecode compiler nga naggamit ug type annotation para makamugna ug type-specific bytecode nga mas paspas nga modagan salamat sa JIT compilation. Sa pipila ka mga pagsulay, ang kombinasyon sa Static Python ug JIT nagpakita sa mga pag-uswag sa performance hangtod sa 7 ka beses kumpara sa standard CPython. Sa daghang mga sitwasyon, ang mga resulta gibanabana nga hapit sa paggamit sa MyPyC ug Cython compiler.

Source: opennet.ru

Idugang sa usa ka comment