“Sunucu yavaş” dendiğinde
- Şu an ne çalışıyor? Aktif istekler ve kim kimi engelliyor?
- Sunucu neyi bekliyor? Bekleme istatistikleri darboğazın türünü söyler.
- En pahalı sorgular hangileri? Toplam CPU ve okuma bazında.
Aktif istekler ve engelleme
SELECT r.session_id, r.status, r.blocking_session_id, r.wait_type,
r.wait_time, r.cpu_time, r.logical_reads, t.text AS sorgu
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.session_id <> @@SPID;
blocking_session_id dolu olan satırlar, başka bir oturumun kilidini bekliyor demektir. Zincirin başındaki oturum genellikle uzun süren veya COMMIT edilmeyi unutulmuş bir işlemdir.
En pahalı sorgular
SELECT TOP 10
qs.total_worker_time / qs.execution_count AS ort_cpu,
qs.total_logical_reads / qs.execution_count AS ort_okuma,
qs.execution_count,
SUBSTRING(t.text, 1, 200) AS sorgu
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) t
ORDER BY qs.total_logical_reads DESC;
Bekleme türleri
| Bekleme | Genellikle işaret ettiği |
|---|---|
PAGEIOLATCH_* | Diskten sayfa okuma: bellek yetersiz veya eksik indeks yüzünden çok okuma |
LCK_M_* | Kilit bekleme: engelleme, uzun işlemler |
CXPACKET / CXCONSUMER | Paralel sorgu senkronizasyonu |
WRITELOG | Günlük diski yavaş |
SOS_SCHEDULER_YIELD | CPU baskısı |
Deadlock (kilitlenme)
İki işlem birbirinin kilidini bekler: A, X'i kilitleyip Y'yi ister; B, Y'yi kilitleyip X'i ister. SQL Server bunu otomatik algılar ve birini kurban seçip geri alır (hata 1205). Uygulama bu hatayı yakalayıp işlemi yeniden denemelidir.
- Tabloları her işlemde aynı sırayla güncelle.
- İşlemleri kısa tut; kullanıcı girdisi beklerken işlem açık bırakma.
- Uygun indekslerle daha az satır kilitle.
- Okuma ağırlıklı sistemlerde
READ_COMMITTED_SNAPSHOTdüşün.
AraçlarQuery Store (sorgu geçmişi), Extended Events (deadlock grafikleri dahil hafif izleme), Activity Monitor. PostgreSQL'de
pg_stat_activity ve pg_stat_statements; MySQL'de performance_schema ve sys şeması; Oracle'da AWR raporları.