Windbg 分析线程堵塞

症状:

端午发布后,服务器出现大量报错日志,并且平均响应时间不断上升。重启机器后立刻恢复正常,但还是运行一段时间后,响应时间又开始上升。

从报错日志中发现很多DB连接池满的错误。导致这种错误一般有两个原因:

1:SQL 执行完后,DbConnection 及时没有释放。

2:SQL 执行慢,占用了大量 DbConnection 。

通过对代码彻底扫描,发现有几个 DataReader 没有显示关闭的地方。但这些都是运行很久老代码应该不是引用这次现象的原因。修改代码重新上线后的确没有得到改善。

继续找原因:

观察单台服务器的平均响应时间曲线。基本上是按一分钟一个周期上下波动。

对每个接口的平均响应时间曲线分析,发现所有接口的平均响应时间都有上升,再分析每个接口的调用量,除了六一期间,没有明显增加。可以排除是单个接口影响了整体响应时间。

同时对比多个接口的最大响应时间曲线,发现都是按一个频率上下波动,并且和整体平均响应时间的曲线是吻合的。

有规律性的上下波动,我猜测可能是由于什么堵塞,造成线程等待。再从代码上进行排查后,没有发现什么线索。还是找来DUMP 文件进行分析。

!threadpool   显示程序池信息

CPU不高 和 线程数量没有什么异常

!syncblk  显示同步块

发现有40来个线程来等待000000017f636630 这个同步块。51这个线程拥有这个同步块,其它的线程都在等待这个同步块的释放。看到这似乎找到了方向。

~51s 切找到51这个线程

!clrstack 列出当前线程的调用堆栈

 

51这个线程 正在执行 clearCache这个方法

!clrstack  -l 列出当前线程的调用堆栈及其使用的局部变量

可以看到clearCache这个方法有引用 000000017f636630 这个同步块

~52s 切换到其中一个等待线程

可以看也有引用000000017f636630 这个同步块。System.Threading.Monitor.Enter(System.Object) 获取排他锁。

由于~51 clearCache 这个方法内LOCK 了这个对象,造成~52 Validate这方法等待锁的释放。

切换到它几个线程也是同样的情况。

这是引用的框架部门的DLL的两个方法,反编译这个DLL 找到这两个方法。

是一个清除日志的操作,每次清除 n 小时以前的数据。 N小时到当前时间内产生的数据,如果满足 > CountMax ,则一直会执行 这个FOR循环。

而且 remove(i) 会引起LogEntryCache.Count;的值变化,这样每次只能遍历一半。并发量大的情况,会造成每个线程漫长的等待。

并且在执行 ExecuteReader 内部就被锁住了。产生的DataReader还没有return,

DbConnection没有释放,就很有可能造成数据库连接池满。

!dumpstackobjects  打印当前threadstack中保存的所有托管的object

找到System.Data.SqlClient.SqlCommand 的地址

!do 00000001805619e8  显示Command对象的内容

!do 0000000180561b30 显示SqlConnection

000000017f613c98 _poolGroup 该连接使用的连接池

下面找到这个连接池

!dumpheap –stat 检查当前所有托管类型的统计信息

找到System.Data.ProviderBase.DbConnectionPool

!dumpheap -mt 000007feedd23a98 查看函数表地址中的各个对象信息

!do 0x000000017f614748 显示DbConnectionPool

 

000000017f613c98 _connectionPoolGroup 这个连接池有14个等待。

更新DLL 后,问题解决。

Windbg 分析线程堵塞

时间: 2024-08-13 19:47:28

Windbg 分析线程堵塞的相关文章

【转】如何用WINDBG分析64位机上32位程序的DUMP文件

将dump拖入到windbg中后,在command输入栏输入 .load wow64exts 回车 !sw 回车,就将windbg的dump,从64位模式切换到了32位模式,否则看到的call stack 对我们分析dump是没有帮助的.然后就可以使用其它的命令来分析了.比如:使用kb命令,查看所有线程的调用堆栈,找出出错的线程,~*kb,就是查看所有线程的调用堆栈. http://www.cnblogs.com/suiyingjie/archive/2012/12/07/2807504.htm

Windbg 分析CPU上涨

