- Netflix, CPU ağırlıklı bir Java mikroservisini m5.4xl (16 vCPU)’den m5.12xl (48 vCPU)’ye taşıdı
- vCPU sayısı 3 kat olduğu için yaklaşık 3 kat performans artışı bekleniyordu, ancak iş hacmi yalnızca %25 arttı
- Hatta gecikme %50 azaldı ve hem CPU hem de gecikme desenleri daha da "kesik kesik" hale geldi (Choppy)
- Bunu çözmek için yürütülen çalışmaları düşük seviye ayrıntılara kadar derleyen bir yazı
Çözüm süreci
- Hızlı düğüm ile yavaş düğümü karşılaştırmaya karar verildi
- Flame Graph ve JVM profilleme (JFR - Java Flight Recorder kullanılarak) ile fark anlaşılamadı
- Uygulama/OS/JVM seviyesinde anormal bir durum görülmeyince, m5.12xl instance’ının sunduğu PMC’ye (Performance Monitoring Counters, PMU Counter) bakıldı
- Sorunlardan biri "False Sharing" idi; bu, 2 çekirdeğin aynı L1 önbellek satırını paylaşan, birbiriyle ilgisiz değişkenleri okuması veya yazması sırasında ortaya çıkan bir desen
- JDK kodunda işlev değiştirilmeden, yalnızca veri yerleşimi değiştirilip padding byte’ları eklenerek bu sorun çözüldü
- Bir diğer sorun ise "True Sharing" idi; aynı değişkenin birden fazla thread/çekirdek tarafından okunup yazılması
- Bunu çözmek için paylaşılan değişkene yazmak yerine JVM’in secondary super class cache’i baypas edildi
- Her iki yamadan sonra hız başlangıca göre 3,5 kat arttı
- Bu sorun çözülürken 5 yıldır atıl durumda olan JDK-8180450 hatası da fark edildi
Sonuç
- JVM’in, C++ gibi performans odaklı dillerle rekabet eden son derece optimize bir çalışma zamanı ortamı olduğu düşünülme eğilimi var
- Bu, çoğu iş yükü için doğru olsa da bazı özel iş yüklerinde yalnızca uygulama implementasyonu değil, JVM’in kendi implementasyonu da etkili olabilir
- Bu vakada, JVM’in native kodundaki darboğaz bulunup yamanarak ilgili iş yükünün throughput’unu 3 katın üzerine çıkarmak için PMC kullanıldı
- Bu tür performans sorunlarında, yürütmeyi CPU mikro mimarisi seviyesinde inceleyebilme yeteneği tek çözüm olabilir
- Intel vTune, m5.12xl gibi instance’larda açığa çıkan temel PMC’lerle bile değerli içgörüler sağlıyor
- Buluttaki tüm instance’lar PEBS (Processor Event-Based Sampling) ile birlikte kapsamlı bir PMC seti sunsaydı, daha derin analizle çok daha büyük performans artışları elde edilebilirdi
2 yorum
Vay be gerçekten...
Hipotez doğrulanıp düzeltildiğinde oldukça heyecan verici olmuştur.