1 puan yazan GN⁺ 2025-03-19 | 1 yorum | WhatsApp'ta paylaş
  • Ubuntu’nun sunduğu jq kaynak kod paketini doğrudan derlemek, performansı %90’a kadar artırabiliyor
  • Derleyici, optimizasyon bayrakları ve bellek ayırıcı iyileştirilerek performans en üst düzeye çıkarılıyor

Kurulum

  • jq, JSON biçimindeki GeoJSON dosyalarını işlemek için kullanılıyor
    • 500MB büyüklüğündeki Alameda County Assessor’s parcel map üzerinde, belirli bir değerin üzerindeki tüm parsellerin şehir adını yazdıran bir sorgu çalıştırılıyor
  • Ryzen 9 9950X sisteminde, önbelleğe alınmış dosya üzerinden yaklaşık 5 saniye sürmesi nedeniyle bunun iyileştirilmesine karar veriliyor

1. adım: Paketi yeniden derlemek

  • Launchpad’den jq kaynak kodu indirildikten sonra hiçbir bayrak kullanılmadan yeniden derleniyor
  • Sonuç: %2~4 performans artışı
  • Benchmark sonuçları
    • Derlenen jq: ortalama 4.517 saniye
    • Ubuntu varsayılan paketi: ortalama 4.641 saniye
    • Performans artışı: 1,03 kat daha hızlı

2. adım: Clang ve gelişmiş optimizasyon bayraklarını kullanmak

  • Clang-18 ile derlenip optimizasyon seviyesi ve LTO kullanılıyor
  • Kullanılan başlıca bayraklar:
    • -O3 → optimizasyon seviyesini yükseltir
    • -flto → Link-Time Optimization uygular
    • -DNDEBUG → debug kodunu hariç tutar
  • Benchmark sonuçları
    • Derlenen jq: ortalama 3.853 saniye
    • Ubuntu varsayılan paketi: ortalama 4.631 saniye
    • Performans artışı: 1,20 kat daha hızlı

3. adım: TCMalloc eklemek

  • GNU libc’nin varsayılan malloc’u yerine TCMalloc kullanılıyor
  • -L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal eklendikten sonra derleniyor
  • Benchmark sonuçları
    • Derlenen jq: ortalama 3.253 saniye
    • Ubuntu varsayılan paketi: ortalama 4.611 saniye
    • Performans artışı: 1,42 kat daha hızlı

4. adım: TCMalloc için dinamik preload uygulamak

  • Ubuntu varsayılan paketinde dinamik preload ile TCMalloc kullanılıyor
  • Benchmark sonuçları
    • Varsayılan jq: ortalama 4.601 saniye
    • TCMalloc uygulanmış jq: ortalama 4.082 saniye
    • Performans artışı: 1,13 kat daha hızlı

5. adım: Diğer ayırıcılar için dinamik preload testi

  • Ubuntu’nun sunduğu diğer bellek ayırıcıları jemalloc ve mimalloc test ediliyor
  • En iyi performansı mimalloc veriyor
  • Benchmark sonuçları
    • Varsayılan jq: ortalama 4.123 saniye
    • TCMalloc uygulanmış jq: ortalama 4.130 saniye
    • Jemalloc uygulanmış jq: ortalama 3.510 saniye
    • Mimalloc uygulanmış jq: ortalama 3.154 saniye → performans 1,31 kat arttı

6. adım: mimalloc ile doğrudan derlemek

  • mimalloc, dinamik preload yerine statik olarak linkleniyor
  • Performans en üst düzeye çıkarılıyor
  • Benchmark sonuçları
    • Derlenen jq: ortalama 2.428 saniye
    • Ubuntu varsayılan paketi: ortalama 4.606 saniye
    • Performans artışı: 1,90 kat daha hızlı

🚀 Nihai sonuç

  • Doğrudan derlenen jq, Ubuntu paketinden %90 daha hızlı
  • 2,2GB JSON dosyası 13.000 adet işlendiğinde performans:
    • Derlenen jq: 0.755 saniye
    • Varsayılan jq: 1.424 saniye
    • Performans artışı: yaklaşık 2 kat

1 yorum

 
GN⁺ 2025-03-19
Hacker News görüşleri
  • "Ubuntu paketlerini yeniden derleyip bellek ayırıcısını değiştirerek %90 daha hızlı hale getirmek" başlığı clickbait gibi duruyor

    • Konu yalnızca tek bir paketle ilgili ve performans artışının bir kısmı yeniden derleme ile sağlanmadı
    • malloc uygulamasını değiştirmek için jemalloc önceden yüklenmiş olarak kullanılmış ve bellek kullanımını dengelemede olumlu sonuçlar alınmış
    • Bu, bellek sızıntısı sorununu çözdü; muhtemelen sorun uygulamanın kendisinden değil, bellek parçalanmasından kaynaklanıyordu
  • Mühendislik, ödünleşim sanatıdır

    • Yazı, performans kazanımının büyük kısmının bellek ayırıcısını uzmanlaştırarak elde edildiğini açıklıyor
    • Çok iş parçacıklı projelerde ayırıcı seçimi önemlidir; bir projedeki hız artışı başka bir projede çökme yaratabilir
    • Yeniden ayırma stratejisi de dikkate alınmalı; uzun vadeli kararlılık ile kısa vadeli hız arasında seçim yapmak gerekir
    • Bir video düzenleyici geliştirirken çeşitli ayırıcılar denenmiş ve glibc ayırıcısının uzun vadeli kararlılık sağladığı görülmüş
  • Gentoo Linux, kullanıcının özel kullanım amacına göre optimize edilebilmesi için tasarlanmış bir işletim sistemidir

    • İlk kurulumdan sonra kullanımı basittir ve Gentoo Linux kanalında birçok arkadaş edinildiği hatırlanıyor
    • İlk ChromeOS sürümleri temelde özelleştirilmiş bir Gentoo Linux kurulumu idi
  • jq gibi paketleri elle kurmak, güvenlik güncellemelerinin dışında kalmaya yol açabilir

    • Örneğin onigurama için bir güvenlik güncellemesi çıkmıştı; benzer bir durum tekrar yaşanırsa sistem savunmasız kalabilir
    • CVE-2017-9224 dahil çeşitli güvenlik açıklarının düzeltildiği örnekler bulunuyor
  • Resmî olmayan bir malloc kullanmak tuhaf hatalara yol açabilir

    • Geliştiricilerin kullandığı bayrakların dışına çıkıldığında sorun yaşanma olasılığı yüksektir
  • Basit bir değişiklikle büyük hız artışı elde edilebildiğini okuyunca bunu jq geliştiricisine bildirmek isteniyor

    • Yazı bu seçeneği değerlendirmemiş gibi görünüyor ve yorumlarda da bundan söz edilmiyor
  • Paketleri kaynaktan derlemek veya resmî ikilileri indirmek faydalı olabilir

    • Elle kurulan ve kaynaktan derlenen paketlerin güncellemelerini takip etmek zordu, ancak bunu çözmek için bir araç geliştirilmiş
  • Rust'ın cargo install özelliği, belirli bir platform için optimizasyon yapılabilmesini sağladığı için kullanışlıdır

    • jaq ve yq, jq kullanılırken performans artışı için sık kullanılan seçeneklerdir
  • Bellek ayırıcısı değiştirildikten sonra Ubuntu paketi yeniden derlenerek %90 daha hızlı hale getirilebilir

    • Bunun Debian ve RedHat'te de çalışması muhtemeldir
    • İlk başta bunun Ubuntu'yu Linux From Scratch'e dönüştürmeyle ilgili bir yazı olduğu sanılmıştı