- Yüksek performanslı bellek ayırıcısı jemalloc, Meta yazılım yığınında Linux çekirdeği ve derleyicilerle birlikte çekirdek altyapı rolü üstlenen temel bir bileşen oldu
- Son yıllarda jemalloc geliştirmesine yön veren temel mühendislik ilkelerinden kademeli olarak uzaklaşılmasıyla teknik borç birikti ve ilerleme yavaşladı
- Topluluk geri bildirimleri dikkate alındı ve proje kurucusu Jason Evans dahil topluluk üyeleriyle yapılan görüşmelerin ardından, orijinal açık kaynak deposu yeniden etkinleştirildi (unarchived)
- Bundan sonra teknik borcun temizlenmesi, Huge-Page allocator iyileştirmeleri, bellek verimliliğinin artırılması ve AArch64 optimizasyonlarına odaklanılması planlanıyor
- Meta, jemalloc için uzun vadeli stewardship taahhüdünü yeniden teyit ederken, toplulukla iş birliği içinde projeyi geliştirme yönüne geçiyor
jemalloc'un konumu ve önemi
- jemalloc, yüksek performanslı bir bellek ayırıcısı olarak Meta yazılım yığınında sürekli yüksek etki sağlayan bir bileşen oldu
- Donanım değişimlerine ve üst katman yazılımlarındaki değişikliklere göre sürekli uyum sağladı; Linux çekirdeği ve derleyicilerle birlikte Meta altyapısının kararlılığına ve performansına katkıda bulundu
İlkelerden sapma ve değerlendirme
- Temel yazılım bileşenleri, pratiklik ile ilkeler arasında en yüksek düzeyde disiplin gerektirir
- jemalloc'un sağladığı yüksek etki nedeniyle kısa vadeli kazanımları gerçekleştirme yönünde bir cazibe vardır; buna direnmek için kurumsal ölçekte güçlü öz disiplin gerekir
- Son birkaç yılda jemalloc geliştirmesine yön veren temel mühendislik ilkelerinden kademeli bir sapma yaşandı
- Bazı kararlar anlık fayda sağladı, ancak bunun sonucunda oluşan teknik borç ilerlemeyi engelledi
- Topluluk geri bildirimleri ciddiyetle ele alındı ve proje kurucusu Jason Evans dahil topluluk üyeleriyle görüşmeler yapıldı
- Stewardship'in jemalloc'un uzun vadeli sağlığı üzerindeki etkisi derinlemesine değerlendirildi ve yaklaşım değişikliği paylaşıldı
- Teknik borcu gidermek ve jemalloc için uzun vadeli yol haritasını yeniden kurmak üzere çalışmalara başlandı
Yeni dönem: depo arşivden çıkarılıyor ve gelecek planları
- Toplulukla yapılan görüşmeler sonucunda, orijinal jemalloc açık kaynak deposu yeniden etkinleştirildi (unarchived)
- Bu sayede Meta, projede steward rolünü sürdürürken bakım yükünü azaltmaya ve kod tabanını modernize etmeye odaklanabilecek
- Teknik borcun temizlenmesi: Refactoring ve iyileştirmelerle tüm kullanıcılar için verimli, güvenilir ve kullanımı kolay bir durumun korunması
- Huge-Page allocator (HPA): Transparent Hugepages (THP) kullanımını daha iyi değerlendirerek CPU verimliliğini artırma
- Bellek verimliliği: Packing, caching ve purging mekanizmalarını iyileştirerek bellek verimliliğini optimize etme
- AArch64 optimizasyonu: ARM64 platformunda varsayılan durumda iyi performans sağlama
Toplulukla iş birliğini güçlendirme
- Meta, eylemle güven inşa etmeyi vurguluyor ve jemalloc'un sağlıklı gelişimini hedefliyor
- Topluluğun geri bildirimini ve katılımını memnuniyetle karşılıyor ve jemalloc'un geleceğini birlikte şekillendirmeyi umuyor
- Açık kaynak ekosistemi içinde sürdürülebilir iş birliği ve gelişimi ilerletecek
1 yorum
Hacker News görüşleri
Facebook’ta çalıştığım dönemde, jemalloc’un purging mekanizmasını iyileştirmek için çekirdek yamaları sürdürdüm
Çekirdek ya da güvenlik topluluğunda pek sevilmiyordu ama benchmark’larda verimliydi
Sorun, belleği başka bir iş parçacığına yeniden tahsis ederken zeroing yapılması ve bunun önbellek yerelliği ile performansı etkilemesiydi
Aynı güvenlik alanı içinde belleği yeniden kullanırken bu gereksiz bir davranıştı, ancak “güvenlik alanı”nın nereye kadar uzandığı konusunda uzlaşmak zordu
İlgili tartışma Linux Kernel posta listesinde yer alıyor
HHVM’de söz konusu yamayı uygulamadan önce ve sonra kapsamlı benchmark’lar yaptık, ancak sistem düzeyinde istatistiksel olarak anlamlı bir fark yoktu
Bazı mikro benchmark’larda iyileşme olmuş olabilir ama genel sistem performansına etkisi olmadığı için çekirdeğe alınmadı
Kısa süre önce Microsoft’un mimalloc’unu LD_PRELOAD ile kullanıp 1GB huge page’lerden yararlandım
Bellek yoğun bir programda yaklaşık %20 performans artışı elde ettim
Linux’ta açık kaynak bir MS kütüphanesi kullanarak performansı artırmak tuhaf hissettiriyor
malloc alanında daha fazla rekabet gerektiğini düşünüyorum
Uygulamalar Rust ile yazılmıştı ve çoğu statik olarak linklenmişti
Örneğin app1’de, glibc’ye kıyasla tcmalloc RSS’i %35 azalttı ve işlem süresini %30 kısalttı
Tüm sonuçlar tcmalloc deposu temel alınarak test edildi
Hatta Turbo Pascal bile bellek ayırıcısını doğrudan tanımlayabilmek için API sunuyordu
Sonuçta “one size fits all” yaklaşımının sınırları çok eskiden beri belliydi
Her istek için bir havuz oluşturuluyor, istek bitince de tamamı tek seferde serbest bırakılıyordu
malloc’un da bu yönde evrilmesi için çok alan olduğunu düşünüyorum
Tahsis deseni basitse, üçüncü taraf malloc’tan bile daha iyi sonuç alınabilir
malloc’a sihirli bir kara kutu gibi bakılıyor ama gerçekte o kadar da üstün değil
Ekibimiz 2 yıl önce glibc malloc’tan jemalloc’a geçti
Python servislerinde bellek kullanımı %15~20 azaldı
Ancak konteyner ortamında oversize_threshold ayarı önemliydi — yanlış yapılandırılırsa OOM oluşabiliyor
Uzun süre çalışan servislerde jemalloc ile mimalloc’u karşılaştıran benchmark olup olmadığını merak ediyorum
İlgili ek okuma olarak Jemalloc Postmortem ile
Jemalloc Repositories Are Archived öneriliyor
Acaba bu değişikliğin nedeni küresel bellek kıtlığı olabilir mi diye merak ediyorum
“Bellek ayırıcısını değiştirerek yılda milyonlarca dolar tasarruf” gibi hesaplar çıkabilir
Yalnızca %0,1 verimlilik artışı bile ayda 100 bin dolar tasarruf sağlayabiliyordu
Başlıca tasarruf kalemleri soğutma maliyetleri (HVAC) ve daha az sunucu satın alma ihtiyacıydı
Bugün bellek tasarrufu da büyük bir konu ama o dönemde öyle değildi
Binlerce sunucuyu etkileyen küçük bir iyileştirme bile büyük rakamlara dönüşüyor
Böyle bir nicel iyileştirme kültürü yerleşmiş durumda
Sadece %10 daha hızlı olmak bile LLM rekabetinde avantaj sağlayabilir
Performans iyileştirmesi için teşvik çok büyük
Avustralya’da düşük seviyeli programlama yaparken işten çıkarıldım
Bu tür sorunları çözmeyi gerçekten seviyorum ama yerel pazarın çoğu React CRUD işleri etrafında dönüyor, bu da üzücü
World Bank fonuyla yürütülen bir startup projesinde Ruby + jemalloc’u production’a aldık
Hız ve bellek verimliliği gözle görülür biçimde iyileşti, AWS maliyetleri ciddi şekilde düştü
Bu 8 yıl önceydi; jemalloc’un neden hâlâ standart hâline gelmediğini merak ediyorum
Hâlihazırda çalışan bir sistemi değiştirmek, faydası açık olsa bile kolay değil
jemalloc kullanarak bellek sızıntısının nedenini takip eden örnekler de var
Ayrıntı için GOV.UK teknik blog yazısına bakılabilir
Meta, kendi fork’unda üzerinde çalıştığı içeriği büyük ölçekte birleştirdi
PR #2863 üzerinden görülebilir
jemalloc’un zaman çizelgesi ya da tarihini derleyen bir kaynak olup olmadığını merak ediyorum
Açık kaynak bir proje olmasına rağmen Meta’nın neden kontrolü elinde tuttuğu da soru işareti
Bkz. Jemalloc Postmortem blogu
Kalan 2 kişinin de açıkça belirtilmemiş olsa bile Meta’dan olma ihtimali var