BACKUP THREAD, LATCH_EX ve PREEMPTIVE_OS_WRITEFILEGATHER Bekleme Tipleri

SQL Server’ın en kritik yapılarından biri olan Lock Mekanizması, ACID yapısını korumak için kritik önem taşımaktadır. Bu yazımızda günlük rutin işlerimizden birini yaparken bu mekanizmanın devreye girmesinin sebep ve sonuçları üzerinde konuşacağız. Birçoğumuzun günlük, saatlik yada ihtiyaçlarına göre aldığı backuplar bulunmaktadır. Bu backupları ne zaman ve hangisi olacağı konusunda karar verirken veri tabanının Recovery Mode’u ile ilişkilidir. Yazıda bahsi geçen veri tabanımızın recovery modeli Full Mode ve Always On mimarisinde kullanılmaktadır. Bu problem SQL Server 2017 – CU 27 – Enterprise Edition ve Windows Server 2019 üzerinde yaşanmıştır. Aşağıdaki sunmuş olduğumuz çözüm adımları kritik adımlar olduğundan işlemleri başlatmadan önce bir profesyonelden teknik destek alınız ve danışınız. Sisteminizde PB (Petabayt) boyutlarına yakın büyük veri tabanına sahip olduğunuzda ve bu verinin büyük kısmı imaj verisi olduğunda backup süreniz günler sürebilmektedir. Ek olarak sisteminizde gün içerisinde yoğun transaction işlemleri gerçekleşiyorsa backup süreniz daha da uzayacaktır. Sistemimizde Backup başladıktan sonra VERIFY süresi ile birlikte […]

BACKUP THREAD, LATCH_EX ve PREEMPTIVE_OS_WRITEFILEGATHER Bekleme Tipleri

SQL Server’ın en kritik yapılarından biri olan Lock Mekanizması, ACID yapısını korumak için kritik önem taşımaktadır. Bu yazımızda günlük rutin işlerimizden birini yaparken bu mekanizmanın devreye girmesinin sebep ve sonuçları üzerinde konuşacağız.

Birçoğumuzun günlük, saatlik yada ihtiyaçlarına göre aldığı backuplar bulunmaktadır. Bu backupları ne zaman ve hangisi olacağı konusunda karar verirken veri tabanının Recovery Mode’u ile ilişkilidir. Yazıda bahsi geçen veri tabanımızın recovery modeli Full Mode ve Always On mimarisinde kullanılmaktadır. Bu problem SQL Server 2017 – CU 27 – Enterprise Edition ve Windows Server 2019 üzerinde yaşanmıştır. Aşağıdaki sunmuş olduğumuz çözüm adımları kritik adımlar olduğundan işlemleri başlatmadan önce bir profesyonelden teknik destek alınız ve danışınız.

Sisteminizde PB (Petabayt) boyutlarına yakın büyük veri tabanına sahip olduğunuzda ve bu verinin büyük kısmı imaj verisi olduğunda backup süreniz günler sürebilmektedir. Ek olarak sisteminizde gün içerisinde yoğun transaction işlemleri gerçekleşiyorsa backup süreniz daha da uzayacaktır.

Sistemimizde Backup başladıktan sonra VERIFY süresi ile birlikte aşağıdaki görselde de gördüğünüz gibi günler sürmekte ve wait type BACKUPTHREAD olarak görülmektedir. Bu bekleme tipinin sebebi ise 5 gün önce başlatmış olduğumuz backup’ın thread açarak 1’den fazla CPU’yu işgal etmesidir.

Başlatmış olduğumuz backup sistemimizde 8 adet CPU kullanmaktadır. Bu değer bizim sistemimizi configure ederken belirlemiş olduğumuz MAXDOP ayarımız ile ilişkili olmasından kaynaklıdır. Sistem hesaplamış olduğu Cost Threshold of Paralelism değerinin üzerinde ise thread değerimiz 8 olarak setlenecektir. Bu bilgiler şuanda konumuzun dışında konu hakkında detaylı bilgi öğrenmek isterseniz SQL SERVER NUMA AYARLARI adlı makaleyi inceleyebilirsiniz.

 

 

Backup işlemleri normalde sistemlerimizde kolay kolay sorun çıkarmamaktadır. Fakat bu durum diskleriniz size beklenilen I/O değerlerini karşıladığı durumda geçerlidir. Disklerinizde Yaşanılan Response Time’in çok yüksek olduğu zaman, mdf ve ldf blokları içerisinden okunan bilgiler bak dosyası içine yazılırken yavaşlık meydana gelecektir. Bu durumda hem okumada hem yazmada problem yaşamanıza sebep olacaktır.

