Facebook open sourced Cinder, uma wa CPython unaotumiwa na Instagram

Facebook imechapisha msimbo wa chanzo wa Project Cinder, uma wa CPython 3.8.5, utekelezaji mkuu wa marejeleo ya lugha ya programu ya Python. Cinder inatumika katika miundombinu ya uzalishaji ya Facebook ili kuwasha Instagram na inajumuisha uboreshaji ili kuboresha utendakazi.

Nambari hii inachapishwa ili kujadili uwezekano wa kusambaza uboreshaji uliotayarishwa kwa mfumo mkuu wa CPython na kusaidia miradi mingine inayohusika katika kuboresha utendakazi wa CPython. Facebook haina nia ya kuunga mkono Cinder katika mfumo wa mradi tofauti wa chanzo wazi na msimbo unawasilishwa katika fomu ambayo inatumiwa katika miundombinu ya kampuni, bila kuchanganya na nyaraka za ziada. Pia hawajaribu kukuza Cinder kama mbadala wa CPython - lengo kuu la maendeleo ni hamu ya kuboresha CPython yenyewe.

Nambari ya Cinder inajulikana kuwa ya kuaminika na iliyojaribiwa katika mazingira ya uzalishaji, lakini ikiwa shida zitatambuliwa, itabidi usuluhishe mwenyewe, kwani Facebook haihakikishi kuwa itajibu ujumbe wa makosa ya nje na maombi ya kuvuta. Wakati huo huo, Facebook haizuii ushirikiano wa kujenga na jumuiya na iko tayari kujadili mawazo juu ya jinsi ya kufanya Cinder hata haraka au jinsi ya kuharakisha uhamisho wa mabadiliko yaliyotayarishwa kwa mfumo mkuu wa CPython.

Uboreshaji kuu unatekelezwa katika Cinder:

  • Uakibishaji wa ndani wa bytecode ("kivuli bytecode"). Kiini cha njia hiyo ni kutambua hali ambapo opcode ya kawaida inatekelezwa inayoweza kuboreshwa, na kubadilisha kwa nguvu opcode kama hiyo na chaguo maalum za haraka (kwa mfano, kuchukua nafasi ya kazi zinazoitwa mara kwa mara).
  • Tathmini ya tabia ya hamu. Kwa simu za chaguo za kukokotoa ambazo huchakatwa mara moja (kusubiri hakusababishi kusubiri na chaguo la kukokotoa hufikia taarifa ya kurejesha mapema), matokeo ya vitendakazi kama hivyo hubadilishwa moja kwa moja bila kuunda utaratibu au kuhusisha kitanzi cha tukio. Katika msimbo wa Facebook ambao hutumia sana async/wait, uboreshaji husababisha kasi ya takriban 5%.
  • Mkusanyiko wa JIT uliochaguliwa katika kiwango cha mbinu na kazi za mtu binafsi (mbinu ya wakati mmoja). Imewashwa kupitia chaguo la "-X jit" au utofauti wa mazingira wa PYTHONJIT=1 na hukuruhusu kuharakisha utekelezaji wa majaribio mengi ya utendakazi kwa mara 1.5-4. Kwa kuwa ujumuishaji wa JIT unafaa tu kwa vitendaji vinavyotekelezwa mara kwa mara, haipendekezi kuitumia kwa vitendakazi ambavyo havijatumika sana, kichwa cha utungaji ambacho kinaweza kupunguza kasi ya utekelezaji wa programu.

    Kupitia chaguo "-X jit-list-file=/path/to/jitlist.txt" au utofauti wa mazingira "PYTHONJITLISTFILE=/path/to/jitlist.txt" unaweza kubainisha faili iliyo na orodha ya vitendakazi ambavyo JIT inaweza kutumika (umbizo la njia .to.module:funcname au path.to.module:ClassName.method_name). Orodha ya chaguo za kukokotoa ambazo JIT inapaswa kuwashwa inaweza kubainishwa kulingana na matokeo ya wasifu. Katika siku zijazo, usaidizi wa ujumuishaji wa nguvu wa JIT unatarajiwa kulingana na uchanganuzi wa ndani wa marudio ya simu za utendaji, lakini kwa kuzingatia maalum ya michakato ya uzinduzi kwenye Instagram, mkusanyiko wa JIT pia unafaa kwa Facebook katika hatua ya awali.

    JIT kwanza hubadilisha Python bytecode kuwa uwakilishi wa kiwango cha juu cha kati (HIR), ambayo iko karibu kabisa na Python bytecode, lakini imeundwa kutumia mashine ya mtandaoni inayotegemea rejista badala ya iliyo na safu, na pia hutumia habari ya aina na ya ziada. maelezo muhimu ya utendaji (kama vile kuhesabu marejeleo) . HIR kisha inabadilishwa kuwa fomu ya SSA (tuli ya kazi moja) na kupitia hatua za uboreshaji zinazozingatia matokeo ya kuhesabu kumbukumbu na data ya matumizi ya kumbukumbu. Matokeo yake, uwakilishi wa kiwango cha chini cha kati (LIR) huzalishwa, karibu na lugha ya mkutano. Baada ya awamu nyingine ya uboreshaji kulingana na LIR, maagizo ya mkusanyiko yanatolewa kwa kutumia maktaba ya asmjit.

  • Hali kali ya moduli. Utendaji unajumuisha vipengele vitatu: Aina ya StrictModule. Kichanganuzi tuli ambacho kinaweza kubainisha kuwa utekelezaji wa moduli hauna athari kwenye msimbo nje ya sehemu hiyo. Kipakiaji cha moduli ambacho huamua kuwa moduli ziko katika hali kali (msimbo unabainisha "kuagiza __strict__"), hukagua kukosekana kwa makutano na moduli zingine, na kupakia moduli kali katika sys.modules kama kitu cha StrictModule.
  • Static Python ni mkusanyaji wa bytecode wa majaribio ambao hutumia maelezo ya aina ili kutoa bytecode ya aina mahususi ambayo hufanya kazi haraka kutokana na mkusanyiko wa JIT. Katika baadhi ya majaribio, mchanganyiko wa Static Python na JIT huonyesha utendakazi kuboreshwa hadi mara 7 ikilinganishwa na CPython ya kawaida. Katika hali nyingi, matokeo yanakadiriwa kuwa karibu na kutumia vikusanyaji vya MyPyC na Cython.

Chanzo: opennet.ru

Nunua upangishaji wa kuaminika wa tovuti zilizo na ulinzi wa DDoS, seva za VPS VDS 🔥 Nunua upangishaji wa tovuti unaoaminika kwa ulinzi wa DDoS, seva za VPS VDS | ProHoster