Facebook atvērtā pirmkoda Cinder, CPython dakša, ko izmanto Instagram

Facebook ir publicējis avota kodu Project Cinder, kas ir CPython 3.8.5 dakša, kas ir galvenā Python programmēšanas valodas atsauces ieviešana. Cinder tiek izmantots Facebook ražošanas infrastruktūrā, lai darbinātu Instagram, un tajā ir iekļauta optimizācija veiktspējas uzlabošanai.

Kods tiek publicēts, lai apspriestu iespēju sagatavotās optimizācijas pārnest uz galveno CPython ietvaru un palīdzētu citiem projektiem, kas saistīti ar CPython veiktspējas uzlabošanu. Facebook neplāno atbalstīt Cinder atsevišķa atvērtā pirmkoda projekta veidā un kods tiek pasniegts tādā formā, kādā tas tiek izmantots uzņēmuma infrastruktūrā, bez papildu ķemmēšanas un dokumentācijas. Viņi arī necenšas reklamēt Cinder kā alternatīvu CPython - galvenais attīstības mērķis ir vēlme uzlabot pašu CPython.

Cinder kods tiek atzīmēts kā diezgan uzticams un pārbaudīts ražošanas vidēs, taču, ja tiks konstatētas problēmas, tās būs jārisina pašam, jo ​​Facebook negarantē, ka tas reaģēs uz ārējiem kļūdu ziņojumiem un izvilkšanas pieprasījumiem. Vienlaikus Facebook neizslēdz arī konstruktīvu sadarbību ar sabiedrību un ir gatavs apspriest idejas, kā Cinder padarīt vēl ātrāku vai kā paātrināt sagatavoto izmaiņu pārnešanu uz CPython galveno daļu.

Galvenās Cinder ieviestās optimizācijas:

  • Baitkoda iekļautā kešatmiņa (“ēnas baitkods”). Metodes būtība ir identificēt situācijas, kurās tiek izpildīts tipisks opkods, ko var optimizēt, un dinamiski aizstāt šādu opkodu ar ātrākām specializētām opcijām (piemēram, bieži izsaukto funkciju aizstāšana).
  • Dedzīgs korutīnas novērtējums. Asinhrono funkciju izsaukumiem, kas tiek apstrādāti nekavējoties (gaidīšana neizraisa gaidīšanu un funkcija agrāk sasniedz atgriešanas paziņojumu), šādu funkciju rezultāts tiek tieši aizstāts, neveidojot korutīnu vai neiesaistot notikumu cilpu. Facebook kodā, kurā lielā mērā tiek izmantota asinhronā/gaidīšanas funkcija, optimizācijas rezultāts ir aptuveni 5% paātrinājums.
  • Selektīvā JIT kompilācija atsevišķu metožu un funkciju līmenī (method-at-a-time). Iespējota, izmantojot opciju “-X jit” vai vides mainīgo PYTHONJIT=1, un ļauj 1.5–4 reizes paātrināt daudzu veiktspējas testu izpildi. Tā kā JIT kompilācija attiecas tikai uz bieži izpildītām funkcijām, nav ieteicams to izmantot reti izmantotām funkcijām, kuru kompilācijas izmaksas var tikai palēnināt programmas izpildi.

    Izmantojot opciju “-X jit-list-file=/path/to/jitlist.txt” vai vides mainīgo “PYTHONJITLISTFILE=/path/to/jitlist.txt”, varat norādīt failu ar funkciju sarakstu, kurām JIT var izmantot (ceļa formāts .to.module:funcname vai path.to.module:ClassName.method_name). Funkciju sarakstu, kurām būtu jāiespējo JIT, var noteikt, pamatojoties uz profilēšanas rezultātiem. Nākotnē ir gaidāms atbalsts dinamiskai JIT kompilācijai, pamatojoties uz funkciju izsaukumu biežuma iekšējo analīzi, taču, ņemot vērā palaišanas procesu specifiku Instagram, JIT kompilācija ir piemērota arī Facebook sākuma stadijā.

    JIT vispirms pārveido Python baitu kodu augsta līmeņa starpposma attēlojumā (HIR), kas ir diezgan tuvu Python baitkodam, taču ir paredzēts, lai izmantotu uz reģistru balstītu virtuālo mašīnu, nevis steku, kā arī izmanto tipa informāciju un papildu veiktspējai svarīga informācija (piemēram, atsauces skaitīšana) . Pēc tam HIR tiek pārveidots par SSA (statiskā viena piešķiršana) veidlapu un tiek veiktas optimizācijas darbības, kurās tiek ņemti vērā atsauces skaitīšanas rezultāti un atmiņas patēriņa dati. Rezultātā tiek ģenerēts zema līmeņa starpposma attēlojums (LIR), kas ir tuvu montāžas valodai. Pēc citas uz LIR balstītas optimizācijas fāzes, izmantojot asmjit bibliotēku, tiek ģenerētas montāžas instrukcijas.

  • Stingrs režīms moduļiem. Funkcionalitāte ietver trīs komponentus: Type StrictModule. Statisks analizators, kas var noteikt, ka moduļa izpildei nav ietekmes uz kodu ārpus šī moduļa. Moduļu ielādētājs, kas nosaka, ka moduļi ir stingrā režīmā (kods norāda “import __strict__”), pārbauda, ​​vai nav krustošanās ar citiem moduļiem, un ielādē stingros moduļus sys.modules kā StrictModule objektu.
  • Statiskais Python ir eksperimentāls baitu koda kompilators, kas izmanto tipa anotācijas, lai ģenerētu tipam specifisku baitkodu, kas darbojas ātrāk, pateicoties JIT kompilācijai. Dažos testos Static Python un JIT kombinācija demonstrē veiktspējas uzlabojumus līdz pat 7 reizēm, salīdzinot ar standarta CPython. Daudzās situācijās tiek lēsts, ka rezultāti ir tuvu MyPyC un Cython kompilatoru izmantošanai.

Avots: opennet.ru

Pievieno komentāru