Hoşgeldin Misafir

Yasar7880

İzmir
1 Mar 2024
840 Mesaj
TIM Görevleri
1

Aktiflik

Seviye

Deneyim

TIM / GÖREV:

iu

Merhaba THS Okurları

Bugün backend ve sistem tarafında en kafa karıştıran durumlardan birini ele alıyoruz:


CPU düşük ama sistem yavaş!


  • CPU %15–20
  • RAM normal
  • Disk boşta
  • Ama API geç cevap veriyor
  • Thread’ler bekliyor

Kullanıcı diyor ki:
“Makine boş ama neden yavaş?”


Turkhacks ekibi olarak net söylüyoruz:
Bu durum genelde Thread Starvation veya Lock problemi.
Yani sistem boş görünür ama aslında kilitlenmiştir.



Sorunun Adı: Thread Starvation

Thread starvation:

  • Thread’lerin çalışacak iş bulamaması değil
  • Çalışmak isteyip kaynak beklemesi


Yani:

  • Thread var
  • CPU boş
  • Ama iş ilerlemiyor

Asıl Sebep: Lock (Kilitleme) Problemleri


Java’da:
  • synchronized
  • ReentrantLock
  • database lock

yanlış kullanılırsa:


Tüm sistem beklemeye girer



Belirtiler


1️⃣ CPU Düşük Ama Response Yavaş

En kritik işaret

2️⃣ Thread Dump’ta WAITING / BLOCKED

  • Thread’ler çalışmıyor
  • Bekliyor

3️⃣ Trafik Artınca Sistem Çöküyor

Lock büyür → herkes bekler


4️⃣ Timeout Hataları

  • API cevap vermez
  • Client timeout olur

Sağlıklı vs Kilitlenmiş Sistem


DurumSağlıklı
Lock Sorunu
CPUYüksekDüşük
Thread durumuRUNNABLEBLOCKED
ResponseHızlıYavaş
ÖlçeklenebilirlikVar
Yok



En Yaygın Hatalar


1️⃣ Büyük synchronized blokları


synchronized(this) {
// ağır işlem
}

Tüm thread’ler sıraya girer



2️⃣ Tek Kaynağa Bağımlılık


  • Tek DB connection
  • Tek cache erişimi

Bottleneck oluşur


3️⃣ Yanlış Thread Pool

  • Thread sayısı az
  • Queue dolu

İşler bekler


4️⃣ Database Lock

  • Uzun transaction
  • Row lock
Diğer işlemler durur


5️⃣ Nested Lock (Deadlock Riski)


👉 Thread A → B’yi bekler
👉 Thread B → A’yı bekler

Sistem kilitlenir



Nasıl Tespit Edilir?

Turkhacks ekibi olarak kullandığımız yöntemler:


1️⃣ Thread Dump Al


jstack <pid>

Thread durumlarını gör


2️⃣ BLOCKED Thread’leri Bul

Kim kimin kilidini tutuyor analiz et


3️⃣ Profiling Yap

  • VisualVM
  • JProfiler
Darboğazı gör

4️⃣ DB Lock Kontrolü

Uzun süren query var mı?


Çözüm Yöntemleri


✔ Lock Süresini Azalt


  • Kritik bölgeyi küçült
  • Gereksiz synchronized kaldır

✔ Concurrent Yapılar Kullan


ConcurrentHashMap

Daha az kilit



✔ Thread Pool Optimize Et

  • Doğru thread sayısı
  • Queue ayarı

✔ Database Optimizasyonu

  • Transaction süresini kısalt
  • Index kullan

✔ Async / Virtual Thread Kullan


Beklemeyi azalt


En Büyük Yanılgı

“CPU boş → sistem sağlıklı”

❌ Yanlış

CPU boş olabilir çünkü sistem çalışamıyordur.




Gerçek Senaryo


Durum
Sonuç
100 requestHızlı
500 requestYavaş
1000 request
Kilitlenme

Sebep: lock büyümesi


🎯 Altın Kural

👉 “Thread çalışmıyorsa sebep genelde CPU değil, beklemedir.”




SONUÇ

Sevgili THS okurları,
CPU düşük diye sistem sağlıklı sanmak en büyük hatalardan biridir.

Turkhacks ekibi olarak net söylüyoruz:

✔ Thread dump analiz etmeyi öğren
✔ Lock kullanımını minimize et
✔ DB ve thread pool’u optimize et
✔ Profiling yapmadan karar verme


Unutmayın:
👉 En tehlikeli performans sorunu, görünmeyen darboğazdır.


Bir sonraki ileri seviye analizde görüşmek üzere. Thread’leriniz çalışsın, sisteminiz akıcı olsun



9jul8m7.jpeg
 
Son düzenleme: