记一次Windb死锁排查
正在开会,突然线上站点线程数破千。然后一群人现场dump分析。
先看一眼线程运行状态 !eeversion

发现CPU占用并不高,19%,937条线程正在运行。
看看他们都在干什么。 ~* e !clrstack

发现大片内容相似的,并且最后一行是System.Threading.Monitor.Enter,尝试获取锁。很大概率是死锁了,排查一下是否存在死锁的情况。
运行 !syncblk 查看当前的锁的情况

等待数并不是真的等待数,需要(线程数 -1) / 2,至于具体为什么这么算我就不清楚了。将所有的数据相加 正好是等于937。也就是说所有的线程都在运行,所有的线程都得等待锁,所以肯定出现死锁了。复制内容出来备用。
从第一个线程 90 开始查。~90s,进入90号线程上下文,然后打印堆栈信息 !clrstack -l

上下文信息中只有这个有值,这个很大概率就是锁对象的地址。然后去锁对象列表中查一下

果然是锁对象,也就是说90号线程应该是在等77号线程。那么77号线程在等什么?切到77号线程,然后打印上下文。

发现也是类似的情况,最后在申请锁。我们再查一下这个锁是什么情况。

77号在等70号线程。那么70号线程在等谁?切换上下文到70号线程,然后打印上下文。

发现他也在等一个锁对象,我们查一下这个锁对象的拥有者是咋回事。

我们发现 70线程在等77号。那么现在70号跟77号在相互等待,那么这两个也就死锁了,其他的相关线程大概率都是跟这个死锁相关的。既然是这样,我们分别打印一下77号和70号相关的调用堆栈,就可以对比着代码查一下,为什么会出现死锁了。

从这个函数名字上看很大概率是IncrementConnection和CloseOnIdle函数发生了死锁的情况,上下文其实也算是相关的。剩下的就只能对比代码,为什么这两个函数可能发生死锁了。

记一次Windb死锁排查的更多相关文章
- 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查)
原贴如下 坑爹坑娘坑祖宗的87端口(记一次tomcat故障排查) 虽然我用的是PHPstudy部署的dedecms,还是一样栽倒这个坑里了. 总结经验:本地测试使用8000~9000的端口比较安全.
- Java死锁排查和Java CPU 100% 排查的步骤整理
================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...
- 记录一次Mysql死锁排查过程
背景 以前接触到的数据库死锁,都是批量更新时加锁顺序不一致而导致的死锁,但是上周却遇到了一个很难理解的死锁.借着这个机会又重新学习了一下mysql的死锁知识以及常见的死锁场景.在多方调研以及和同事们的 ...
- SQL Server死锁排查
1. 死锁原理 根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态. 死锁的四个必要条件:互斥条件(Mutua ...
- 记一次NoHttpResponseException问题排查
上传文件程序会有一定的概率提示错误,错误率大概在1%以下,错误信息是:org.apache.http.NoHttpResponseException , s3-us-west-1.amazonaws. ...
- 记一次用arthas排查jvm中CPU占用过高问题
记一次使用arthas排查jvm中CPU占用过高问题.这工具屌爆了 碾压我目前使用的全部JVM工具. 安装 小试 curl -O https://arthas.aliyun.com/arthas-bo ...
- index_merge引发的死锁排查
概述 前几天排查了一个死锁问题,最开始百思不得其解,因为发生死锁的两个事务是单语句事务,语句类型相同(where属性列相同,仅值不同),而且语句都走了相同的索引,但最终确实发生了死锁.通过定位排查发现 ...
- 死锁排查的小窍门 --使用jdk自带管理工具jstack
本文版权归 远方的风lyh和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 开发时间久了,难免会写出一些一些死锁的代码,自己明明调用该方法可该方法就是不执行.不进该方法.日志也不打 ...
- SQL Server死锁排查经历 -基于SqlProfiler
提到sql server,想必最让人头疼的当属锁机制了.在默认的read committed隔离模式下,连最基本的select操作都要申请各种粒度的锁,而且在读取数据过程中会不断有锁升级.转化.在非 ...
随机推荐
- python自动化第二课 - python基础
1.标识符(identitifier),识别身份 定义:在编程语言中,标识符就是用户编程时使用的名字,用于给变量.常量.函数.语句块等命名 标识符命令规范: 1)英文,数字以及下划线(_)但不能以数字 ...
- 28 复杂的使用Specification查询
/** * Specification的多表查询 */ @Test public void testFind() { Specification<LinkMan> spec = new S ...
- Gorm 预加载及输出处理(一)- 预加载应用
单条关联查询 先创建两个关联模型: // 用户模型 type User struct { gorm.Model Username string `gorm:"type:varchar(20) ...
- Canny检测算法与实现
1.原理 图象边缘就是图像颜色快速变化的位置,对于灰度图像来说,也就是灰度值有明显变化的位置.图像边缘信息主要集中在高频段,图像锐化或检测边缘实质就是高通滤波.数值微分可以求变化率,在图像上离散值求梯 ...
- Ubuntu 16 编译装python2.7
Ubuntu 16自带 python3 ,有很多库无法使用,决定装 python2.7 试了试,好像 apt-get 装不上. 使用源码,编译安装. wget https://www.python.o ...
- 使用flask-dropzone 上传图片文件
引用 http://greyli.com/flask-dropzone/ 现在需要上传图片文件的页面使用jijin2渲染,由于是使用flask-dropzone的,所以我们使用dropzone的cs ...
- js中的堆和栈
http://www.jscwwd.com/article/5e533ae2552a8e2bf45d3d69 这里先说两个概念:1.堆(heap)2.栈(stack)堆 是堆内存的简称.栈 是栈内存的 ...
- layui的弹出层的title的自定义html
layui的弹出层的title的自定义html //在这里面输入任何合法的js语句 layer.open({ type: 1 //Page层类型 ,area: ['500px', '300px' ...
- React Native实现短信转发到微信上
缘由 都说需求来源于生活我为什么会有一个这么奇葩的需求呢?来看一个故事. 昨天为了省点手续费导航走了3公里多去找一家工行ATM机(没办法穷)然后到了以后发现ATM机在人家的园区里面,现在疫情进入要通行 ...
- git 更换push 提交地址
git 删除远程地址 1.找到对应项目 右键点击 GIT Bash Here 2.输入命令 git remote rm origin 3.对应项目 右键点击 GIT Sync..... 4.点击Man ...