Facebook açıq mənbəli Cinder, Instagram tərəfindən istifadə edilən CPython çəngəlidir

Facebook, Python proqramlaşdırma dilinin əsas istinad tətbiqi olan CPython 3.8.5-in forkı olan Project Cinder üçün mənbə kodunu dərc edib. Cinder, Instagram-ı gücləndirmək üçün Facebook-un istehsal infrastrukturunda istifadə olunur və performansı yaxşılaşdırmaq üçün optimallaşdırmaları ehtiva edir.

Kod hazırlanmış optimallaşdırmaların əsas CPython çərçivəsinə köçürülməsi imkanlarını müzakirə etmək və CPython performansının yaxşılaşdırılması ilə məşğul olan digər layihələrə kömək etmək üçün dərc edilmişdir. Facebook Cinder-i ayrıca açıq mənbəli layihə şəklində dəstəkləmək niyyətində deyil və kod əlavə daranma və sənədləşdirmə olmadan şirkətin infrastrukturunda istifadə edildiyi formada təqdim olunur. Onlar həmçinin Cinder-i CPython-a alternativ kimi tanıtmağa çalışmırlar - inkişafın əsas məqsədi CPython-un özünü təkmilləşdirmək istəyidir.

Cinder kodu kifayət qədər etibarlı və istehsal mühitlərində sınaqdan keçirildiyi qeyd olunur, lakin problemlər aşkar edilərsə, onları özünüz həll etməli olacaqsınız, çünki Facebook xarici səhv mesajlarına cavab verəcəyinə və sorğuları çəkəcəyinə zəmanət vermir. Eyni zamanda, Facebook icma ilə konstruktiv əməkdaşlığı istisna etmir və Cinder-i necə daha sürətli etmək və ya hazırlanmış dəyişikliklərin CPython-un əsas hissəsinə köçürülməsini sürətləndirmək barədə fikirləri müzakirə etməyə hazırdır.

Cinder-də həyata keçirilən əsas optimallaşdırmalar:

  • Bayt kodunun daxili keşləşdirilməsi (“kölgə bayt kodu”). Metodun mahiyyəti optimallaşdırıla bilən tipik əməliyyat kodunun icra edildiyi vəziyyətləri müəyyən etmək və belə əməliyyat kodunu daha sürətli ixtisaslaşmış variantlarla dinamik şəkildə əvəz etməkdir (məsələn, tez-tez çağırılan funksiyaları əvəz etmək).
  • Həvəsli korutin qiymətləndirmə. Dərhal emal olunan asinxron funksiya çağırışları üçün (gözləmə gözləmə ilə nəticələnmir və funksiya geri qaytarma ifadəsinə daha tez çatır), bu cür funksiyaların nəticəsi koroutin yaratmadan və ya hadisə dövrəsini cəlb etmədən birbaşa əvəz olunur. Async/await-dən çox istifadə edən Facebook kodunda optimallaşdırma təxminən 5% sürətlənmə ilə nəticələnir.
  • Fərdi metodlar və funksiyalar səviyyəsində seçmə JIT tərtibi (bir vaxtda metod). “-X jit” seçimi və ya PYTHONJIT=1 mühit dəyişəni vasitəsilə aktivləşdirilib və bir çox performans testlərinin icrasını 1.5-4 dəfə sürətləndirməyə imkan verir. JIT kompilyasiyası yalnız tez-tez yerinə yetirilən funksiyalar üçün uyğun olduğundan, onu nadir hallarda istifadə olunan funksiyalar üçün istifadə etmək məqsədəuyğun deyil, kompilyasiya yükü yalnız proqramın icrasını yavaşlata bilər.

    “-X jit-list-file=/path/to/jitlist.txt” seçimi və ya “PYTHONJITLISTFILE=/path/to/jitlist.txt” mühit dəyişəni ilə siz JIT-in istifadə olunduğu funksiyaların siyahısı olan faylı təyin edə bilərsiniz. istifadə edilə bilər (yol formatı .modula:funcname və ya modula yol.SinifAdı.metod_adı). JIT-in aktivləşdirilməli olduğu funksiyaların siyahısı profilləşdirmə nəticələrinə əsasən müəyyən edilə bilər. Gələcəkdə funksiya çağırışlarının tezliyinin daxili təhlili əsasında dinamik JIT kompilyasiyasına dəstək gözlənilir, lakin Instagram-da proseslərin işə salınmasının xüsusiyyətləri nəzərə alınmaqla, JIT kompilyasiyası ilkin mərhələdə Facebook üçün də uyğundur.

    JIT əvvəlcə Python bayt kodunu Python bayt koduna kifayət qədər yaxın olan yüksək səviyyəli ara nümayəndəliyə (HIR) çevirir, lakin yığın əsaslı maşın əvəzinə registr əsaslı virtual maşından istifadə etmək üçün nəzərdə tutulmuşdur, həmçinin tip məlumatlarından və əlavələrdən istifadə edir. kritik performans detalları (məsələn, istinadların hesablanması). HIR daha sonra SSA (statik tək təyinat) formasına çevrilir və istinad hesablama nəticələrini və yaddaş istehlakı məlumatlarını nəzərə alan optimallaşdırma addımlarından keçir. Nəticədə assembler dilinə yaxın aşağı səviyyəli ara təqdimat (LIR) yaradılır. LIR əsaslı optimallaşdırmaların başqa bir mərhələsindən sonra asmjit kitabxanasından istifadə edərək montaj təlimatları yaradılır.

  • Modullar üçün sərt rejim. Funksionallıq üç komponentdən ibarətdir: Type StrictModule. Modulun icrasının həmin moduldan kənar koda heç bir təsiri olmadığını müəyyən edə bilən statik analizator. Modulların ciddi rejimdə olduğunu müəyyən edən modul yükləyicisi (kodda “import __strict__” müəyyən edilir), digər modullarla kəsişmələrin olmamasını yoxlayır və StrictModule obyekti kimi ciddi modulları sys.modules-a yükləyir.
  • Statik Python, JIT kompilyasiyası sayəsində daha sürətli işləyən növə xas bayt kodu yaratmaq üçün tip annotasiyalarından istifadə edən eksperimental bayt kodu tərtibçisidir. Bəzi testlərdə Static Python və JIT-in birləşməsi standart CPython ilə müqayisədə 7 dəfəyə qədər performans təkmilləşməsini nümayiş etdirir. Bir çox hallarda nəticələrin MyPyC və Cython kompilyatorlarından istifadə etməyə yaxın olduğu təxmin edilir.

Mənbə: opennet.ru

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