Facebook ачык булактуу Cinder, Instagram колдонгон CPython айры

Facebook Python программалоо тилинин негизги маалымдама ишке ашыруусу болгон CPython 3.8.5 вилкасы болгон Project Cinder үчүн баштапкы кодун жарыялады. Cinder Facebookтун өндүрүштүк инфраструктурасында Инстаграмды күчтөндүрүү үчүн колдонулат жана ишти жакшыртуу үчүн оптималдаштырууну камтыйт.

Код даярдалган оптималдаштырууларды негизги CPython алкагында өткөрүү мүмкүнчүлүгүн талкуулоо жана CPython иштешин жакшыртууга катышкан башка долбоорлорго жардам берүү үчүн жарыяланды. Facebook Cinderди өзүнчө ачык булак долбоору түрүндө колдоого ниеттенбейт жана код компаниянын инфраструктурасында колдонулган формада, кошумча тароо жана документтерсиз берилген. Алар ошондой эле Cinderди CPythonго альтернатива катары илгерилетүүгө аракет кылышпайт - өнүгүүнүн негизги максаты CPythonдун өзүн өркүндөтүү каалоосу.

Cinder коду кыйла ишенимдүү жана өндүрүш чөйрөсүндө сыналган деп белгиленет, бирок көйгөйлөр аныкталса, аларды өзүңүз чечишиңиз керек болот, анткени Facebook тышкы ката билдирүүлөрүнө жана суроо-талаптарга жооп берерине кепилдик бербейт. Ошол эле учурда, Facebook коомчулук менен конструктивдүү кызматташууну жокко чыгарбайт жана Cinderди кантип тезирээк жасоо же CPythonдун негизги бөлүгүнө даярдалган өзгөртүүлөрдү кантип тездетүү боюнча идеяларды талкуулоого даяр.

Cindere ишке ашырылган негизги оптималдаштыруу:

  • Байткодду саптык кэштөө («көмүскө байт код»). Методдун маңызы оптималдаштырыла турган типтүү операциялык код аткарылган кырдаалдарды аныктоо жана мындай опкодду тезирээк адистештирилген варианттарга динамикалык түрдө алмаштыруу (мисалы, көп чакырылган функцияларды алмаштыруу).
  • Корутиндик баа берүү. Дароо иштетилген асинхрондуу функция чалуулары үчүн (күтүү күтүүгө алып келбейт жана функция кайтаруу операторуна эрте жетет), мындай функциялардын натыйжасы корутин түзбөстөн же окуя циклин камтыбастан түздөн-түз алмаштырылат. Асинхрондоштуруу/күтүүнү көп колдонгон Facebook кодунда оптималдаштыруу 5% га жакын ылдамдыкка алып келет.
  • Жекече методдор жана функциялар деңгээлинде тандалма JIT компиляциясы (бир убакта метод). “-X jit” опциясы же PYTHONJIT=1 чөйрө өзгөрмөсү аркылуу иштетилген жана көптөгөн аткаруу тесттеринин аткарылышын 1.5-4 эсе тездетүүгө мүмкүндүк берет. JIT компиляциясы көп аткарылуучу функциялар үчүн гана тиешелүү болгондуктан, аны сейрек колдонулган функциялар үчүн колдонуу сунушталбайт, компиляциянын кошумча чыгымы программанын аткарылышын жайлатышы мүмкүн.

    “-X jit-list-file=/path/to/jitlist.txt” же “PYTHONJITLISTFILE=/path/to/jitlist.txt” чөйрө өзгөрмөсү аркылуу сиз JIT үчүн функциялардын тизмеси бар файлды көрсөтө аласыз. колдонсо болот (жол форматы .модулга:функатына же жол.модулга:КлассАты.метод_аты). JIT иштетилиши керек болгон функциялардын тизмеси профилдөө натыйжаларынын негизинде аныкталышы мүмкүн. Келечекте динамикалык JIT компиляциясын колдоо функциялык чалуулардын жыштыгынын ички анализинин негизинде күтүлүүдө, бирок Instagramда процесстерди ишке киргизүүнүн өзгөчөлүктөрүн эске алуу менен JIT компиляциясы Facebook үчүн да баштапкы этапта ылайыктуу.

    JIT алгач Python байт кодун жогорку деңгээлдеги орто өкүлчүлүккө (HIR) айлантат, ал Python байт кодуна бир топ жакын, бирок стектин ордуна реестрге негизделген виртуалдык машинаны колдонуу үчүн иштелип чыккан, ошондой эле типтеги маалыматты жана кошумчаларды колдонот. аткаруу-критикалык деталдар (мисалы, шилтемени эсептөө). HIR андан кийин SSA (статикалык бирдиктүү дайындоо) формасына айландырылат жана маалымдама эсептөөнүн натыйжаларын жана эстутум керектөө маалыматтарын эске алган оптималдаштыруу кадамдарынан өтөт. Натыйжада ассемблер тилине жакын төмөнкү деңгээлдеги орто өкүлчүлүк (LIR) түзүлөт. LIR негизиндеги оптималдаштыруунун дагы бир этабынан кийин, asmjit китепканасынын жардамы менен монтаждоо көрсөтмөлөрү түзүлөт.

  • Модулдар үчүн катуу режим. Функционалдык үч компонентти камтыйт: Type StrictModule. Модулдун аткарылышы ал модулдун сыртындагы кодго эч кандай таасир этпей турганын аныктай турган статикалык анализатор. Модулдардын катуу режимде экенин аныктаган модулдук жүктөгүч (код “импорт __strict__” дегенди көрсөтөт), башка модулдар менен кесилиштердин жоктугун текшерет жана StrictModule объектиси катары катуу модулдарды sys.modulesге жүктөйт.
  • Static Python – бул JIT компиляциясынын аркасында тезирээк иштеген типке тиешелүү байт кодду түзүү үчүн типке аннотацияларды колдонгон эксперименталдык байт код компилятору. Кээ бир сыноолордо Static Python жана JIT айкалышы стандарттык CPython менен салыштырганда 7 эсеге чейин иштешин жакшыртат. Көптөгөн жагдайларда натыйжалар MyPyC жана Cython компиляторлорун колдонууга жакын деп бааланат.

Source: opennet.ru

Комментарий кошуу