Yazımızda bahsi geçen veri tabanının diskleri ve backupını aldığımız diskler farklı lokasyonlarda tutulmaktadır. Yaşamız olduğumuz sıkıntıda backup aldığımız diskler üzerinde response sürelerinin veri tabanının bulunduğu disklere oranla çok yüksek olduğunu gördük. Özellikle veri tabanının bulunduğu diskler üzerinde ldf disklerinin I/O yaptığını gözlemledik. Buda bize Full Backup alınırken ldf file içindeki bilgilerin yoğun bir şekilde okunduğunu göstermektedir.

Disklerin bu kadar yüksek I/O yapmasının sebebi olarak SQL Server ldf file’larını autogrowth ederken (bizde bu değer 1024MB) uzun süre beklediğini ve bunun sistemi dar boğaza soktuğunu Error Log’larından görüntüledik.

Dar boğaz anında Disk ve Error Log bilgilerine ait 3 görseli aşağıda görebilirsiniz.

I – Backup Diskleri Response Time

II – Veri tabanı Diskleri Response Time

III – SQL Server Error Log

 

Disklerde yaşan bu yüksek response süreleri beraberinde sistemde başka problemleri meydana getirdi. Yaşadığımız en büyük problemlerden biride LATCH_EX [LOG_MANAGER]. Bu bekleme türü Insert transaction anında ldf üzerinde işlem yapıldığından SQL Server Insert işlemlerini sıraya koyarak lock mekanizmasını devreye almasından kaynaklanmaktadır. Dar Boğaz anındaki bekleme türlerine baktığımızda LATCH_EX ve PARALEL_REDO_WORKER_WAIT_WORK bekleme türlerinin sistemi en çok dar boğaza soktuğunu görmekteyiz. Yaşanılan bu sıkıntı sürekli olarak artan bir şekilde değil, 1’er dakika aralıklarla ve kesikli olarak meydana gelmekte ve sistem belirli aralıkla dar boğaza girmektedir. Biz yaşanılan bu problemi backup esnasına gördük aynı sorun restore esnasında da yaşanılabilir.

 

Bu problemin çözümü için yaptığımız adımlardan;

1.Çözüm,

ldf file’ının autogrowth değerini SQL Engine tarafından 1024 MB değerinin doldurduktan sonra büyütmesi yerine 8gb, 8gb aralıklı olarak büyütüp boş page’leri hazır hale getirdik. Buradaki amacımız SQL Server’ın büyütme esnasında beklemesinin önüne geçmeye çalıştık. Bu süreç zarfında sa (SessionId = 41) kullanıcısı background işlemi yaptığını ve preemptive_os_writefilegather bekleme türü ile karşılaştığımızı gördük. Yapmış olduğumuz manuel ldf büyütme operasyonunda backup işleminden dolayı çok beklemeler olduğu ve sistemde herhangi bir düzelme olmadığını gördük.

 

2.Çözüm,

Run =>  Local Security Policy => Local Policies => User Rights Assignment => Perform volume maintenance tasks

Ekranı çift tıkla açtıktan sonra Local Security Setting içine SQL Service Hesabını eklemeniz gerekmektedir.

Servis kullanıcısını ekledikten sonra SQL Server Engine Restart gerekmektedir. Bizim sistemimiz yoğun transaction kullanıldığı için ekledikten sonra Restart etmedik. Restart ettikten sonra manuel olarak ldf file büyütme operasyonu sırasında preemptive_os_writefilegather bekleme türü ile karşılaşmayacaksınızdır. Bu operasyonları lütfen dikkatli ve uzmandan yardım alarak yapınız.

3.Çözüm,

Disk ünitesi üzerine giden port sayımız 2 adetti ve bunu 2 katına yani 4’e çıkardık. Bu operasyon sonrası diskler üzerindeki Response Time’lar 3 ms seviyelerine kadar düştü ve backup hızlı bir şekilde alınmaya başladı. Bekleme türlerinde gördüğümüz BACKUPTHREAD yerine ASYNC_IO_COMPLETION bekleme türünü yani CPU da bekleme olmadığını sadece başka bir sunucu üzerine backup almamızdan kaynaklı olarak bu bekleme türü vardı buda bizim beklediğimiz bir durum. Sistem normale döndüğü andaki bekleme tiplerine baktığımızda LATCH_EX bekleme türünün kalmadığını PARALEL_REDO_AT_WORK değerinin de makul seviyelere geldiğini gördük.

Aşağıdaki görsellerde sistemin normale dönmesi sonrası göstermiş olduğu reaksiyonları görebilirsiniz.

IV – Normal Durumda Backup Disk Response Süreleri

V – Normal Durumda Backup Bekleme Türü

 VI – Normal Durumda Bekleme Türleri

Benzer Yazılar

SQL SERVER SERViS RESTART HATASI

SQL Server 2 hafta önce

