Facebook ochiq manbali Cinder, Instagram tomonidan ishlatiladigan CPython vilkasi

Facebook Python dasturlash tilining asosiy mos yozuvlar ilovasi bo'lgan CPython 3.8.5 vilkasi bo'lgan Project Cinder uchun manba kodini nashr etdi. Cinder Facebook ishlab chiqarish infratuzilmasida Instagramni quvvatlantirish uchun ishlatiladi va unumdorlikni oshirish uchun optimallashtirishlarni o'z ichiga oladi.

Kod tayyorlangan optimallashtirishlarni asosiy CPython ramkasiga ko'chirish imkoniyatini muhokama qilish va CPython ishlashini yaxshilash bilan bog'liq boshqa loyihalarga yordam berish uchun nashr etilgan. Facebook Cinder-ni alohida ochiq kodli loyiha shaklida qo'llab-quvvatlamoqchi emas va kod kompaniya infratuzilmasida qo'llaniladigan shaklda, qo'shimcha tarash va hujjatlarsiz taqdim etiladi. Ular, shuningdek, Cinder-ni CPython-ga muqobil sifatida targ'ib qilishga urinmaydilar - rivojlanishning asosiy maqsadi CPython-ning o'zini yaxshilash istagi.

Cinder kodi juda ishonchli va ishlab chiqarish muhitida sinovdan o'tgan deb qayd etilgan, ammo muammolar aniqlansa, ularni o'zingiz hal qilishingiz kerak bo'ladi, chunki Facebook tashqi xato xabarlariga javob berishiga va so'rovlarni qabul qilishga kafolat bermaydi. Shu bilan birga, Facebook hamjamiyat bilan konstruktiv hamkorlikni istisno etmaydi va Cinder-ni qanday qilib tezroq qilish yoki CPython-ning asosiy qismiga tayyorlangan o'zgarishlarni tezlashtirish bo'yicha g'oyalarni muhokama qilishga tayyor.

Cinder-da amalga oshirilgan asosiy optimallashtirishlar:

  • Bayt kodini inline keshlash ("soya baytkodi"). Usulning mohiyati optimallashtirilishi mumkin bo'lgan odatiy opkod bajariladigan vaziyatlarni aniqlash va bunday opkodni tezroq ixtisoslashtirilgan variantlar bilan dinamik ravishda almashtirish (masalan, tez-tez chaqiriladigan funktsiyalarni almashtirish).
  • Kuchli korutin baholash. Zudlik bilan qayta ishlangan asinxron funksiya chaqiruvlari uchun (kutish kutishga olib kelmaydi va funktsiya qaytish bayonotiga avvalroq yetib boradi), bunday funksiyalarning natijasi to‘g‘ridan-to‘g‘ri koroutin yaratmasdan yoki voqea siklini jalb qilmasdan almashtiriladi. Async/await-dan ko'p foydalanadigan Facebook kodida optimallashtirish 5% ga yaqin tezlikka olib keladi.
  • Alohida usullar va funktsiyalar darajasida tanlangan JIT kompilyatsiyasi (bir vaqtning o'zida usul). “-X jit” opsiyasi yoki PYTHONJIT=1 muhit o‘zgaruvchisi orqali yoqilgan va ko‘plab ishlash testlarini bajarishni 1.5-4 baravar tezlashtirish imkonini beradi. JIT kompilyatsiyasi faqat tez-tez bajariladigan funktsiyalar uchun tegishli bo'lganligi sababli, uni kamdan-kam qo'llaniladigan funktsiyalar uchun ishlatish tavsiya etilmaydi, kompilyatsiya yuki faqat dastur bajarilishini sekinlashtirishi mumkin.

    “-X jit-list-file=/path/to/jitlist.txt” opsiyasi yoki “PYTHONJITLISTFILE=/path/to/jitlist.txt” muhit o‘zgaruvchisi orqali siz JIT funksiyalari ro‘yxati bilan faylni belgilashingiz mumkin. foydalanish mumkin (yo'l formati .module:funcname yoki path.to.module:ClassName.method_name). JIT yoqilishi kerak bo'lgan funksiyalar ro'yxatini profillash natijalari asosida aniqlash mumkin. Kelajakda dinamik JIT kompilyatsiyasini qo'llab-quvvatlash funksiya qo'ng'iroqlari chastotasining ichki tahlili asosida kutilmoqda, ammo Instagramda jarayonlarni ishga tushirishning o'ziga xos xususiyatlarini hisobga olgan holda, JIT kompilyatsiyasi Facebook uchun ham dastlabki bosqichda mos keladi.

    JIT birinchi navbatda Python bayt kodini yuqori darajali oraliq vakillikka (HIR) o'zgartiradi, bu Python bayt-kodiga juda yaqin, lekin stekga asoslangan virtual mashina o'rniga registrga asoslangan virtual mashinadan foydalanish uchun mo'ljallangan, shuningdek, turdagi ma'lumotlar va qo'shimchalardan foydalanadi. ishlash uchun muhim tafsilotlar (masalan, havolalarni hisoblash). Keyin HIR SSA (statik yagona tayinlash) shakliga aylantiriladi va mos yozuvlarni hisoblash natijalari va xotira sarfi ma'lumotlarini hisobga olgan holda optimallashtirish bosqichlaridan o'tadi. Natijada, assembler tiliga yaqin bo'lgan past darajadagi oraliq vakillik (LIR) hosil bo'ladi. LIR-ga asoslangan optimallashtirishning yana bir bosqichidan so'ng, asmjit kutubxonasi yordamida montaj ko'rsatmalari yaratiladi.

  • Modullar uchun qattiq rejim. Funktsionallik uchta komponentni o'z ichiga oladi: Type StrictModule. Modulning bajarilishi ushbu moduldan tashqaridagi kodga ta'sir qilmasligini aniqlay oladigan statik analizator. Modullarning qat'iy rejimda ekanligini aniqlaydigan modul yuklagichi (kod "import __strict__" ni belgilaydi), boshqa modullar bilan kesishishlar yo'qligini tekshiradi va qattiq modullarni StrictModule obyekti sifatida sys.modules ichiga yuklaydi.
  • Static Python - bu JIT kompilyatsiyasi tufayli tezroq ishlaydigan turga xos baytekodni yaratish uchun turdagi izohlardan foydalanadigan eksperimental bayt-kod kompilyatori. Ba'zi testlarda Static Python va JIT kombinatsiyasi standart CPython bilan solishtirganda ishlash samaradorligini 7 baravarga oshiradi. Ko'pgina hollarda natijalar MyPyC va Cython kompilyatorlaridan foydalanishga yaqin bo'ladi.

Manba: opennet.ru

a Izoh qo'shish