现象:近期现场反馈一个问题。系统在审批的时候,常常卡死。整个系统全然用不了,浏览器訪问处于loading的状态。

排查:

1.一般系统挂了首先想到内存问题,可是现象是loading,也就是说没有挂,线程正在运行,怀疑是线程被堵塞了,配置上jvisualvm监控了一下。出问题后内存没满确定不是内存问题,查看线程dump发现大部分都在运行sql查询,

初步发现是运行sql慢导致的。

2.我们用的是sybase数据库,运行了几个简单sql发现几分钟都没运行完,使用sp_sysmon "00:00:30"监控近30秒的情况发现cpu、内存、线程都没问题,差点儿1%使用率都不到,怀疑是某个连接堵塞了表。导致其它连接所有堵塞导致的。

3.我们使用自己写的存储过程查看堵塞的连接。结果例如以下:

PS:使用sp_lock命令就能够查看哪个连接堵塞了数据库。可是显示的都是tableid等。还须要再次查询转换成详细表名等。自己写的存储过程仅仅是此处转换了一下,后面会附上。

发现当中1万多个锁。7000多个排它锁,Ex_row-blk是堵塞了其它连接的锁。发现有21个堵塞了其它连接的锁,相应的表是T_ZXLD_SYYH,运行select * from master..sysprocesses找到相应的连接。如上图的User有316/287/283等,结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVlcGlhb2hhbjIwMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

此时基本确定了原因,我们用的是c3p0连接池。应该是某个连接堵塞了表。其它全部连接查询时候都被堵塞了,导致连接池被占满。全部请求凡是涉及数据库查询的都被堵塞了,页面始终处于loading状态。

4.那么接下来就是找到堵塞的地方,上图发现tran_name都是$chained_transaction,结合程序推断。也就是说都在运行某个责任链里面的事务时堵塞了。系统就2处使用了责任链,直接就能够推断到时审批的责任链导致的,那么接下来就是排查此处代码是否有问题了。审批流程例如以下:

(1)开启事务

(2)依据參数查询出要审批的主表数据。2个sql

(3)逐条调用审批组件(类似工作流的一个组件)审批,每条数据大约5个更新sql,2个查询sql

(4)更新主表状态,每条数据1个更新sql

(5)插入审计日志,每条数据1个插入sql

(6)生成提醒消息,查询所有主表数据。20个查询sql,5个更新删除sql(很慢)

(7)更新增量记录表。记录该条数据改动时间和状态等,每条数据1个更新sql

(8)提交事务

怀疑并发时相互堵塞导致的,生成提醒消息的地方,会查询所有业务表。假设此时有其它连接在事务中审批,就会堵塞。其它连接在生成消息。相互堵塞,造成死锁。理论上数据库会自己主动处理死锁的。可是不知道什么原因。日志报的死锁数量不是特别多。

并且此处业务处理也太合理。正经常使用户每次批量审批大约100条数据,所以大约有900多个增删改sql,200多个查询sql,像生成消息等sql运行很慢(由于涉及更新旧消息),这么多操作放到一个事务中很慢。审批表大约3000w数据,业务主表500w数据,运行起来也不是很快。

解决的方法:重构了此处代码,讲上面运行慢的(5)(6)(7)步骤新起一个线程,不放到事务中运行,即使失败也影响不大。

这样sql降低了30%,速度快了不少。更新到现场,观察了一个星期,发现未出现不响应等情况,算是问题解决。

尽管问题解决。可是根本原因没有找到,为什么会相互堵塞。为什么死锁没自己主动检測,这个是兴许须要跟踪的。

最后。问题尽管攻克了,可是中间沟通花了不少时间,和运维人员要现场数据耽误了非常多事,简单整理一下。兴许出问题的时候搜集这几个数据:

1、sp__lock的结果;(使用文章最后提供的存储过程)

2、select * from master..sysprocesses;

3、假设数据库慢。加上sp_sysmon "00:00:30"的结果;

4、中间件线程dump文件。

