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 RIGHT-LEFT PARTITION

SQL Server 5 gün önce

SQL Server’da partitioning, büyük veritabanı tablolarını daha yönetilebilir ve performanslı hale getirmek amacıyla kullanılan bir tekniktir. Bu teknik, tablonun verilerini fiziksel olarak değil, mantıksal olarak parçalara ayırır. Veriler, belirli bir partition function ve partition scheme kullanılarak farklı bölümlere yönlendirilir. Partitioning, özellikle büyük veri kümeleriyle çalışan veri tabanlarında sorgu performansını artırır ve veri yönetimini kolaylaştırır. Partition Function ve Partition Scheme nedir? Partition Function: Verilerin hangi kriterlere göre bölüneceğini belirler. Örneğin, bir tarih aralığına göre verileri ayırmak. Partition Scheme: Verilerin hangi filegroup’larda depolanacağını belirler.   Örnek olarak Range LEFT ve Range RIGHT olmak üzere iki ayrı tabloda partition nasıl yapılır sizlere göstereceğim. İlk olarak Range LEFT olan partition yapısından başlayacağım. Öncelikle Veri tabanıma yeni filegroup ve file ekliyorum Şimdi sıra FUNCTION ve SCHEME oluşturmakta ben tablomu yıllık olarak partition yaptım sizler ihtiyaçlarınız doğrultusunda aylık,günlük vs yapabilirsiniz. LEFT partition dediğimiz olay vermiş olduğunuz tarih aralığına eşit bir veri geldiğinde bu veriyi solundaki partition […]

Veritabanı Recovery Pending Durumu ve Düzeltme Seçenekleri

SQL Server 2 hafta önce

İçindekilerVeritabanı Recovery Pending Durumu Nedir?Veritabanı Neden Recover Pending Duruma Düşer?Recovery Pending Durumu Nasıl Çözülür?SonuçKaynaklarVeritabanı Recovery Pending Durumu Nedir? SQL Server’da veritabanları bazı nedenlere bağlı olarak “Recovery Pending” (Kurtarma Bekleme)  moduna geçebilir. Veritabanın düzgün bir şekilde kapatılmaması, eksik veya bozuk log dosyaları, disk depolama sorunları, sistemde yaşanan anormal şekilde çökmeler veya MS SQL Server’daki hatalar bu duruma sebep olabilir. Recovery durumu, aslında veritabanını tekrar kullanılabilir hale getirmek için bir kurtarma işlemi yürüttüğünü ifade eder ve üç aşamadan oluşur; Analysis (Analiz): Transaction log incelemesi yapılması ve işlemlerin tamamlanma (Commit) durumunun kontrol edilmesi, Redo (Yeniden İşleme): Tamamlanmış (Commit) ancak henüz diske yazılamamış olan işlemlerin yeniden işlenmesi, Undo (Geri Alma): Başlamış (Begin) ancak tamamlanmamış (Commit) işlemlerin  geri alınmasıdır.   Veritabanı Neden Recover Pending Duruma Düşer? SQL Server Restart Süreci SQL Server servisi restart edildiğinde üzerinde bulunan tüm veritabanları tutarlılığın sağlanması için otomatik olarak recovery moduna girer ve redo/undo işlemleri sürecince devam eder. Ani Sistem […]

SQL Server DMV ve DMF – 6

SQL Server 2 hafta önce

Bu yazımızda DMV ve DMF Serimizin 6.sına devam edeceğiz. Bir önceki seride Memory’ye ilişkin DMV ve DMF’leri ele almıştık. Bu yazıda Memory konusunda devam edeceğiz. SQL server’da Memory kavramı en önemli kavramlardan biridir. Özellikle tüm transaction işlemlerinin önce Buffer sonra disk üzerinden devam ettiğini düşünürsek buffer’ın oynadığı kritik rolü daha iyi anlayabiliriz. Bu yazıda Memory’nin durumunu ve monitör edilmesine bakacağız. Özellikle Performans sorunlarında memory konusunda sorun yaşandığı durumda nasıl okumak gerektiği önemli rol oynamaktadır. Hangi database’de, hangi tablo’da sorun yaşandığına ilişkin bilgilere bu paylaşım sonrasında görebileceğiz. SQL Server’ın Memory kullanım durumunu incelediğimde; select physical_memory_in_use_kb/1048576.0 AS ‘physical_memory_in_use (GB)’, locked_page_allocations_kb/1048576.0 AS ‘locked_page_allocations (GB)’, virtual_address_space_committed_kb/1048576.0 AS ‘virtual_address_space_committed (GB)’, available_commit_limit_kb/1048576.0 AS ‘available_commit_limit (GB)’, page_fault_count as ‘page_fault_count’ from  sys.dm_os_process_memory; Görsel – 1   Physical_memory_in_use: Kullanımda olan Fiziksel Memory miktarını gösterir. locked_page_allocations: Memory’de lock’lanmış olan Page’lerin miktarını belirtir. virtual_address_space_contained: SQL Server VAS(Virtual Adress Space) için ayrılan miktarı belirtir. available_commit_limit: SQL Server tarafından kullanılabilecek Memory Miktarını gösterir. […]

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