.NET parallel loop'lar tek CPU'lu konteynerda seri hale gelebiliyor
.NET'te paralel döngüler yazarken bir tuzağa düşebilirsin: özellikle konteynerlaştırılmış ortamlarda, varsayılan CPU ayarları döngüyü fiilen seri hale getirebiliyor.
Sorun şu: eğer konteynerin CPU limiti 1 ise (örneğin Docker'da `--cpus=1`),.NET'in paralel görev planlayıcısı bu sınırı algılıyor ve paralel işçi sayısını buna göre ayarlıyor. `Parallel.ForEach()` veya benzer yapılar tek bir thread'de çalışmaya başlıyor. Özellikle I/O-yoğun işlemlerde (API çağrısı, veritabanı sorgusu) bu durum performansı ciddi şekilde düşürüyor, her kayıt sırayla işleniyor.
Çözüm basit ama iki adımlı. Birincisi, `MaxDegreeOfParallelism` değerini açıkça yükselt:
1var options = new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount };2Parallel.ForEach(records, options, record => ProcessRecord(record));Ancak burada dikkat etmen gereken ikinci nokta daha önemli: aşağı akış servislerin (downstream services) bu yüksek eşzamanlılığa dayanıp dayanamayacağı. Eğer API'n dakikada 100 isteği kaldırabiliyorsa ama sen 1000 gönderirsen, şu ya da bu şekilde ağır cezalar çekeceksin, timeout, rate limiting veya hizmet çökmesi.
Yani paralel loop'u hızlandırmak sadece ilk yarısı. Gerçek sorun, tüm sistemin (konteyner, veritabanı, harici servisler) eşzamanlılık bütçesini dengede tutmak. Container'ın CPU sınırını, thread sayısını ve hedef servislerin kapasitesini birlikte düşünmen lazım.
0 yorum