SQL Server’da IO_COMPLETION, SQL Server’ın genel bir disk I/O işleminin tamamlanmasını beklediği ancak bu işlemin “veri okuma” (PAGEIOLATCH) veya “log yazma” (WRITELOG) gibi spesifik kategorilere girmediği durumlarda oluşur.
Genellikle veritabanının normal sorgu trafiği dışındaki yönetimsel ve arka plan işlemleri sırasında karşımıza çıkar.
Bu bekleme tipi, SQL Server’ın bir I/O talebi gönderip işletim sisteminden (Windows) “İşlem bitti” sinyalini alana kadar geçen süreyi ölçer. En yaygın nedenleri şunlardır:
- Backup & Restore: Yedekleme dosyalarının diske yazılması veya diskten okunması sırasında yoğun olarak görülür.
- Veritabanı Dosyası Büyümesi (Autogrowth): Bir veri veya log dosyası otomatik olarak büyürken, diske yeni alan tahsis edilmesi süreci bu beklemeyi tetikler.
- CheckDB ve İndeks Bakımı: DBCC CHECKDB gibi işlemler veya büyük indekslerin REBUILD edilmesi sırasında geçici dosya (Worktable) yazımlarında görülür.
- Sanal Bellek Kullanımı (Paging): Eğer sunucuda RAM yetersizse ve Windows, SQL Server’ın belleğini diskteki pagefile.sys dosyasına yazmaya (paging) başlarsa, ciddi IO_COMPLETION beklemeleri oluşur.
- VLF (Virtual Log File) Oluşturma: Log dosyası ilk oluşturulduğunda veya büyüdüğünde içindeki sanal log dosyalarının hazırlanma aşaması.
Eğer IO_COMPLETION beklemesi sisteminizde en üst sıralardaysa, bu doğrudan depolama (Storage) performansına veya dosya yönetim stratejinize işaret eder:
A. Instant File Initialization (IFI) Ayarını Kontrol Edin
Bu, IO_COMPLETION beklemelerini azaltmak için yapabileceğiniz en önemli ayardır.
- IFI kapalıyken, SQL Server yeni bir dosya alanı açtığında (büyüme veya restore), bu alanı sıfırlarla (zeroing) doldurur. Bu işlem çok yavaştır.
- SQL Server servis hesabına Windows üzerinde “Perform Volume Maintenance Tasks” yetkisini verin. Bu sayede dosya büyütme ve restore işlemleri anında gerçekleşir.
B. Otomatik Büyüme (Autogrow) Ayarlarını Optimize Edin
- Veri dosyalarınızın yüzde (%) bazlı büyüme yerine sabit MB (örneğin 512MB veya 1GB) bazlı büyümesini sağlayın. Çok sık ve küçük büyümeler sürekli I/O tıkanıklığı yaratır.
- Mümkünse dosyaları önceden (Pre-allocate) tahmin ettiğiniz büyüklüğe getirin.
C. Yedekleme Performansını Artırın
Yedekleme sırasında bu beklemeyi alıyorsanız:
- Compression: Yedekleme sıkıştırmayı açarak diske yazılan veri miktarını azaltın.
- Multiple Files: Yedeği tek bir büyük dosya yerine birden fazla dosyaya (TO DISK = ‘file1.bak’, ‘file2.bak’…) bölün.
D. Windows Page File ve RAM Kontrolü
Sunucuda “Memory Pressure” (Bellek Baskısı) olup olmadığını kontrol edin. SQL Server’ın belleği diske swap ediliyorsa (paging), disk hızı ne olursa olsun sistem kilitlenme noktasına gelir.
Özetle:
| Belirti | Olası Neden | Aksiyon |
| Yedekleme sırasında artış | Disk yazma hızı yetersiz | Backup Compression ve IFI kontrolü. |
| Sorgu sırasında anlık takılma | Autogrow tetiklenmesi | Dosya büyüme oranlarını sabitleyin (MB bazlı). |
| Sürekli yüksek değerler | OS Paging / RAM yetersizliği | RAM artırımı veya Max Server Memory ayarı. |
| Restore sırasında yavaşlık | IFI kapalı | “Perform Volume Maintenance Tasks” yetkisini verin. |
Eğer IO_COMPLETION ile birlikte PAGEIOLATCH_SH değerleriniz de yüksekse, sorununuz sadece yönetimsel işlemler değil, genel disk alt yapınızın (IOPS/Bandwidth) yetersiz olmasıdır.
Başka makalede görüşmek dileğiyle..
Boş konuşmalardan kaçının Müminin-3
