Facebook open sourced Cinder, garpu CPython dipaké ku Instagram

Facebook geus diterbitkeun kodeu sumber pikeun Project Cinder, garpu CPython 3.8.5, palaksanaan rujukan utama basa programming Python. Cinder dianggo dina infrastruktur produksi Facebook pikeun ngawasa Instagram sareng kalebet optimasi pikeun ningkatkeun kinerja.

Kode ieu diterbitkeun pikeun ngabahas kamungkinan porting optimizations disusun kana kerangka CPython utama sarta pikeun mantuan proyék séjén kalibet dina ngaronjatkeun kinerja CPython. Facebook henteu badé ngadukung Cinder dina bentuk proyék open source anu misah sareng kodeu dibere dina bentuk anu dianggo dina infrastruktur perusahaan, tanpa nyisiran sareng dokuméntasi tambahan. Éta ogé henteu nyobian ngamajukeun Cinder salaku alternatif pikeun CPython - tujuan utama pangwangunan nyaéta kahayang pikeun ningkatkeun CPython sorangan.

Kode Cinder kacatet cukup dipercaya sareng diuji dina lingkungan produksi, tapi upami masalahna diidentipikasi, anjeun kedah ngabéréskeunana nyalira, sabab Facebook henteu ngajamin yén éta bakal ngabales pesen kasalahan éksternal sareng narik paménta. Dina waktos anu sami, Facebook henteu ngaleungitkeun gawé babarengan konstruktif sareng komunitas sareng siap ngabahas ideu ngeunaan kumaha carana ngadamel Cinder langkung gancang atanapi kumaha nyepetkeun transfer parobahan anu disiapkeun kana bagian utama CPython.

Optimasi utama dilaksanakeun di Cinder:

  • Inline cache tina bytecode ("shadow bytecode"). Intina metodeu nyaéta pikeun ngaidentipikasi kaayaan dimana opcode has dieksekusi anu tiasa dioptimalkeun, sareng sacara dinamis ngagentos opcode sapertos sareng pilihan khusus anu langkung gancang (contona, ngagentos fungsi anu sering disebut).
  • Evaluasi coroutine hayang pisan. Pikeun sauran fungsi async anu diprosés langsung (await henteu ngadagoan sareng fungsina ngahontal pernyataan balik saméméhna), hasil tina fungsi sapertos langsung diganti tanpa nyiptakeun coroutine atanapi ngalibetkeun loop acara. Dina kode Facebook anu loba ngagunakeun async / await, hasil optimasi dina speedup ngeunaan 5%.
  • Kompilasi JIT selektif dina tingkat metode sareng fungsi individu (metode-at-a-time). Diaktipkeun via pilihan "-X jit" atawa variabel lingkungan PYTHONJIT = 1 tur ngidinan Anjeun pikeun nyepetkeun palaksanaan loba tés kinerja ku 1.5-4 kali. Kusabab kompilasi JIT ngan ukur relevan pikeun fungsi anu sering dieksekusi, henteu disarankeun pikeun dianggo pikeun fungsi anu jarang dianggo, kompilasi anu ngan ukur tiasa ngalambatkeun palaksanaan program.

    Ngaliwatan pilihan "-X jit-list-file=/path/to/jitlist.txt" atawa variabel lingkungan "PYTHONJITLISTFILE=/path/to/jitlist.txt" Anjeun bisa nangtukeun file kalawan daptar fungsi nu JIT tiasa dianggo (format jalur .to.module:funcname atanapi path.to.module:ClassName.method_name). Daptar fungsi anu JIT kedah diaktipkeun tiasa ditangtukeun dumasar kana hasil profil. Dina mangsa nu bakal datang, rojongan pikeun kompilasi JIT dinamis diperkirakeun dumasar kana analisis internal tina frékuénsi panggero fungsi, tapi nyokot kana akun spésifik prosés launching on Instagram, kompilasi JIT ogé cocog pikeun Facebook dina tahap awal.

    JIT mimiti ngarobah Python bytecode kana pawakilan panengah tingkat tinggi (HIR), nu cukup deukeut jeung Python bytecode, tapi dirancang pikeun ngagunakeun mesin virtual basis register tinimbang hiji basis tumpukan, sarta ogé ngagunakeun informasi tipe sarta tambahan. rinci kinerja-kritis (sapertos cacah rujukan). HIR ieu lajeng dirobah jadi SSA (statik tunggal ngerjakeun) formulir na ngaliwatan léngkah optimasi nu tumut kana akun hasil cacah rujukan tur data konsumsi memori. Hasilna, répréséntasi panengah tingkat rendah (LIR) dihasilkeun, deukeut kana basa rakitan. Sanggeus fase séjén optimizations basis LIR, parentah assembly dihasilkeun ngagunakeun perpustakaan asmjit.

  • Modeu ketat pikeun modul. fungsionalitas ngawengku tilu komponén: Tipe StrictModule. Analis statik anu tiasa nangtoskeun yén palaksanaan modul henteu aya dampak kana kode di luar modul éta. A loader modul nu nangtukeun yén modul dina modeu ketat (kode nangtukeun "impor __strict__"), pariksa henteuna intersections kalawan modul séjén, sarta beban modul ketat kana sys.modules salaku objek StrictModule.
  • Static Python mangrupikeun kompiler bytecode ékspérimén anu ngagunakeun anotasi jinis pikeun ngahasilkeun bytecode khusus anu ngajalankeun langkung gancang berkat kompilasi JIT. Dina sababaraha tés, kombinasi Static Python sareng JIT nunjukkeun perbaikan kinerja dugi ka 7 kali dibandingkeun sareng CPython standar. Dina seueur kaayaan, hasilna diperkirakeun caket sareng nganggo kompiler MyPyC sareng Cython.

sumber: opennet.ru

Tambahkeun komentar