本文介绍如何通过锁阻塞统计页面快速定位造成长时间阻塞的会话及其详细信息。
前提条件
实例的存储类型为云盘。
实例不能是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。