锁阻塞
什么是锁阻塞?
阻塞是指一个事务正在访问数据库中的某个资源(如表、行、页等),而另一个事务也想要访问同一资源,但由于某种原因(如锁定)无法访问,于是就被阻塞了。阻塞的SQL是指正在执行的SQL语句被阻塞了,无法继续执行,直到阻塞的原因被解决。
在SQL Server中,当一个事务正在执行时,如果另一个事务想要访问同一资源,但是该资源已被锁定,则该事务就会被阻塞,直到锁定的事务释放该资源。阻塞的SQL语句会一直等待,直到阻塞的原因被解决,才会继续执行。阻塞的SQL语句可能会导致性能下降,甚至会导致 整个系统崩溃。
RDS for SQL Server提供了锁阻塞页面。通过查看该页面,可获取数据库中的锁阻塞个数、阻塞源会话以及阻塞的SQL语句,协助定位并处理阻塞问题。
不升级高级智能运维包的情况下,最多只保留7天的记录。
采集原理
系统每10秒会对锁阻塞的情况进行一次采集。在系统进行采集的时间点,只要当一个会话执行SQL阻塞了其他会话的执行,就会被捕捉并统计到锁阻塞统计页面。可以把最后一次采集的样本的执行耗时,近似等于阻塞其他会话的时间。
操作步骤
锁阻塞界面信息介绍
- 锁阻塞趋势
展示近1天、近1周 、近2周、近1月的阻塞类型趋势,列出了主要可能发生的几种阻塞类型,展示某个时间段各种锁数量的变化趋势。
图5 锁阻塞趋势
表1 阻塞类型说明 名称
说明
ASYNC_NETWORK_IO
通常是由网络适配器驱动程序问题、筛选器驱动程序、防火墙或配置错误的路由器引起的。
ASYNC_IO_COMPLETION
当任务等待异步非数据 I/O 完成时发生。 示例包括热备用日志传送涉及的 I/O、数据库镜像、一些批量导入相关操作。
CXCONSUMER
当使用者线程(父线程)等待生成者线程发送行时,与并行查询计划一起发生。 CXCONSUMER 等待是由从其生成者线程中耗尽行的 Exchange 迭代器引起的。 这是并行查询执行的正常部分。
CXPACKET
在等待同步查询处理器 Exchange 迭代器以及生成和使用行时,与并行查询计划一起发生。 如果等待过多且无法通过优化查询(如添加索引)来减少,请考虑调整并行度的成本阈值,或降低并行度。
DTC
当某任务正在等待用于管理状态转换的事件时出现。 此状态控制在 SQL Server 收到 MS DTC 服务不可用的通知后,Microsoft 分布式事务处理协调器 (MS DTC) 事务的恢复何时发生
LCK_M_BU
当某任务正在等待获取大容量更新 (BU) 锁时出现。
LCK_M_IS
当某任务正在等待获取意向共享 (IS) 锁时出现。
LCK_M_IU
当某任务正在等待获取意向共享 (IS) 锁时出现。
LCK_M_IX
当某任务正在等待获取意向排他 (IX) 锁时出现。
- 阻塞源会话列表
阻塞源会话列表,包含会话SPID、QueryHash、等待类型、执行耗时、SQL、采集时间、数据库、客户端HostName、客户端名称、请求开始时间、登录用户名。
图6 阻塞源会话
- 阻塞源关系图
展示了,阻塞和被阻塞会话的关系图,鼠标移动到会话上,可展示出会话详情。
图7 阻塞源关系图
表3 阻塞关系图参数说明 参数
说明
SPID
会话ID。
等待类型
阻塞类型。可参考表2。
CPU时间(ms)
SQL运行CPU时间。
数据库
SQL执行数据库。
客户端HostName
SQL 请求端HostName。
客户端名称
SQL 请求端名称。
登录用户名
SQL执行用户名。
请求开始时间
SQL开始时间。
SQL
SQL文本,可复制。