Facebook me burim të hapur Cinder, një pirun i CPython i përdorur nga Instagram

Facebook ka publikuar kodin burimor për Project Cinder, një fork i CPython 3.8.5, zbatimi kryesor i referencës së gjuhës programuese Python. Cinder përdoret në infrastrukturën e prodhimit të Facebook për të fuqizuar Instagramin dhe përfshin optimizime për të përmirësuar performancën.

Kodi është publikuar për të diskutuar mundësinë e transferimit të optimizimeve të përgatitura në kuadrin kryesor të CPython dhe për të ndihmuar projektet e tjera të përfshira në përmirësimin e performancës së CPython. Facebook nuk ka ndërmend të mbështesë Cinder në formën e një projekti të veçantë me kod të hapur dhe kodi paraqitet në formën në të cilën përdoret në infrastrukturën e kompanisë, pa krehje dhe dokumentacion shtesë. Ata gjithashtu nuk përpiqen të promovojnë Cinder si një alternativë ndaj CPython - qëllimi kryesor i zhvillimit është dëshira për të përmirësuar vetë CPython.

Kodi Cinder shënohet si mjaft i besueshëm dhe i testuar në mjediset e prodhimit, por nëse identifikohen probleme, do të duhet t'i zgjidhni vetë, pasi Facebook nuk garanton se do t'i përgjigjet mesazheve të gabimit të jashtëm dhe do të tërheqë kërkesa. Në të njëjtën kohë, Facebook nuk përjashton bashkëpunimin konstruktiv me komunitetin dhe është i gatshëm të diskutojë ide se si ta bëjmë Cinder edhe më të shpejtë ose si të shpejtojmë transferimin e ndryshimeve të përgatitura në pjesën kryesore të CPython.

Optimizimet kryesore të zbatuara në Cinder:

  • Memoria e brendshme e bajtkodit ("bytecode hije"). Thelbi i metodës është të identifikojë situatat ku ekzekutohet një opcode tipik që mund të optimizohet dhe të zëvendësohet në mënyrë dinamike një opcode i tillë me opsione më të shpejta të specializuara (për shembull, zëvendësimi i funksioneve të quajtura shpesh).
  • Vlerësimi i etur korutin. Për thirrjet e funksioneve asinkronike që përpunohen menjëherë (pritja nuk rezulton në pritje dhe funksioni arrin deklaratën e kthimit më herët), rezultati i funksioneve të tilla zëvendësohet drejtpërdrejt pa krijuar një korutinë ose duke përfshirë një cikli ngjarjeje. Në kodin e Facebook që përdor shumë async/prit, optimizimi rezulton në një shpejtësi prej rreth 5%.
  • Përpilimi selektiv JIT në nivelin e metodave dhe funksioneve individuale (metodë-në-një-kohë). Aktivizohet nëpërmjet opsionit “-X jit” ose ndryshores mjedisore PYTHONJIT=1 dhe ju lejon të shpejtoni ekzekutimin e shumë testeve të performancës me 1.5-4 herë. Meqenëse përpilimi i JIT është i rëndësishëm vetëm për funksionet e ekzekutuara shpesh, është e papërshtatshme të përdoret për funksione të përdorura rrallë, shpenzimi i përgjithshëm i të cilave mund të ngadalësojë vetëm ekzekutimin e programit.

    Nëpërmjet opsionit "-X jit-list-file=/path/to/jitlist.txt" ose ndryshores së mjedisit "PYTHONJITLISTFILE=/path/to/jitlist.txt" ju mund të specifikoni një skedar me një listë funksionesh për të cilat JIT mund të përdoret (formati i rrugës .to.module:funcname ose path.to.module:Emri i klasës.emri_metodës). Lista e funksioneve për të cilat JIT duhet të aktivizohet mund të përcaktohet bazuar në rezultatet e profilizimit. Në të ardhmen, mbështetja për përpilimin dinamik JIT pritet bazuar në analizën e brendshme të frekuencës së thirrjeve të funksionit, por duke marrë parasysh specifikat e nisjes së proceseve në Instagram, përpilimi JIT është gjithashtu i përshtatshëm për Facebook në fazën fillestare.

    JIT fillimisht konverton bytekodin Python në një përfaqësim të ndërmjetëm të nivelit të lartë (HIR), i cili është mjaft i afërt me bytekodin Python, por është krijuar për të përdorur një makinë virtuale të bazuar në regjistër në vend të një të bazuar në stek, dhe gjithashtu përdor informacione të tipit dhe shtesë detaje kritike për performancën (siç është numërimi i referencës) . HIR më pas konvertohet në formularin SSA (caktim i vetëm statik) dhe kalon nëpër hapat e optimizimit që marrin parasysh rezultatet e numërimit të referencës dhe të dhënat e konsumit të memories. Si rezultat, krijohet një përfaqësim i ndërmjetëm i nivelit të ulët (LIR), afër gjuhës së asamblesë. Pas një faze tjetër të optimizimeve të bazuara në LIR, udhëzimet e montimit gjenerohen duke përdorur bibliotekën asmjit.

  • Modaliteti i rreptë për modulet. Funksionaliteti përfshin tre komponentë: Lloji StrictModule. Një analizues statik që mund të përcaktojë se ekzekutimi i një moduli nuk ka ndikim në kodin jashtë atij moduli. Një ngarkues i moduleve që përcakton që modulet janë në modalitet strikte (kodi specifikon "import __strict__"), kontrollon mungesën e kryqëzimeve me modulet e tjera dhe ngarkon module strikte në sys.modules si një objekt StrictModule.
  • Static Python është një përpilues eksperimental i bytekodit që përdor shënime të tipit për të gjeneruar bajtkod specifik të tipit që funksionon më shpejt falë përpilimit JIT. Në disa teste, kombinimi i Static Python dhe JIT demonstron përmirësime të performancës deri në 7 herë në krahasim me CPython standard. Në shumë situata, rezultatet vlerësohen të jenë afër përdorimit të përpiluesve MyPyC dhe Cython.

Burimi: opennet.ru

Shto një koment