MSSQL Server’da WRITELOG Bekleme Tipi

SQL Server’da WRITELOG, bir işlemin (transaction) tamamlanabilmesi için gerekli olan log kayıtlarının, bellekteki Log Buffer’dan (Log Tamponu) fiziksel diskteki Transaction Log (.ldf) dosyasına yazılmasını bekleme süresidir.

SQL Server “Write-Ahead Logging” (WAL) prensibiyle çalışır; yani veri dosyasında bir değişiklik yapılmadan önce, bu değişikliğin log’a kaydedilmesi ve bu kaydın diske ulaştığından emin olunması gerekir. İşte bu “diske ulaşma” anındaki gecikme WRITELOG olarak karşımıza çıkar.

Bu bekleme tipinin yüksek olması, SQL Server’ın veriyi işleme hızının, diskin log yazma hızından çok daha yüksek olduğunu gösterir. Temel nedenler şunlardır:

  • Yavaş Disk Alt Yapısı: Log dosyasının bulunduğu diskin yazma gecikmesinin (latency) yüksek olması.
  • Sık ve Küçük İşlemler (Chatty Transactions): Her satır için ayrı bir INSERT ve COMMIT yapılması. Her COMMIT, logun diske yazılmasını (flush) zorunlu kılar.
  • Log Dosyası Üzerindeki Diğer Yükler: Log yedekleme (Log Backup), Replication veya Change Data Capture (CDC) gibi mekanizmaların aynı dosya üzerinde yoğun okuma yapması.
  • VLF Parçalanması: Log dosyasında çok fazla VLF olması, yönetimi zorlaştırarak dolaylı yoldan yazma performansını etkileyebilir.

WRITELOG beklemesini azaltmak için hem kod tarafında hem de donanım tarafında yapılabilecekler vardır:

A. İşlemleri Toplu Yapın (Batching)

En etkili yazılım çözümüdür. 1000 satırı tek tek COMMIT etmek yerine, tek bir BEGIN TRAN … COMMIT bloğu içine alın. 1000 kez diske gitmek yerine 1 kez gidersiniz.

B. Disk Performansını İnceleyin

Log dosyaları her zaman sıralı (sequential) yazma yapar. Log dosyalarını (.ldf) mümkünse veri dosyalarından (.mdf) ayrı bir fiziksel disk grubuna taşıyın. Yazma gecikmesini (io_stall_write_ms) kontrol edin; 5ms’nin altı mükemmel, 10-20ms arası ise risklidir.

C. Delayed Durability (Gecikmeli Dayanıklılık)

Eğer sisteminizde milisaniyelik veri kaybı tolere edilebilirse (ve SQL 2014+ kullanıyorsanız):

  • SET DELAYED_DURABILITY = FORCED; ayarını aktif edin. Bu, SQL Server’ın logu diske yazmadan işlemi onaylamasını sağlar ve WRITELOG beklemelerini neredeyse sıfıra indirir.

D. Log Dosyasını Optimize Edin

  • IFI (Instant File Initialization): Log dosyaları için geçerli olmasa da, sistemin genel disk sağlığı için IFI’nın açık olduğunu teyit edin.
  • Autogrow: Log dosyasının sık sık büyümesini engelleyin; önceden yeterli boyuta getirin.

Özetle

BelirtiOlası NedenÖnerilen Aksiyon
Yüksek WRITELOG + Düşük Disk HızıDonanım YetersizliğiLog dosyasını SSD/NVMe diskine taşıyın.
Yüksek WRITELOG + Çok sayıda COMMITYanlış KodlamaCOMMIT sayısını azaltın, işlemleri batch’leyin.
Sürekli Log Backup sırasında artışI/O ÇekişmesiLog yedekleme sıklığını veya disk hızını gözden geçirin.

Eğer disk gecikme süreleriniz düşük olmasına rağmen hala WRITELOG görüyorsanız, sorun diskin hızı değil, diske giden “onay” (acknowledgment) sayısının çok fazla olmasıdır (Transaction fırtınası).

Başka makalede görüşmek dileğiyle..

Başkaları ile alay etmeyin. Hucurat-11

Author: Yunus YÜCEL

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir