Sql-Server

如何在不到一秒的時間內跟踪發生的阻塞 - SQL Server

  • July 16, 2016

我正在嘗試解決發生時間不到一秒鐘的阻塞問題。OLTP 應用程序非常敏感,根據商定的 SLA,某些事務的響應時間必須小於 200 毫秒。我們在新程式碼版本中遇到了一些鎖升級問題,我們能夠通過減少更新中的批量大小來解決這些問題。即使是小批量,我們也懷疑新的 sp 阻塞了 OLTP 事務正在更新的相同行。

我需要找到被阻塞的會話及其等待的資源。根據我的理解,“阻塞程序門檻值”可以設置為至少 1 秒,因此這不會擷取阻塞。

我正在試驗 wait_info 和 wait_completed x 事件。

有沒有其他方法可以跟踪這個。謝謝

由於您對鎖定而不是一般等待特別感興趣,因此locks_lock_waits擴展事件聽起來更合適。

開啟過濾器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;  

上面收集了等待鎖定時間門檻值的語句,但沒有給出特定的鎖定資源。

我從來沒有使用過這個事件,也不知道這個會話會在你的生產伺服器上造成多少成本。

我找到了這個關於這個話題的影片。這確實強烈建議過濾counter以減少收集的事件數量,我在上面已經這樣做了。

它還提到了一個舊的遺留未記錄命令

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

哪個(如果啟用了跟踪標誌 3605)將有限的資訊(例如以下資訊)轉儲到 SQL Server 錯誤日誌中。

程序 53 等待 RID 上的 S 鎖定 6844 毫秒:2:1:120:2 結果:OKWAIT

我只是順便提一下,因為擴展事件顯然更可取,因為它有文件記錄並且功能更強大。

如果您對鎖定感興趣,可以使用幾個擴展事件:

lock_acquired
lock_released
lock_escalation

前兩個事件有一個duration以(微秒)為單位的列,您可以根據門檻值對其進行過濾。他們還有一項resource_description行動,可以為您提供有關所涉及資源的一些詳細資訊。

lock_escalation事件還有一個statement動作,您可以添加它來收集觸發鎖升級的 T-SQL 語句。它也有escalation_cause。這是一個範例會話:

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

我懷疑您可能無法將阻塞程序報告門檻值設置為小於一秒的原因:鎖定在 RDBMS 中是完全正常的——數據庫引擎必須鎖定資源以保護它們。雖然沒有關於鎖定何時變為阻塞的官方定義,但鎖定在亞秒內滴答作響,對我來說似乎很正常。

引用自:https://dba.stackexchange.com/questions/144070