- Scala 2.13'ten Scala 3'e kod tabanı geçişi sırasında beklenmedik bir performans düşüşü yaşandı
- İlk test ve dağıtım ortamlarında tüm metrikler normaldi, ancak birkaç saat sonra Kafka gecikmesi (lag) arttı
- Yük testlerinde mesajın ayrıntılı işlenmesi sırasında throughput düşüşü net biçimde tespit edildi
- async-profiler analizi, sorunun Quicklens kütüphanesindeki zincir değerlendirme verimsizlik hatası olduğunu ortaya koydu
- Kütüphane güncellemesinden sonra performans geri geldi; Scala sürümleri arasındaki kütüphane davranış farklılıklarına dikkat edilmesi gerektiği vurgulandı
Servis Geçiş Süreci
- Mevcut servis, Scala 2.13'ten Scala 3.7.3'e taşındı
- Makro kullanmayan veri toplama odaklı bir servis olup performansı kritik bir bileşendi
- Bağımlılıklar, derleyici seçenekleri, tip ve sözdizimi değişiklikleri uygulandıktan sonra derleme başarılı oldu
- Test ortamı ve kademeli dağıtım sürecinde de loglar ve metrikler normal göründü
- Altyapı, JVM ve uygulama seviyesindeki ölçümler de sağlıklı durumdaydı
Sebebi Belirsiz Performans Düşüşü
- Dağıtımdan yaklaşık 5-6 saat sonra Kafka lag artışı görüldü
- Veri spike'ı olmayan durumda bile örnek başına işleme oranında düşüş
- Geri alma sonrası işleme oranı anında toparlandı ve nedenin kod değişikliği olduğu doğrulandı
Performans Analizi ve Kök Neden Tespiti
- Yük testlerinde başlangıçta performans regresyonu yeniden üretilemedi
- Yalnızca mesajın parçalanması ve heterojen yüklerde işlemde throughput hızla düştü
- Bağımlılık kütüphanelerini (seri hale getirme, DB SDK, Docker image, konfigürasyon kütüphanesi vb.) tek tek geri alarak test ettiler, ancak değişiklik görülmedi
- async-profiler ile CPU profillemesi sonucunda
- Scala 3'te JIT derleyicisi ve decode aşamasında CPU kullanımının ciddi biçimde artması
- Flamegraph'ın üst satırlarında Quicklens çağrılarının toplam CPU zamanının yarısını oluşturduğu görüldü
- Scala 2.13'te aynı çağrılar yalnızca %0.5 seviyesindeydi
Sorunun Kök Nedeni
- Quicklens kütüphanesinde zincir değerlendirme verimsizlik hatası, Scala 3'te ortaya çıkıyordu
- İlgili düzeltme GitHub PR #115'te yer aldı
- Kütüphane güncellemesinden sonra Scala 3 ile 2.13 arasındaki performans farkı giderildi
Dersler ve Öneriler
- Kütüphanelerin metaprogramlama bağımlılığı Scala sürümleri arasındaki performans farklarını tetikleyebilir
- Geçiş tamamlanmış görünse bile, hotspot ve darboğazları benchmark etmek gerekir
- Performansın kritik olduğu hizmetlerde “çalışıyor” varsayımı yerine ölçüme dayalı doğrulama şarttır
- Darboğazı sadece kodla değil, benchmark'ın açığa çıkardığı senaryoları engellemek için ön kontrol gerekir
Henüz yorum yok.