Bu haftaki yazımızda karşılan bir hata üzerindeki; logları ve çözümünü anlatacağım. Aşağıdaki GÖRSEL-1’de görüldüğü üzere SQL servisini restart ettiğimiz sırada bir hata ile karşılaşıyoruz. Servis running state’e geçemiyor. “The request failed or the service did not respond in a timely fashion. Consult the event log or other applicable error logs for details” şeklinde bir uyarı veriyor. Hatanın çözümüne doğru ilerlerken farklı servis hesaplarıyla veya “Local System” hesabı ile restart etmeye çalıştığınızda servis ilginç bir şekilde ayağa kalkıyor. Ancak Always on sistem çalışıyorsanız farklı servis hesaplarını kullandığınızda always on size haberleşme izni vermiyor. Aynı hesabın şifresi ile ilgili sorunlar olduğu düşünüp hesabın şifresini de değiştirdiğiniz de yine sonuç alamıyorsunuz. Burdan yola çıkıldığında sıkıntı servis hesabında gibi görünüyor olabilir ancak çözüme geçildiğinde regedit üzerinde yapacağımız bir işlem ile sorunu çözüyoruz. Servis hesabının kaydının olduğu regedit kaydını siliyoruz. Regedit üzerindeki servis hesap bilgisi güncellendiğinde sorun çözülmüş olmakta. GÖRSEL-1  Servis restart edildiğinde SQL’in verdiği Error […]

SQL’DE İKİ NODE’UN RESOLVING DURUMA DÜŞMESİ VE ÇÖZÜMÜ

SQL Server 1 ay önce

Bu yazımızda failover olma işlemi esnasında karşılaşılan bir durumdan kısaca bahsedeceğim. Kısa bir yazı olacak ama önemli olduğunu düşünüyorum. Bazen failover olmak istediğinizde cluster secondary’e node’a failover olamaz, hem secondary hem de primary node’unuz resolving durumuna geçer. Bu durumla daha çok otomatik failover olma durumlarında karşılaşılır çünkü sistem failover’a aslında hazır değildir ancak cluster bunu bir şekilde bilemez. Failover olma gerçekleşemez bir anlamda sql cluster askıda kalır ve hiçbir sunucu da sql engine çalışmaya devam edemez. (GÖRSEL-1) GÖRSEL-1 GÖRSEL-1 üzerinde gördüğünüz üzere availability group resolving duruma düşer. Availability replica’lar üzerinde de gördüğünüz üzere primary ve secondary tüm node’lar resolving state’e düşer. Böyle bir durumunda iki farklı çözüm yolumuz var;   Çözüm: ikinci node’a sunucu restart’ı atmak. Bu noktada secondary sql node’a servis restart atmak işe yaramıyor. Zaten db’ler iki taraflı resolving modda. O sebeple ancak sunucu restart atıldığında cluster ayakta olan sunucuyu görüyor ve askıda kalma durumundan ilk başta primary […]

Query Store Nedir?

SQL Server 1 ay önce

Query Store ile birlikte execution planın seçimi ve bu sürecin performansa etkisini anlayabiliriz. SQL Server içerisinde bulunan Query Store özelliği, çalıştırılan sorguların execution planını ve bu sırada oluşan istatistiklerini otomatik olarak yakalar. Böylece query plan değişikliği ile oluşan problemleri de hızlı ve kolay şekilde fark edebiliriz. Elinizde bulunan bir sorguya ait query plan zamanla değişebilir. Bunun birçok sebebi vardır. Tablo yapısına yeni bir column eklenmesi Veri tipinin değiştirilmesi Sorgularda yeni parametrelerin eklenip çıkarılması Verilerde, schemalarda veya sorgu parametrelerindeki değişiklik Burada önemli olan ise bazen bu değişimler sorgunun yavaş çalışmasına neden olur. Query Store ile beraber bu yavaşlığın kök nedenine inmek daha kolay oldu. Ayrıca query store sayesinde ilgili sorguya ait read-write bilgileri ve cpu tüketimi bilgilerine de erişebilirsiniz. Query Store’u veritabanı seviyesinde aktif edebiliyoruz. Veritabanı üzerine sağ tıklayarak properties diyoruz ve Query Store sekmesine geliyoruz. Operation Mode alanından Read Write’ı seçiyoruz. Böylelikle Query Store gerekli bilgiyi toplayabilir ve size ilgili sonuçları […]

2 Yorum

  • Duran BÜYÜKÖZTÜRK 21 Haziran 2023

    İzine çıktığım için bu tecrübeden mahrum kalmıştım ancak buraya yazarak bu açığımı kapatmışsınız hocam teşekkür ederim 🙂 Ayrıca problemi dedektif gibi ele alarak sorunun kaynağına kadar inmeniz takdiri hak ediyor.

  • Serdar BAYRAK 27 Haziran 2023

    Teşekkür ederim Duran Hocam. Güzel bir case’di:)

Yorum Yaz

Rastgele