问题描述

 云数据库 RDS SQL Server 版出现阻塞问题。

 问题原因

 当应用程序频繁读写某个表或者资源时,很容易出现阻塞情况。当阻塞问题严重时,应用程序端的语句执行会变得缓慢。

 解决方法

 阿里云提醒您:

 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

 排查方法

 针对云数据库RDS SQL Server版阻塞问题,排查建议如下。

 1、循环监控sys.sysprocesses,获取阻塞信息。blocked列的值为阻塞头session_id,waitresource为被阻塞的session等待的资源。操作代码如下。

 while 1=1
 begin
 select * from sys.sysprocesses where blocked<>0;
 waitfor delay '00:00:01'
 end

 说明:循环间隔时间可以自定义。此处以00:00:01为例。

 系统显示类似如下。

 云数据库 RDS SQL Server 版阻塞问题处理方法(图1)

 2、循环监控sys.dm_tran_locks,sys.dm_os_waiting_tasks等视图,可以得到阻塞图谱。Request_session_id是被阻塞的session_id,RequestingText是被阻塞的语句,blocking_session_id是阻塞头session_id,BlockingText是阻塞头语句。操作代码如下。

 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

 系统显示类似如下。

云数据库 RDS SQL Server 版阻塞问题处理方法(图2)

 说明:

 DBName:数据库名称。

 request_session_id:当前请求的session ID,即被阻塞的session。

 blocking_session_id:阻塞头session ID。

 BlockedObjectName:被阻塞的session操作的对象。

 resource_type:等待的资源类型。

 RequestingText:当前session执行的语句,即被阻塞的语句。

 BlockingText:阻塞头session执行的语句。

 request_mode:当前session请求的锁模式。

 调优建议

 可以参考以下步骤,进行调优。

 1、关闭阻塞头连接,可以帮助快速解除阻塞。

 2、查看是否有长时间未提交的事务,及时提交事务。

 3、如果有S锁参与阻塞,并且应用允许脏读,可以使用with nolock这个查询hint,让查询语句避免申请锁,从而避免阻塞,例如 select * from table with(nolock);。

 4、检查应用程序逻辑,按顺序访问某个资源。

 适用于

 云数据库RDS SQL Server版

 如果您的问题仍未解决,您可以免费咨询久云大使,或登陆阿里云官网提交工单联系阿里云技术支持。

分享
继续阅读相关文章

发表评论 快来秀出你的观点

评论区暂时关闭,请谅解!
评论 点赞 收藏