dataiotech Labs
dbaguidedbaguideDBAdataxtoolsdataopsphere
Runbook #30
sqlserver
PerformanceSEV2 · CİDDİ BOZULMA15-30 dakika / 15-30 minssysadmin / CONTROL SERVER / VIEW SERVER STATE

SQL Server Disk I/O Gecikmesi: Veri ve Transaction Log Darboğazı

Dosya bazında okuma ve yazma gecikmesini iki örnek arasındaki farkla ölçer; sorgu, yedekleme ve depolama kaynaklı nedenleri ayırır.

İlişkili Metrik:M31
İlişkili Script:S55S45
#io-latency#PAGEIOLATCH#WRITELOG#storage

Operasyonel Güvenlik ve Risk Uyarısı

Bu runbook müdahale adımları içerir; birçok adım yazma etkilidir (KILL, terminate, DROP, RESIZE). Önce test ortamında deneyin, üretimde adımları sırayla ve doğrulayarak uygulayın.

🟢 Salt Okunur (Read-Only)·🟡 Geri Alınabilir (Reversible)·🔴 Yüksek Etkili / Geri Alınamaz (High Impact)

1. Belirti / Symptom

- M31'de veri dosyası okuma gecikmesi sürekli >20 ms veya log yazma gecikmesi >5 ms (iş yüküne göre ayarlanacak başlangıç eşikleri).

- `PAGEIOLATCH_*` veya `WRITELOG` beklemeleri artar; işlem commit'leri ve sorgular yavaşlar.

2. Etki / Impact

Okuma sorguları ve transaction commit'leri uzar; eşzamanlı iş yükü sıraya girer. Depolama doygunluğu yedeklemeyi ve Always On redo işlemlerini de etkileyebilir.

3. Teşhis / Diagnosis

🟢 Salt Okunur1. S55 ile **iki zaman noktasında** ölçün. DMV değerleri sunucu başlangıcından beri kümülatiftir; tek ekran görüntüsünü anlık gecikme sanmayın:
sql
SELECT v.database_id, v.file_id, DB_NAME(v.database_id) AS db_name,
       mf.type_desc, mf.physical_name,
       v.num_of_reads, v.io_stall_read_ms,
       v.num_of_writes, v.io_stall_write_ms
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS v
JOIN sys.master_files AS mf
  ON mf.database_id = v.database_id AND mf.file_id = v.file_id
ORDER BY v.io_stall_read_ms + v.io_stall_write_ms DESC;

1-5 dakika arayla aynı çıktıyı alın. `read_ms = Δio_stall_read_ms / NULLIF(Δnum_of_reads,0)`, `write_ms = Δio_stall_write_ms / NULLIF(Δnum_of_writes,0)`.

🟢 Salt Okunur2. S45 ile dosya büyümesi/autogrowth, boş alan ve fiziksel disk eşleşmesini bulun. Veri dosyası mı, `.ldf` log dosyası mı, TempDB mi ayrı değerlendirin.
🟢 Salt Okunur3. OS/hipervizör/bulut disk metrikleriyle IOPS, throughput, kuyruk ve latency korelasyonu yapın. `PAGEIOLATCH_*` okuma, `WRITELOG` log flush yönünde ipucudur; tek başına disk arızası kanıtı değildir.
🟢 Salt Okunur4. Aynı zamanda backup/CHECKDB/index bakım işi mi çalışıyor? Ağır tarama yapan sorgular (S42) diski gereksiz yüklüyor mu?

4. Müdahale / Response

🟡 Geri Alınabilir1. Planlı toplu iş/yedek/indeks bakımını yoğun saat dışında sürdürün veya sahibiyle koordine edip durdurun; kurtarma güvencesini sağlayan log yedeklerini gelişigüzel kapatmayın.
🟡 Geri Alınabilir2. Kötü plan/eksik indeks nedeniyle aşırı fiziksel okuma varsa sorguyu ve istatistikleri hedefli optimize edin; `ALTER INDEX ... REBUILD` işlemini düşük alanlı/yavaş disk üzerinde refleks olarak çalıştırmayın.
🟡 Geri Alınabilir3. Disk hizmeti sınırına takılıyorsa depolama ekibiyle IOPS/throughput limitini ve disk katmanını iyileştirin; **yeterli alan ve uygun konfigürasyon doğrulanmadan** veri/log dosyası taşımayın.
🟡 Geri Alınabilir4. Sürekli autogrowth gözleniyorsa gelecekteki hedef boyuta kontrollü büyütmeyi planlayın. Mantıksal dosya adını S45 ile doğrulayın:
sql
ALTER DATABASE [OrnekDb] MODIFY FILE
  (NAME = N'OrnekDb_Data', FILEGROWTH = 512MB);

Bu **mevcut disk gecikmesini tek başına gidermez**; büyüme sıçramalarını azaltır. Log dosyasında instant file initialization uygulanmaz.

5. **Yapmayın:** `DBCC SHRINKFILE` ile alanı yeniden dağıtarak sorunu çözmeye çalışmayın; yeniden büyüme ve fragmentasyon yaratır. `NOLOCK` I/O çözümü değildir.

5. Doğrulama / Verification

- Aynı dosyalar için yeni iki örnek arasındaki gecikme düştü ve M31 değerlendirme penceresi boyunca normal.

- Disk kuyrukları, `PAGEIOLATCH_*`/`WRITELOG` bekleme hızları ve uygulama gecikmeleri iyileşti.

6. Geri Alma / Rollback

- `FILEGROWTH` değişikliği önceki değere alınabilir; disk servis katmanı değişikliği sağlayıcının geri alma planına bağlıdır.

- Duraklatılan planlı işleri tekrar etkinleştirin; atlanan yedeklerin telafisini doğrulayın.

Diğer SQLSERVER Runbook'ları