SQL Server’da Latch Nedir?
SQL Server’ın memory’de tuttuğu index, page, b-tree’nin nonleaf nodeları gibi yapılarının tutarlılığını sağlamak için kullandığı lock benzeri basit yapılardır.Kullanıcı etkinliğini ve kaynak kullanımını belirlemek için latchleri izlemek, performans darboğazlarını belirlemenize yardımcı olabilir.
Aşağıdaki tablo , SQL Server Latches değerlerini açıklar.
SQL Server Latches değerler | Açıklama |
Average Latch Wait Time (ms) | Beklemek zorunda kalan latch istekleri için ortalama latch bekleme süresi (milisaniye cinsinden). |
Average Latch Wait Time Base | Sadece dahili kullanım içindir. |
Latch Waits/sec | Hemen verilemeyen latch isteklerinin sayısı. |
Number of SuperLatches | SuperLatches anlık sayısı |
SuperLatch Demotions/sec | Son saniyede normal latche indirgenen SuperLatches sayısı. |
SuperLatch Promotions/sec | Son saniyede SuperLatches’e atanan latch sayısı. |
Total Latch Wait Time (ms) | Son saniyedeki latch istekleri için toplam latch bekleme süresi (milisaniye cinsinden). |
Bu nesnedeki sorgu performans değerlerini aşağıdaki T-SQL sorgusunu kullanarak öğrenebilirsiniz.
SELECT * FROM sys.dm_os_performance_counters
WHERE object_name LIKE '%Latches%';
SQL Server İşletim Sistemi (SQLOS) dışında gösterilmeyen dahili bir SQL Server mekanizması olarak tasarlanan latch, kullanıcılar tarafından değil (NO LOCK ipuçlarıyla yönetilebilen lockların aksine) yalnızca SQL Server tarafından yönetilebilir. SQL Server’ın belleği her okuması gerektiğinde, sayfaya veya uygun çok iş parçacıklı bir şekilde erişilemeyen dahili bellek yapısına latch uygular. Bu şekilde, SQL Server, bir SQL Server veritabanında birden çok fiziksel iş parçacığı yürütmesinin koordinasyonu için bir kaynak olarak latches kurar.
LATCH TÜRLERİ NELERDİR?
3 Tip Latch türü vardır. IO Latches, buffer latches and non-buffer latches. Hadi biraz detaya inelim.
I/O Latches, buffer pool sayfalara karşı I/O işlemleri gerçekleştirildiğinde, depolama altsisteminden veri okunduğunda veya bu sisteme veri yazıldığında meydana gelir. Bu latch, PAGEIOLATCH_* ile başlayan bekleme türleri oluşturur. Sayfaların buffer pool aynı anda birden çok kez okunmamasını ve etkin bir işlem olarak kullanmaya devam ederken sayfaların buffer pooldan atılmamasını sağlarlar.
Buffer Latches, arabellekteki sayfaları aynı anda çalışan iş parçacıklarından korumak için kullanılır. Yalnızca en son işlem korunacağından, iki iş parçacığı aynı anda bir sayfadaki aynı boş alana yazmaya çalışırsa oluşabilecek kayıp güncellemelere karşı koruma sağlamak için kullanılırlar. Bu latch olmadan, arabellekte aynı anda bir sayfayı okumak ve yazmak mümkün olacaktır. Bu latch, PAGELATCH_* ile başlayan bekleme süreleri oluşturur (aradaki farka dikkat edin, ortada IO yok).
Buffer pooldaki bir sayfa değiştirilirse, sabit depolamadaki sayfanın sürümünden farklı olduğu için “dirty” sayfa, değiştirilmemiş sayfalara ise “clean” sayfalar denir.Buffer pooldaki sayfaya erişildiğinde, SQLOS o sayfada bir arabellek latchı alacaktır. Lockların aksine, SQL Server latch işlem süresi boyunca tutulmaz; iş parçacığı o kaynak üzerindeki işini bitirir bitirmez yayımlanacaktır.
Non-Buffer Latches, buffer pooldan yanı sıra paylaşılan veri yapılarını korumak için SQL Server tarafından dahili olarak kullanılır. Bu latch, LATCH_* ile başlayan bekleme süreleri oluşturur; ancak bu bekleme türü, SQL Server’ın dahili olarak kullandığı tüm bireysel latchların yalnızca bir özet görünümüdür. sys.dm_os_latch_stats DMV’de başka bir dökümü bulunabilir. Böyle durumlarda arabellek olmayan latchların kullanıldığını görebilirsiniz: aşırı paralellik veya çok fazla otomatik büyüme/küçülme olayı.
Özellikle bir performans sorununu gidermek için bekleme istatistiklerini kullanıyorsanız, bu latch türlerinin her biri hakkında biraz bilgi sahibi olmak son derece yararlıdır. Sürecin hangi bölümünün sorunlu olduğu ve latch problemi olup olmayacağı konusunda bir anlayışa sahip olmanızı sağlayacaktır.
Locklarla aynı şekilde, SQL Server latches çeşitli modlarda gelebilir:
- Destroy Latch (DT): Bir latch yok edildiğinde ve önbellekten bir arabellek çıkarıldığında elde edilen en kısıtlayıcı latch modu. DT latch KP latchını bile bloke eder.
- Exclusive Latch (EX): Yazılmakta olan bir sayfanın özel kontrolünü ele geçirir. EX mandalının bulunduğu sayfada diğer tüm mandalların alınmasını önler.
- Update Latch (UP): Özel bir latch benzer kısıtlayıcıdır, ancak okuma işleminin sayfaya erişmesine izin vermesi dışında, herhangi bir yazma işlemini açıkça kısıtlar.
- Keep Latch (KP): İki amacınız vardır: üzerine başka bir latch yerleştirilirken bir sayfayı arabellek önbelleğinde tutmak ve ikincisi referans sayılarını korumaktır.
- SHARED latch (SH): Veri sayfasını okuma isteği alındığında çıkarılır.
Latches ayrıca birbirleri üzerinde bir öncelik sırasına uymazlar – genel olarak, ilk giren ilk çıkar bir sistemdir, burada bir latch belirli bir sayfaya izin verilmeden önce başka bir latch’ın serbest bırakılmasını beklemesi gerekir .
Keep latch , destrory latch dışında diğer tüm latchlere göre öncelikli olacaktır. Ayrıca bir latch serbest bırakıldığında, bazen diğer uyumlu latchlar, (yani birden çok paylaşılan latch) latch kuyruğundaki herhangi bir yerden çıkarılır.
Locklara benzer şekilde, çeşitli latch modları arasında bir uyumluluk veya uyumsuzluk bileşeni vardır. Aşağıdaki tablo, çeşitli SQL Server latchları arasındaki uyumluluk hakkında bilgi vermektedir ,
NEDEN GEREKLİDİR?
Yukarıda tanımını yapmıştık ama tekrardan bir hatırlayalım. ‘Latch’, SQL Server’ın depolama motoru tarafından dahili bellek yapılarını korumak için kullanılan hafif eşitleme nesneleridir’. Bunu, eşzamanlılığı yönetmek için işlem düzeyinde bir yapı olan SQL sunucusundaki lockları karşılaştırın, latchlar , dahili bellek yapıları içinde veri bütünlüğünü korumak için iş parçacığı düzeyinde çalışır. SQL Server İşletim Sisteminin (SQLOS) dışında gösterilmezler. Kullanıcılar tarafından değil, yalnızca SQL Server tarafından yönetilirler (lock ipuçları veya değişen yalıtım düzeyi aracılığıyla geçersiz kılınabilen kilitlerin aksine). Tek bir işlemin aynı anda birden fazla iş parçacığı kullanabileceğini akılda tutmakta fayda var.
Bu noktaya tekrar değinmek gerekirse, SQL Server’da tek başına lock ile tutarlılık sağlanamaz. SQL Server, lock yöneticisi tarafından korunmayan paylaşılan veri yapılarına erişmelidir. Latch, bu iş parçacıklarının veri yapılarına nasıl eriştiğini yönetme araçlarıdır. Bunlar, kullanıcının doğrudan değiştiremeyeceği dahili bir SQL Server mekanizmasıdır. Aşağıdaki örnek, latch mevcut değilse nelerin yanlış gidebileceğini sağlamlaştırmaya yardımcı olacaktır:
İki ileti dizisinin aynı sayfayı güncellemek istediği durumu ele alalım.
Konu 1, sayfa başlığını okuyacak ve sayfada bir sonraki boş alanı bulacaktır. Bu sırada iş parçacığı 2 gelir ve başlığı okur ve aynı boş alana işaret edilir. Konu 1 boşluğa yazar ve başlığı günceller. Ne yazık ki, iş parçacığı 2 zaten aynı alanı hedeflediği ve iş parçacığı 1’in az önce yazdığı verilerin üzerine yazdığı için bu çok geç. Bu, iş parçacığı 1’deki verilerin kaybolmasına neden olur. Latch kullanmak, bu ve diğer sorunların oluşmasını engeller.
Latch Nerelerde Görülür?
Sys.dm_os_wait_stats , Sunucunun en son yeniden başlatılmasından veya önbelleğin temizlenmesinden bu yana, beklemelerin miktarı ve bu beklemenin gerçekleşmesi için maksimum süre hakkında size geçmiş bilgiler verir
Sys.dm_exec_requests dmv, sunucuda şu anda nelerin yürütüldüğüne dair canlı bilgiler içerir, paralellik bilgilerinin yanı sıra işlemlerin o anda ne beklediği hakkında bilgi sağlar.
sys.dm_os_waiting_tasks dmv, şu anda bekleyen görevler hakkında canlı bilgiler içerir.
Latch ile ilgili bilgileri yakalamak için kullanılabilecek bir dizi genişletilmiş olay da vardır:
Performans izleyicisinde ayrıca, latch hakkında bilgi veren bir dizi alan sağlayan bir SQLServer:Latches counter(Sayfanın başındaki tabloda açıklaması bulunmaktadır.)vardır.
SQL Error Log ayrıca latch ile ilgili bazı hata mesajlarını da yakalar.
Özet olarak Latch SQL sunucusunun bir parçasıdır. Aynı bellek yapısını aynı anda değiştiren birden çok iş parçacığını önlemek için eşzamanlılık koruma yöntemi olarak kullanılırlar. Latch konusuna kısaca değinmiş olduk 😊
Referanslar
https://blog.coeo.com/a-basic-introduction-to-latches-in-sql-server
https://sqlperformance.com/2021/05/sql-performance/introduction-to-latches