Instagram tarafından kullanılan CPython'un bir çatalı olan Facebook açık kaynaklı Cinder

Facebook, Python programlama dilinin ana referans uygulaması olan CPython 3.8.5'in bir çatalı olan Project Cinder'ın kaynak kodunu yayınladı. Cinder, Instagram'ı güçlendirmek için Facebook'un üretim altyapısında kullanılıyor ve performansı artırmak için optimizasyonlar içeriyor.

Kod, hazırlanan optimizasyonların ana CPython çerçevesine taşınması olasılığını tartışmak ve CPython performansını artırmaya katılan diğer projelere yardımcı olmak için yayınlandı. Facebook, Cinder'ı ayrı bir açık kaynak projesi şeklinde desteklemeyi düşünmüyor ve kod, ek tarama ve dokümantasyon olmadan şirketin altyapısında kullanıldığı haliyle sunuluyor. Ayrıca Cinder'ı CPython'a alternatif olarak tanıtmaya çalışmıyorlar - geliştirmenin ana hedefi CPython'un kendisini iyileştirme arzusudur.

Cinder kodunun oldukça güvenilir olduğu belirtiliyor ve üretim ortamlarında test ediliyor, ancak sorunlar tespit edilirse bunları kendiniz çözmeniz gerekecek çünkü Facebook, harici hata mesajlarına ve çekme isteklerine yanıt vereceğini garanti etmiyor. Aynı zamanda Facebook, toplulukla yapıcı işbirliğini de dışlamıyor ve Cinder'in nasıl daha hızlı hale getirilebileceği veya hazırlanan değişikliklerin CPython'un ana bölümüne aktarımının nasıl hızlandırılacağına dair fikirleri tartışmaya hazır.

Cinder'da uygulanan ana optimizasyonlar:

  • Bayt kodunun satır içi önbelleğe alınması (“gölge bayt kodu”). Yöntemin özü, optimize edilebilecek tipik bir işlem kodunun yürütüldüğü durumları belirlemek ve böyle bir işlem kodunu dinamik olarak daha hızlı özelleştirilmiş seçeneklerle değiştirmek (örneğin, sık çağrılan işlevleri değiştirmek).
  • İstekli eşyordam değerlendirmesi. Hemen işlenen eşzamansız işlev çağrıları için (await, beklemeyle sonuçlanmaz ve işlev, return ifadesine daha erken ulaşır), bu tür işlevlerin sonucu, bir eşyordam oluşturmadan veya bir olay döngüsü içermeden doğrudan değiştirilir. Yoğun olarak async/await kullanan Facebook kodunda optimizasyon yaklaşık %5'lik bir hızlanma sağlar.
  • Bireysel yöntemler ve işlevler düzeyinde seçici JIT derlemesi (bir seferde yöntem). “-X jit” seçeneği veya PYTHONJIT=1 ortam değişkeni aracılığıyla etkinleştirilir ve birçok performans testinin yürütülmesini 1.5-4 kat hızlandırmanıza olanak tanır. JIT derlemesi yalnızca sık yürütülen işlevlerle ilgili olduğundan, nadiren kullanılan işlevler için kullanılması önerilmez; derleme ek yükü yalnızca programın yürütülmesini yavaşlatabilir.

    "-X jit-list-file=/path/to/jitlist.txt" seçeneği veya "PYTHONJITLISTFILE=/path/to/jitlist.txt" ortam değişkeni aracılığıyla, JIT'in kullanacağı işlevlerin listesini içeren bir dosya belirleyebilirsiniz. kullanılabilir (yol formatı .to.module:funcname veya path.to.module:ClassName.method_name). JIT'in etkinleştirilmesi gereken işlevlerin listesi, profil oluşturma sonuçlarına göre belirlenebilir. Gelecekte, işlev çağrılarının sıklığının dahili analizine dayanarak dinamik JIT derlemesinin desteklenmesi bekleniyor, ancak Instagram'da süreçlerin başlatılmasının özellikleri dikkate alındığında, JIT derlemesi ilk aşamada Facebook için de uygundur.

    JIT ilk önce Python bayt kodunu, Python bayt koduna oldukça yakın olan ancak yığın tabanlı bir sanal makine yerine kayıt tabanlı bir sanal makine kullanmak üzere tasarlanmış olan ve ayrıca tür bilgileri ve ekleri kullanan yüksek düzeyli bir ara gösterime (HIR) dönüştürür. performans açısından kritik ayrıntılar (referans sayımı gibi) . HIR daha sonra SSA (statik tekli atama) formuna dönüştürülür ve referans sayma sonuçlarını ve bellek tüketimi verilerini hesaba katan optimizasyon adımlarından geçer. Sonuç olarak, montaj diline yakın, düşük seviyeli bir ara gösterim (LIR) oluşturulur. LIR tabanlı optimizasyonların bir başka aşamasından sonra asmjit kütüphanesi kullanılarak montaj talimatları oluşturulur.

  • Modüller için katı mod. İşlevsellik üç bileşen içerir: StrictModule yazın. Bir modülün yürütülmesinin o modülün dışındaki kod üzerinde hiçbir etkisinin olmadığını belirleyebilen bir statik analizör. Modüllerin katı modda olduğunu belirleyen bir modül yükleyici (kod "import __strict__" belirtir), diğer modüllerle kesişmelerin olup olmadığını kontrol eder ve katı modülleri bir StrictModule nesnesi olarak sys.modules'a yükler.
  • Statik Python, JIT derlemesi sayesinde daha hızlı çalışan türe özgü bayt kodu oluşturmak için tür açıklamalarını kullanan deneysel bir bayt kodu derleyicisidir. Bazı testlerde Statik Python ve JIT kombinasyonu, standart CPython'a kıyasla 7 kata kadar performans artışı göstermektedir. Çoğu durumda sonuçların MyPyC ve Cython derleyicilerini kullanmaya yakın olduğu tahmin edilmektedir.

Kaynak: opennet.ru

Yorum ekle