Facebook բաց կոդով Cinder, CPython-ի պատառաքաղ, որն օգտագործվում է Instagram-ի կողմից

Facebook-ը հրապարակել է Project Cinder-ի սկզբնաղբյուրը՝ CPython 3.8.5-ի պատառաքաղը՝ Python ծրագրավորման լեզվի հիմնական հղումը: Cinder-ն օգտագործվում է Facebook-ի արտադրական ենթակառուցվածքում՝ Instagram-ը հզորացնելու համար և ներառում է օպտիմիզացումներ՝ արդյունավետությունը բարելավելու համար:

Կոդը հրապարակվում է՝ քննարկելու պատրաստված օպտիմալացումները հիմնական CPython շրջանակում տեղափոխելու հնարավորությունը և օգնելու այլ նախագծերին, որոնք ներգրավված են CPython-ի կատարողականի բարելավման մեջ: Facebook-ը մտադիր չէ աջակցել Cinder-ին առանձին բաց կոդով նախագծի տեսքով և կոդը ներկայացված է այն տեսքով, որով այն օգտագործվում է ընկերության ենթակառուցվածքում՝ առանց լրացուցիչ սանրման և փաստաթղթավորման։ Նրանք նաև չեն փորձում գովազդել Cinder-ը որպես CPython-ի այլընտրանք. զարգացման հիմնական նպատակը հենց CPython-ը բարելավելու ցանկությունն է:

Cinder կոդը նշվում է որպես բավականին հուսալի և փորձարկված արտադրական միջավայրերում, բայց եթե խնդիրներ հայտնաբերվեն, դուք ստիպված կլինեք դրանք լուծել ինքներդ, քանի որ Facebook-ը չի երաշխավորում, որ այն կպատասխանի արտաքին սխալի հաղորդագրություններին և կհրապարակի հարցումները: Միևնույն ժամանակ, Facebook-ը չի բացառում կառուցողական համագործակցությունը համայնքի հետ և պատրաստ է քննարկել գաղափարներ, թե ինչպես կարելի է Cinder-ն ավելի արագ դարձնել կամ ինչպես արագացնել պատրաստված փոփոխությունների փոխանցումը CPython-ի հիմնական մաս։

Cinder-ում իրականացված հիմնական օպտիմալացումները.

  • Բայթ կոդի ներկառուցված քեշավորում («ստվերային բայթկոդ»): Մեթոդի էությունը կայանում է նրանում, որ բացահայտել իրավիճակները, որտեղ գործարկվում է տիպիկ opcode, որը կարող է օպտիմիզացվել, և դինամիկ կերպով փոխարինել այդպիսի opcode ավելի արագ մասնագիտացված տարբերակներով (օրինակ՝ փոխարինելով հաճախակի կոչվող գործառույթները):
  • Անհամբեր կորուտինայի գնահատում: Async ֆունկցիայի կանչերի համար, որոնք անմիջապես մշակվում են (սպասելը չի ​​հանգեցնում սպասման, և ֆունկցիան ավելի վաղ է հասնում վերադարձի հայտարարությանը), նման գործառույթների արդյունքն ուղղակիորեն փոխարինվում է առանց միջանցք ստեղծելու կամ իրադարձության հանգույց ներգրավելու: Facebook-ի կոդում, որը մեծապես օգտագործում է async/wait, օպտիմալացումը հանգեցնում է մոտ 5% արագացման:
  • Ընտրովի JIT կոմպիլացիա անհատական ​​մեթոդների և գործառույթների մակարդակով (մեթոդ-մի ժամանակ): Միացված է «-X jit» տարբերակի կամ PYTHONJIT=1 միջավայրի փոփոխականի միջոցով և թույլ է տալիս արագացնել բազմաթիվ կատարողական թեստերի կատարումը 1.5-4 անգամ: Քանի որ JIT կոմպիլյացիան տեղին է միայն հաճախակի կատարվող գործառույթների համար, խորհուրդ չի տրվում օգտագործել այն հազվադեպ օգտագործվող ֆունկցիաների համար, որոնց կոմպիլյացիան կարող է միայն դանդաղեցնել ծրագրի կատարումը:

    «-X jit-list-file=/path/to/jitlist.txt» կամ «PYTHONJITLISTFILE=/path/to/jitlist.txt» միջավայրի փոփոխականի միջոցով կարող եք նշել ֆայլ՝ գործառույթների ցանկով, որոնց համար JIT կարող է օգտագործվել (ուղու ձևաչափը .to.module:funcname կամ path.to.module:ClassName.method_name): Գործառույթների ցանկը, որոնց համար JIT-ը պետք է միացված լինի, կարող է որոշվել պրոֆիլավորման արդյունքների հիման վրա: Ապագայում սպասվում է դինամիկ JIT կոմպիլյացիայի աջակցություն՝ հիմնվելով ֆունկցիաների զանգերի հաճախականության ներքին վերլուծության վրա, սակայն հաշվի առնելով Instagram-ում գործընթացների գործարկման առանձնահատկությունները՝ JIT կոմպիլյացիան սկզբնական փուլում հարմար է նաև Facebook-ի համար։

    JIT-ը նախ փոխակերպում է Python բայթկոդը բարձր մակարդակի միջանկյալ ներկայացման (HIR), որը բավականին մոտ է Python բայթկոդի, բայց նախատեսված է ռեգիստրի վրա հիմնված վիրտուալ մեքենայի փոխարեն stack-ի փոխարեն, ինչպես նաև օգտագործում է տիպային տեղեկատվություն և լրացուցիչ: կատարման համար կարևոր մանրամասներ (օրինակ՝ հղումների հաշվարկը): Այնուհետև HIR-ը փոխարկվում է SSA (ստատիկ մեկ հանձնարարություն) ձևի և անցնում է օպտիմալացման քայլեր, որոնք հաշվի են առնում հղումների հաշվման արդյունքները և հիշողության սպառման տվյալները: Արդյունքում ստեղծվում է ցածր մակարդակի միջանկյալ ներկայացում (LIR), որը մոտ է անսամբլի լեզվին: LIR-ի վրա հիմնված օպտիմալացման մեկ այլ փուլից հետո հավաքման հրահանգները ստեղծվում են asmjit գրադարանի միջոցով:

  • Խիստ ռեժիմ մոդուլների համար: Ֆունկցիոնալությունը ներառում է երեք բաղադրիչ՝ Type StrictModule: Ստատիկ անալիզատոր, որը կարող է որոշել, որ մոդուլի կատարումը որևէ ազդեցություն չունի այդ մոդուլից դուրս կոդի վրա: Մոդուլի բեռնիչ, որը որոշում է, որ մոդուլները գտնվում են խիստ ռեժիմում (կոդը նշում է «ներմուծել __strict__»), ստուգում է այլ մոդուլների հետ խաչմերուկների բացակայությունը և խիստ մոդուլները բեռնում է sys.modules-ում՝ որպես StrictModule օբյեկտ:
  • Static Python-ը բայթկոդերի փորձարարական կոմպիլյատոր է, որն օգտագործում է տիպի ծանոթագրություններ՝ տիպային հատուկ բայթկոդ ստեղծելու համար, որն ավելի արագ է աշխատում JIT կոմպիլացիայի շնորհիվ: Որոշ թեստերում Static Python-ի և JIT-ի համադրությունը ցույց է տալիս կատարողականի բարելավում մինչև 7 անգամ՝ համեմատած ստանդարտ CPython-ի հետ: Շատ իրավիճակներում արդյունքները մոտ են MyPyC և Cython կոմպիլյատորների օգտագործմանը:

Source: opennet.ru

Добавить комментарий