附上sybase查看锁的存储过程

IF OBJECT_ID ('dbo.sp__lock') IS NOT NULL
DROP PROCEDURE dbo.sp__lock
GO create procedure sp__lock(
@dbname char(30)=null,@spid int=null,
@dont_format char(1) = null
)
as
begin declare @dbid smallint
if @dbname is not null
select @dbid=db_id(@dbname) if (charindex("sa_role", show_role()) > 0)
begin
if @dont_format is null
select "Type"=substring(v.name,1,11),
"User"=substring(suser_name(p.suid)+" ("+rtrim(convert(char(6),l.spid))+")",1,20),
"Table"=substring(db_name(l.dbid)+".."+convert(char(20),object_name(l.id,l.dbid)),1,26),
"Page"=convert(char(8),l.page),
"Cmd"=substring(p.cmd,1,11)
from master..syslocks l,
master..sysprocesses p,
master..spt_values v
where p.spid=l.spid and
l.type = v.number and
v.type = "L" and
p.dbid=isnull(@dbid,p.dbid) and
p.spid=isnull(@spid,p.spid) and
l.dbid=isnull(@dbid,l.dbid) and
l.spid=isnull(@spid,l.spid)
order by l.dbid, l.id, v.name
else
select "Type"=v.name,
"User"=suser_name(p.suid)+" ("+rtrim(convert(char(6),l.spid))+")",
"Table"=db_name(l.dbid)+".."+object_name(l.id,l.dbid),
"Page"=l.page,
"Cmd"=p.cmd
from master..syslocks l,
master..sysprocesses p,
master..spt_values v
where p.spid=l.spid and
l.type = v.number and
v.type = "L" and
p.dbid=isnull(@dbid,p.dbid) and
p.spid=isnull(@spid,p.spid) and
l.dbid=isnull(@dbid,l.dbid) and
l.spid=isnull(@spid,l.spid)
order by l.dbid, l.id, v.name
return
end select "Type"=v.name,
"Usernm"=convert(varchar(60),suser_name(p.suid)+" ("+rtrim(convert(char(6),l.spid))+")"),
"TableNm"=convert(varchar(60),db_name(l.dbid)+".."),
"Page"=l.page,
"Cmd"=p.cmd,
l.id,
l.dbid
into #locks
from master..syslocks l,
master..sysprocesses p,
master..spt_values v
where p.spid=l.spid and
l.type = v.number and
v.type = "L" and
l.dbid=isnull(@dbid,l.dbid) and
l.spid=isnull(@spid,l.spid) and
p.dbid=isnull(@dbid,p.dbid) and
p.spid=isnull(@spid,p.spid) update #locks
set TableNm=TableNm+object_name(id,dbid)
where dbid=db_id() or dbid=1 or dbid=2 update #locks
set TableNm=TableNm+convert(varchar,id)
where dbid<>db_id() and dbid>2 delete #locks
where TableNm like "tempdb..#locks%" if @dont_format is null
select substring(Type, 1,11),
"User"=substring(Usernm, 1,14),
"Table"=convert(char(26),TableNm),
"Page"=convert(char(8),Page),
"Cmd"=substring(Cmd,1,11)
from #locks
order by dbid, id, Type
else
select Type, "User"=Usernm, "Table"=TableNm, Page, Cmd
from #locks
order by dbid, id, Type end
GO

