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