Facebook нь нээлттэй эх сурвалжтай Cinder, Instagram-д ашигладаг CPython-ийн сэрээ

Фэйсбүүк нь Python програмчлалын хэлний үндсэн лавлагаа хэрэглүүр болох CPython 3.8.5-ийн сэрээ болох Project Cinder-ийн эх кодыг нийтэлжээ. Cinder нь Facebook-ийн үйлдвэрлэлийн дэд бүтцэд Instagram-ыг ажиллуулахад ашиглагддаг бөгөөд гүйцэтгэлийг сайжруулах оновчлолуудыг агуулдаг.

Бэлтгэсэн оновчлолыг үндсэн CPython хүрээ рүү шилжүүлэх, CPython-ын гүйцэтгэлийг сайжруулахад оролцож буй бусад төслүүдэд туслах зорилгоор уг кодыг нийтэлсэн болно. Facebook нь Cinder-ийг тусдаа нээлттэй эхийн төсөл хэлбэрээр дэмжих бодолгүй байгаа бөгөөд кодыг нэмэлт самнах, баримтжуулахгүйгээр компанийн дэд бүтцэд ашиглаж буй хэлбэрээр танилцуулсан болно. Тэд мөн Cinder-ийг CPython-ийн өөр хувилбар болгон сурталчлахыг оролддоггүй - хөгжлийн гол зорилго нь CPython-ийг өөрөө сайжруулах хүсэл юм.

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

Cinder-д хэрэгжүүлсэн гол оновчлолууд:

  • Байткодын шугамын кэш ("сүүдрийн байт код"). Аргын мөн чанар нь оновчлох боломжтой ердийн үйлдлийн кодыг гүйцэтгэх нөхцөл байдлыг тодорхойлох, ийм опкодыг илүү хурдан тусгай сонголтоор динамикаар солих (жишээлбэл, байнга дуудагддаг функцуудыг солих) юм.
  • Хүсэл эрмэлзэлтэй корутин үнэлгээ. Шууд боловсруулагдсан синхрончлолын функцийн дуудлагын хувьд (хүлээх нь хүлээхэд хүргэдэггүй бөгөөд функц нь буцах мэдэгдэлд эрт хүрдэг) ийм функцүүдийн үр дүн нь корутин үүсгэх эсвэл үйл явдлын давталтгүйгээр шууд орлуулдаг. Async/wait-г их ашигладаг 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-д зориулсан функцуудын жагсаалт бүхий файлыг зааж өгч болно. ашиглаж болно (замын формат .module: функцын нэр эсвэл зам.модул: АнгийнНэр.арга_нэр). 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 хөрвүүлэгчийг ашиглахад ойрхон байна гэж тооцдог.

Эх сурвалж: opennet.ru

сэтгэгдэл нэмэх