問題描述
云數據庫RDS SQL Server版出現阻塞問題。
問題原因
當應用程序頻繁讀寫某個表或者資源時,很容易出現阻塞情況。當阻塞問題嚴重時,應用程序端的語句執行會變得緩慢。
排查方法
針對云數據庫RDS SQL Server版阻塞問題,排查建議如下。
循環監控
SYS.SYSPROCESSES
,獲取阻塞信息。命令如下:WHILE 1 = 1 BEGIN SELECT * FROM SYS.SYSPROCESSES WHERE BLOCKED <> 0; WAITFOR DELAY '00:00:01'; END;
說明您可以自定義循環間隔時間,此處以
00:00:01
為例。系統顯示類似如下:
說明blocked
列表示阻塞頭session_id
,waitresource
表示被阻塞的session等待的資源。更多返回值字段的說明,請參見sys.sysprocesses官方文檔。循環監控
sys.dm_tran_locks
、sys.dm_os_waiting_tasks
等視圖,可以得到阻塞圖譜。命令如下:WHILE 1 = 1 Begin SELECT db.name DBName, tl.request_session_id, wt.blocking_session_id, OBJECT_NAME(p.OBJECT_ID) BlockedObjectName, tl.resource_type, h1.TEXT AS RequestingText, h2.TEXT AS BlockingText, tl.request_mode FROM sys.dm_tran_locks AS tl INNER JOIN sys.databases db ON db.database_id = tl.resource_database_id INNER JOIN sys.dm_os_waiting_tasks AS wt ON tl.lock_owner_address = wt.resource_address INNER JOIN sys.partitions AS p ON p.hobt_id = tl.resource_associated_entity_id INNER JOIN sys.dm_exec_connections ec1 ON ec1.session_id = tl.request_session_id INNER JOIN sys.dm_exec_connections ec2 ON ec2.session_id = wt.blocking_session_id CROSS APPLY sys.dm_exec_sql_text(ec1.most_recent_sql_handle) AS h1 CROSS APPLY sys.dm_exec_sql_text(ec2.most_recent_sql_handle) AS h2 WAITFOR DELAY '00:00:01'; END;
系統顯示類似如下:
返回參數說明如下:
參數
說明
DBName
數據庫名稱。
request_session_id
當前請求的session ID,即被阻塞的session。
blocking_session_id
阻塞頭session ID。
BlockedObjectName
被阻塞的session操作的對象。
resource_type
等待的資源類型。
RequestingText
當前session執行的語句,即被阻塞的語句。
BlockingText
阻塞頭session執行的語句。
request_mode
當前session請求的鎖模式。
調優建議
可以參考以下步驟,進行調優。
關閉阻塞頭連接,可以幫助快速解除阻塞。
查看是否有長時間未提交的事務,及時提交事務。
如果有S鎖導致的查詢阻塞,并且您的應用允許臟讀,可以使用
WITH (NOLOCK)
查詢提示。例如在查詢中寫入SELECT * FROM table WITH (NOLOCK);
使查詢在執行時不申請鎖,從而繞過阻塞狀況。檢查應用程序邏輯,按順序訪問某個資源。
相關操作
如需應對緊急情況下的阻塞問題,請參見如何快速解決RDS SQL Server的阻塞問題。
您可以在RDS控制臺通過設置性能監控指標、創建報警規則等方式,以便及時發現和響應數據庫性能問題。具體詳情,請參見監控與報警。
如需了解更多數據庫性能調優策略,例如索引優化、查詢優化、存儲優化。具體詳情,請參見性能優化與診斷。