性能问题案例02——sybase连接堵塞问题的更多相关文章

  1. 性能问题案例01——sybase数据库内存问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xuepiaohan2006/article/details/30064399     近期现场反馈问 ...

  2. 性能问题解决案例01——sybase数据库内存问题

    最近湖南现场反馈问题,所有电子签章页面打不开文书(pdf格式),后台日志没报任何错误. 1.首先想到是签章的ocx控件问题,检查ocx控件安装,发现其他电脑也打不开文书,测试页面可以直接打开pdf文档 ...

  3. SSRS Reports 2008性能优化案例

    我们的一个Reporting Service服务上部署了比较多的SSRS报表,其中有一个系统的SSRS报表部署后,执行时间相对较长,加之供应商又在ASP.NET页面里面嵌套了Reporting Ser ...

  4. 老李案例分享:Weblogic性能优化案例

    老李案例分享:Weblogic性能优化案例 POPTEST的测试技术交流qq群:450192312 网站应用首页大小在130K左右,在之前的测试过程中,其百用户并发的平均响应能力在6.5秒,性能优化后 ...

  5. Android-优化UI性能(1)-降低主线程的堵塞时间

    Android-优化UI性能(1)-降低主线程的堵塞时间 一 降低主线程的堵塞时间 Android已经提供了AsyncTask实现从主线程生成新的异步任务的方法. 定义并实现以下的类就可以(方法由系统 ...

  6. web综合案例02

    web综合案例02 web综合案例02 web综合案例02 ... ... 内容待添加

  7. android 性能分析案例

    本章以实际案例分析在android开发中,性能方面的优化和处理.设计到知识点有弱引用,memory monitor,Allocation Tracker和leakcanary插件. 1.测试demo ...

  8. SQL性能优化案例分析

    这段时间做一个SQL性能优化的案例分析, 整理了一下过往的案例,发现一个比较有意思的,拿出来给大家分享. 这个项目是我在项目开展2期的时候才加入的, 之前一期是个金融内部信息门户, 里面有个功能是收集 ...

  9. SSRS Reports 2008性能优化案例二

    前几天一同事反映海外工厂A的SSRS报表比较慢,让我检查优化一下.于是我检查了下2015-07-13到2015-07-15 12:00这段时间报表的耗时记录 USE [ReportServer];   ...

随机推荐

  1. c标准库 徐明远 背景基础

    背景基础 1.c语言库用c语言编写   其他语言则不同 早期语言的库是用汇编语言编写的    不同的计算机体系结构有不同的汇编语言   所以在移植性方面差一点   而c语言可以编写出高度可移植性的代码 ...

  2. NOI2015 荷马史诗 【k-哈夫曼树】

    题目 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛> ...

  3. Spring-IOC源码解读2.3-BeanDefinition的注册

    在DefaultListAbleBeanFactory中通过一个HashMap持有载入的BeanDefinition信息 ,这个HashMap的定义在DefaultListAbleBeanFactor ...

  4. 洛谷 [P2594] 染色游戏

    博弈论+SG函数的应用 这是一个二维翻硬币问题 一维翻硬币问题有一个结论: 局面的SG值等于局面中所有反面朝上的硬币单独存在时的SG值的异或和 这个结论同样适用于二维的翻硬币问题 证明可以用数学归纳法 ...

  5. Codevs 2602 最短路径问题

     时间限制: 1 s 空间限制: 32000 KB 题目等级 : 黄金 Gold 题目描述 Description 平面上有n个点(n<=100),每个点的坐标均在-10000~10000之间. ...

  6. 系统进程的Watchdog

    编写者:李文栋 /rayleeya http://rayleeya.iteye.com/blog/1963408 3.1 Watchdog简介 对于像笔者这样没玩过硬件的纯软程序员来说,第一次看到这个 ...

  7. iscroll API

    概况 资料来源 http://cubiq.org/iscroll-4 http://www.cnblogs.com/wanghun/archive/2012/10/17/2727416.html ht ...

  8. python 获取时间 存入文件

    1读文件: file_path_name = '/home/robot/bzrobot_ws/src/bzrobot/bzrobot_comm/led_show_data/'+file_name+'. ...

  9. JFinal跳转jsp页面空白

    eclipse工具中java的编译有的设置的是jre,而jsp是需要jdk来进行编译的 将这里改为jdk的就可以了

  10. Apache Beam 传 大数据杂谈

    1月10日,Apache软件基金会宣布,Apache Beam成功孵化,成为该基金会的一个新的顶级项目,基于Apache V2许可证开源. 2003年,谷歌发布了著名的大数据三篇论文,史称三驾马车:G ...