Bir saniyeden daha kısa bir sürede gerçekleşen engelleme nasıl izlenir - SQL Server


14

Bir saniyeden daha kısa bir süre içinde gerçekleşen engelleme sorununu gidermeye çalışıyorum. OLTP uygulaması çok hassastır ve üzerinde anlaşılan SLA'ya göre bazı işlemler için 200 ms'den daha kısa bir tepki süresine sahip olmalıdır. Güncellemelerde toplu iş boyutunu küçülterek çözebildiğimiz yeni kod sürümünde bazı kilit yükseltme sorunları yaşadık. Küçük parti boyutunda bile, yeni sp'nin OLTP işlemlerinin güncellediği satırları engellediğinden şüpheleniyoruz.

Engellenen oturumu ve bekleyen kaynak bulmak gerekir. Anladığım kadarıyla "engellenen işlem eşiği" en az 1 saniye için ayarlanabilir ve bu nedenle engellemeyi yakalamaz.

Wait_info ve wait_completed x olaylarını deniyorum.

Bunu izlememizin baţka bir yolu var mý. Teşekkürler


: böylece aynı kullanıcı tarafından aynı soru stackoverflow.com/questions/38407021/...
TheGameiswar

Yanıtlar:


10

Genelden ziyade kilitleme ile özellikle ilgileniyorsanız, locks_lock_waitsgenişletilmiş olay sesleri daha uygundur.

Üzerinde filtre bulunan increment >= 200

CREATE EVENT SESSION [locks_lock_waits] ON SERVER 
ADD EVENT sqlserver.locks_lock_waits(
        ACTION(sqlserver.sql_text)
            WHERE  ( [sqlserver].[is_system] = 0
                     AND [increment] >= 200
                     AND [counter] <= 1000 ) 
    )
ADD TARGET package0.ring_buffer;

GO

ALTER EVENT SESSION [locks_lock_waits]  
ON SERVER  STATE = start;  

Yukarıda, eşik süre boyunca kilitlerde bekleyen ifadeler toplanır, ancak belirli kilit kaynağı verilmez.

Bu olayı hiç kullanmadım ve bu oturumun üretim sunucunuzda ne kadar ek yüke neden olacağına dair hiçbir fikrim yok.

Bu videoyu konuyla ilgili buldum . Bu, countertoplanan olay sayısını azaltmak için filtrelemeyi şiddetle tavsiye eder ve yukarıda yaptım.

Ayrıca eski bir eski belgelenmemiş komuttan da bahsediyor

dbcc lock(StallReportThreshold, 200) -- 200 is threshold in ms

Hangi (izleme bayrağı 3605 etkinse) aşağıdaki gibi sınırlı bilgileri SQL Server hata günlüğüne gönderir.

Proses 53 RID'de S kilidi için 6844 ms bekledi: 2: 1: 120: 2 sonuç: OKWAIT

Ben sadece bunu geçen ve belgelenmiş ve çok daha güçlü olduğu gibi zaten genişletilmiş etkinlikler açıkça tercih gibi geçerken söz.


Locks_lock_waits'i test ettim ve dediğin gibi kaynak bilgisine sahip değil. Ama artışın zaman olduğunu bilmiyordum. İyi bilgi dbcc kilit, harika görünüyor. Bilginin hata günlüğüne atılmadan önce ne kadar süre kullanılabilir olduğunu biliyor musunuz?
jesijesi

Üzgünüm, kendimi netleştirmedim. Ben dbcc lock komutunu çalışana kadar ne kadar zamanımız olduğunu soruyordum. Örneğin kilitleme olur ve bir saat sonra dbcc kilidi çalıştırırsam, yine de bilgi alıyor musunuz?
jesijesi

@jesijesi - Bugünden daha önce hiç duymamıştım. Bununla ilgili daha fazla bilgim yok. Devre dışı bırakmak için geçilecek parametreleri bile bilmiyorum. Ancak önce koşarsınız dbcc lock(StallReportThreshold, 200) ve izleme bayrağı 3605 etkinleştirildiği sürece eşik aşıldığında bilgi verir. SQL Server, daha sonra çalıştırmanız ihtimaline karşı bu bilgileri toplamaz.
Martin Smith

2
Teşekkürler. kaynak_0,1,2 değerlerini xevents cinsinden dönüştürmek için kullanışlı bir işlevi olan bir bağlantı eklemek. sqlnotes.info/2011/10/24/…
jesijesi

5

Kilitleme ile ilgileniyorsanız, birkaç genişletilmiş etkinlik vardır:

lock_acquired
lock_released
lock_escalation

İlk iki olayın durationeşikleriniz için filtreleyebileceğiniz bir sütun (mikrosaniye) vardır. Ayrıca resource_description, ilgili kaynaklar hakkında size bazı ayrıntılar verecek bir eylemleri var .

lock_escalationEtkinlikte bir sahiptir statementkilit tırmanmasını tetikleyen T-SQL deyimi toplamak için ekleyebilir eylemi. Ayrıca vardır escalation_cause. İşte örnek bir oturum:

CREATE EVENT SESSION [locking] ON SERVER 
ADD EVENT sqlserver.lock_acquired( SET collect_resource_description = (1) ),
ADD EVENT sqlserver.lock_escalation( SET collect_statement = (1) ),
ADD EVENT sqlserver.lock_released( SET collect_resource_description = (1) )
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO

Engellenen işlem raporu eşiğini bir saniyeden daha azına ayarlayamamanızın bir nedeni olduğundan şüpheleniyorum: RDBMS'de kilitleme tamamen normal - veritabanı motoru, kaynakları korumak için kilitlemek zorunda. Kilitlemenin ne zaman bloke olacağına dair resmi bir tanım olmamasına rağmen, saniyeler içinde kilitleme işaretlemesi bana normal geliyor.


1
Başkasının kaynağa erişimi engellendiğinde ve kilit nedeniyle beklemesi gerektiğinde kilitleme engellenir.
Martin Smith

Teşekkür ederim, süre alanı ile lock_acquired kullanmayı planlıyorum.
jesijesi

İyi şanslar. SQL Server 2014'te olduğu gibi, yerel olarak derlenmiş saklı procs'larla bellek içi OLTP tablolarını kullanabilirsiniz, yüksek performanslı mandalsız bir seçenek sunar. Anlık görüntü izolasyonuna da bakabilirsiniz.
wBob
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.