症状: 下班前,收到报警邮件.一个应用的两台服务器CPU 过高.打开监控一看CPU都100了.没找到原因之前,先抓好DUMP 然后重启应用程序池. !threadpool 可以看到CPU 利用率 !runaway 查看运行的线程和运行时间 解决CPU 高的问题,应该从运行的线程上分析.分析它们都在干什么,哪个线程一直占用CPU运行时间 ~threadid s  切换到运行时间最长的几个线程 k   显示当前线程的call stack 发现都是在GC线程(SVR::gc_heap::gc_thre

Windbg分析高内存占用问题

1. 问题简介 最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声.为了缓解现场的情况, 客户都是手动回收IIS应用程序池才能解决. 这样的后果是很严重的,接到反馈,第一时间想到的是加内存吧,这样最快.但是客户从8G-->16G-->32G,只是延长了每次奔溃的时间,但是并没有解决系统卡顿的问题.到这里,也基本猜测了问题所在了,肯定是什么东西一直在吃内存且得不到释放.这种问题,也就只能打Dump分析了. 2. 打Dum

WinDbg分析DMP文件方法完全攻略

前言:在C++实际开发过程中,开发出来的程序,一般情况下由开发人员进行单元测试,然后移交给测试人员进行测试.在开发人员测试出现的bug,我们可以直接在本地进行调试.如果测试人员测试出崩溃级别的bug,如果我们需要调试往往借助于vs提供的Remote Debugger工具进行远程调试(关于vs2010远程调试的方法,请参考http://blog.sina.com.cn/s/blog_a459dcf5010153o7.html),然是当程序在用户手中出现崩溃此时我们可以采用Remote Debugg

揪出“凶手”——实战WinDbg分析电脑蓝屏原因

http://www.appinn.com/blue-screen-search-code/ 蓝屏代码查询器 – 找出蓝屏的元凶 11 文章标签: windows / 系统 / 蓝屏. 蓝屏代码查询器可以帮你查出引起蓝屏的故障原因并可以到微软知识库中查询解决方案,和之前的 BlueScreenView 配合是很好的蓝屏故障排除组合.@Appinn 使用时只需填入错误代码的简写即可,另外在支持中心中有关于蓝屏原因分析的文章链接,有兴趣的童鞋可以去看看..  官方网站 | 来自小众软件 http:/

JVM:如何分析线程堆栈

英文原文:JVM: How to analyze Thread Dump 在这篇文章里我将教会你如何分析JVM的线程堆栈以及如何从堆栈信息中找出问题的根因.在我看来线程堆栈分析技术是Java EE产品支持工程师所必须掌握的一门技术.在线程堆栈中存储的信息,通常远超出你的想象,我们可以在工作中善加利用这些信息. 我的目标是分享我过去十几年来在线程分析中积累的知识和经验.这些知识和经验是在各种版本的JVM以及各厂商的JVM供应商的深入分析中获得的,在这个过程中我也总结出大量的通用问题模板. 那么,准

Windbg 分析内存上涨

症状: 上次一站点发布后,发现服务器内存持续上涨.正常本地缓存占了4-5个G ,使用内存直接涨到20G后应用程序池重启. 检查代码后发现,没有什么内存泄漏的地方.最后还是找来DUMP文件排查原因. !dumpheap –stat       查看当前所有托管类型的统计信息 System.Threading.ReaderWriterCount 占了七个G.这是个读写锁, 有一亿多个对象. !dumpheap –mt  000007fef32fa770        查看函数表地址中的各个对象信息

62.JAVA编程思想——线程堵塞

62.JAVA编程思想--线程堵塞 一个线程可以有四种状态: (1) 新(New):线程对象已经创建,但尚未启动,所以不可运行. (2) 可运行(Runnable ):意味着一旦时间分片机制有空闲的CPU 周期提供给一个线程,那个线程便可立即开始运行.因此,线程可能在.也可能不在运行当中,但一旦条件许可,没有什么能阻止它的运行--它既没有"死"掉,也未被"堵塞". (3) 死(Dead):从自己的run()方法中返回后,一个线程便已"死"掉.亦可

使用Windbg分析蓝屏原因

序言:     当电脑频繁蓝屏时我们需要软件来查找蓝屏原因,此时可以使用Windbg软件对蓝屏文件进行分析查找原因. 工具:     1.WinDbg软件,有两种版本,可以参考我的上一篇文章:安装与配置windbg的symbol(符号) 方法/步骤:     1.首先我们要保证我们设置了蓝屏转储,这样当电脑蓝屏时,系统会以.dmp文件方式保留蓝屏故障原因,我们需要查询是否设置内存转储和蓝屏文件存放位置.右键单击桌面计算机图标--选择属性,单击高级系统设置,在启动和故障恢复栏中单击设置,在写入调试