本文介紹如何通過鎖阻塞統計頁面快速定位造成長時間阻塞的會話及其詳細信息。
前提條件
實例的存儲類型為云盤。
實例不能是RDS SQL Server 2008 R2云盤版。
背景信息
在SQL Server中,為了保持數據的一致性,當某個會話對特定資源進行修改時,系統會對該資源加鎖,避免其他并發會話對同個資源進行訪問或修改。正常情況下,該鎖的持續時間較短,修改結束后即會被釋放,以允許下一個會話繼續訪問該資源。但是當存在慢SQL或者其他異常時,可能會導致資源被長時間鎖定,嚴重影響性能。
為解決上述問題,RDS提供了鎖阻塞統計頁面。通過查看該頁面,可快速定位到阻塞源的SPID(會話ID)、阻塞發生的時間、引發阻塞的SQL語句等信息,便于精準定位問題。
采樣原理
通常,單個會話阻塞2秒左右不會有太大問題,但短期內連續出現多個會話阻塞超過2秒的情況就會對整個系統產生顯著影響。
系統每10秒會對鎖阻塞的情況進行一次采樣,在系統進行采樣的時間點,只要當一個會話執行SQL時間超過2秒、并且阻塞了其他會話的執行,就會被捕捉并統計到鎖阻塞統計頁面。
操作步驟
- 訪問RDS實例列表,在上方選擇地域,然后單擊目標實例ID。
在左側導航欄,選擇自治服務 > 鎖優化。
單擊鎖阻塞頁簽,即可查詢實例中的阻塞詳情。
頁面介紹
阻塞數量概覽
可分時段查看到近期產生的阻塞數量。
阻塞時長趨勢圖
以阻塞持續的時長為基準,展示某個時間段內阻塞時長的變化趨勢。
將鼠標移動到特定的時間點,可查詢該時間點阻塞發生的詳情。包含如下內容:
阻塞發生的時間。
Processes_blocked:被阻塞的會話數量。
Uncommited_tran:未被提交的事務數量。
說明鎖不被釋放的原因,即事務未被提交。
QueryHash(特定SQL語句的Hash值)和對應阻塞時間。
阻塞源詳細信息
展示阻塞源的詳細信息,包含如下內容:
Spid:阻塞源的會話ID。
QueryHash:將SQL語句進行Hash之后得出的值,同一種SQL對應同一個QueryHash。
等待類型:展示當前等待中的會話被阻塞的原因。更多等待類型及說明,請參見等待類型。
執行時間(ms):會話持續執行的時長。
SQL:導致阻塞發生的SQL語句。
說明將鼠標移動到SQL語句上,在SQL語句的右邊會出現圖標,單擊該圖標即可復制該SQL語句。
時間:阻塞發生的時間。
數據庫名:發生阻塞的數據庫名稱。
單擊某一行的任意位置,可在頁面下方查看該行對應的阻塞關系圖。
阻塞關系圖
展示阻塞的會話ID(紅色)和被阻塞的會話ID(藍色),以及鎖的類型和阻塞的時長。更多鎖類型及說明,請參見鎖類型。
將鼠標移動到會話ID上可以查看阻塞詳情,包含如下內容:
SPID:會話ID。
BlockedBySpid:阻塞中的會話ID。
WaitType:等待類型。
WaitTimeMs:阻塞時長。單位:ms。
CMD:當前會話的SQL命令類型。
CPU:CPU時間。單位:ms。
DBName:數據庫名稱。
ClientAppName:客戶端名稱。
HostName:客戶端主機名稱。
LoginId:登錄用戶名。
PhysicalIO:當前會話執行SQL消耗的I/O。1個PhysicalIO=8KB。
QueryHash:將SQL語句進行Hash之后得出的值,同一種SQL對應同一個QueryHash。
StartTime:當前Batch開始執行的時間。一個Batch中可以包含多個SQL,共享變量值等資源。
Status:當前實例狀態。
SQL:單擊紅色或藍色的會話ID,會在阻塞關系圖下方顯示SQL的執行詳情。
SQL詳情
在阻塞關系圖中,單擊紅色或藍色的會話ID,便會顯示會話的SQL執行詳情,單擊下方的點擊復制可快速復制SQL語句,方便排查或回溯有問題SQL。