Java sanal iş parçacıkları: I/O'da 15 kat hız, CPU'da fayda yok
8.000 işlemlik takas simülasyonu, Java sanal iş parçacıklarının I/O-bound işlerde 15 kat hızlandığını, CPU-bound Monte Carlo hesaplamalarında ise hiçbir avantaj sağlamadığını gösteriyor.
Bir T+1 hisse senedi takas simülatörü, Java'nın Project Loom sanal iş parçacıklarının gerçek dünya senaryolarında ne zaman işe yaradığını ne zaman yaramadığını net biçimde ortaya koyuyor. I/O'ya bağlı 8.000 işlem takası testinde, sanal iş parçacıkları 200'lük platform thread havuzuna göre yaklaşık 15 kat daha hızlı çalışırken, kullanılan işletim sistemi thread sayısı onda birine iniyor. Bu kazanç, görevlerin çoğu zamanını beklemede geçirmesinden kaynaklanıyor; sanal thread, bloklayan bir çağrı sırasında taşıyıcı thread'inden ayrılıp başka bir göreve yer açabiliyor.
Ancak makale, 'pinning' (sabitlenme) tuzağına da dikkat çekiyor: synchronized blok içindeki bloklayan çağrılar, sanal thread'in taşıyıcısından ayrılmasını engelliyor ve etkin eşzamanlılığı sessizce çöktürüyor. Bu, hata fırlatmadığı için teşhisi zor bir üretim sorununa dönüşebiliyor; -Djdk.tracePinnedThreads=full bayrağı bu noktaları tespit etmek için öneriliyor. JEP 491 ile JDK 24'te bu kısıtlama tamamen kaldırılıyor.
CPU'ya bağlı ikinci testte tablo tersine dönüyor. Aynı 8.000 işlem üzerinde işlem başına 20.000 Monte Carlo simülasyonuyla Value-at-Risk hesaplanan senaryoda sanal iş parçacıkları, sıralı çalışmadan bile daha yavaş kalıyor ve sabit havuz ile paralel stream stratejileriyle aynı dar bantta sonuçlanıyor. Çünkü CPU-bound görevlerde beklenecek bir 'boşta zaman' yok; tavan her zaman fiziksel çekirdek sayısı ile sınırlı.
Mühendisler için çıkarım net: sanal iş parçacıkları zamanlama problemini çözer, hesaplama kapasitesini artırmaz. I/O-ağırlıklı servislerde büyük kazanç sağlarken, saf CPU işlerinde ek zamanlayıcı yükü dışında bir fayda getirmiyor ve doğru araç seçimi iş yükünün doğasına bağlı kalıyor.