Dictionary导致CPU暴涨
中午吃完饭回来,刚想眯一会,突然发现公司预警群报警,某台机器CPU100%,连续三次报警,心里咯噔一下,我新开发的程序就在这上面,是不是我的程序导致的?立马远程,oh my god,果然是。 二话不说,抓紧抓dump,由于是生产环境,所以只抓了两个dump,中间间隔一分钟,立马程序重启。
首先,这个程序从发布以来,cpu从来没有占用如此之高,已经稳定运行近一周时间,期间出现的内存暴涨问题也是由于业务垃圾数据未及时清理,那么唯一的可能性就是早上为了方便查看运行状态,增加的一个小功能导致的,凡事都要讲证据,还是抓紧分析一下dump吧。
常规思路:比较两个dump,查看是否有线程时间持续增长,进而确定下一步的方案。
打开windbg,打开第一个dump,.loadby sos clr后,先看一下线程池,输入!threadpool
可以看到,目前cpu占用率92%,目前活动线程25个,由于是数据分析程序,线程稍多一点
然后输入 !runaway 看下各个线程的执行时间吧
这里就有问题了,看到很多线程执行时间都在好几分钟,作为程序开发者,我感觉肯定是不应该的,因为分析过程都极度细化,每个线程的执行时间都不会超过10秒,先不管了,看下第二个dump对比下吧。
打开第二个dump,.loadby sos clr,然后 !runaway,突然发现没有出现熟悉的画面,
这就很尴尬了,常规的手段没法玩了,难道是当时紧张,抓的dump也紧张了?
既然没法比较,那就只能从第一个dump的场景去分析了,首先看第一个执行了18分钟的线程,输入~10s,然后输入!clrstack
可以看到这是接收Kafka数据源的,由于一直在不停接收,执行时间会相对较长,看下一个:
在执行一个dictionary的insert操作,这种东西不是该秒完的么?并且这玩意一看就是早上新加的,心里不由咯噔一下,再继续找其他的线程,果然其他线程也都在执行这个代码。我靠,看来是多线程环境下没有使用ConcurrentDictionary而使用Dictionary导致的线程并发问题了?在我的意识里面,这种线程不安全的类,不该只是数据会有问题么,还会导致高CPU?看样子,应该是多个线程都在同时insert,竞争某个资源,导致死锁?可是这时候不该是CPU低么?应该是都在频繁的执行什么东西吧,并且一直执行不完,从而引发CPU暴涨。不管了,解决问题先,看一下我的源代码吧:
由于不断的线程都在执行这个操作,并且没有加锁,所以导致以上问题,换为ConcurrentDictionary,问题解决。首先总结一下,在高并发环境下,首先要考虑的是Concurrent下面的线程安全类,个人在很多关键的集合上都使用了,但是这个辅助分析的集合认为数据并不重要,只要能大体反应运行状况即可,所以偷懒直接用了Dictionary,结果导致少了一个午休,真是得不偿失!
不过还得继续寻根问底啊。看看Dictionary的Add的时候,到底做了啥操作,会导致死锁或者高CPU,而不仅仅是数据不安全,首先定位到Add方法,
,看到调用内部的Insert,也就是我们dump中看到的,继续
哎呀,这个玩意就有点复杂了,究竟哪里会导致高CPU呢?除非for循环一直结束不了,再翻翻别人的文章,发现这么一段话,是Dictionary的Find方法导致cpu高的,
在多线程情况下,有可能进入死循环,但是具体哪里不清楚,留待后续解决吧。如果大牛们知道,还望赐教!
Dictionary导致CPU暴涨的更多相关文章
- Dictionary导致IIS CPU 100%案例分析 学会使用WinDbg工具
.NET 开发注意 线程安全性问题.弄不好可能会导致CPU满载 特别主要 Dictionary作为静态变量使用的情况. 解决方法: Dictionary 换成 ConcurrentDictiona ...
- [自带避雷针]DropShadowEffect导致内存暴涨
原文:[自带避雷针]DropShadowEffect导致内存暴涨 [自带避雷针]DropShadowEffect导致内存暴涨 周银辉 从学习WPF开始, 就知道"位图效果"不是什 ...
- Mybatis 并发执行导致cpu占满的问题
最近线上服务经常 出现cpu达到100%的问题,发现都是执行oracle操作的方法就没有返回.经过排查,最后定位到cpu消耗在以下方法 System.Collections.Generic.Dicti ...
- 利用windbg查找dictionary导致IIS占CPU100%案例分析(一)
一.背景 先说下windbg使用场景.各位coder在工作中或多或少都会遇到下面四种情况 1.本地代码好好的,放服务器上运行一段时间后,IIS服务突然占用 w3wp.exe CPU突然100% ,不得 ...
- [转]不正当使用HashMap导致cpu 100%的问题追究
以前项目中遇到类似业务,但使用的是CurrentHashMap,看到这篇文章,转载记录,警示自己. 以下内容转自: 转载自并发编程网 – ifeve.com(http://ifeve.com/hash ...
- magento 由于Httpd进程增多,导致CPU占用100%问题
由于Httpd进程增多,导致CPU占用100%问题 magento for version 2.2.3 前些天一直导致CPU无法控制的增多问题. 根据报错我设置了如下内容: [Mysql]mysql. ...
- 云主机被拿去挖矿,cpu暴涨,tcp连接突增
1.云主机被拿去挖矿,cpu暴涨,tcp连接突增 2.现象:top -c 3.然后我再查看pstree进程树 4.查找文件来源 ind / -name '*suppoie*' 5. 然后删除 sup ...
- 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码
1.使用top命令,查看到一个叫xWx3T的进程cpu占用99.8%,由于我的阿里云是单核的,所以最高只能100%. 把它用kill命令杀死后,过一会儿又启动了,又占用100%. 使用ps -ef可以 ...
- Visual Studio 2012安装VASSISTX插件后导致CPU高的解决的方法
笔者一直都喜欢用VAX插件来做C++的开发,但发现VS2012安装了VAX后,CPU占用超级高,有时界面卡死得很厉害.我卸了又装,升级最新版,都无论用. 直到有天.看到网友说:VS2012的sdf文件 ...
随机推荐
- The based of tuning
调优目的: 1. 提高资源利用率 2. 找出性能瓶颈并缓解 3. 通过性能管理实现合理的资源分配,提升硬件性价比 调优分层及效率问题: 业务级调优 eg:1)网站使用的Apache—>业 ...
- java反射机制(先马再看)
http://blog.csdn.net/sinat_38259539/article/details/71799078
- javascript中的Promise使用
参考自: http://m.jb51.net/article/102642.htm 1.基本用法: (1).首先我们new一个Promise,将Promise实例化 (2).然后在实例化的promis ...
- Java线程中断机制-如何中断线程
介绍: 对于线程一共分为五个状态:新建状态,就绪状态,阻塞状态,运行状态,死亡状态,有时候把阻塞状态又分为同步阻塞和等待阻塞. 有时想让主线程启动的一个子线程结束运行,我们就需要让这个子线程中断,不再 ...
- 笔记:MyBatis 动态SQL
有时候,静态的SQL语句并不能满足应用程序的需求.我们可以根据一些条件,来动态地构建SQL语句.例如,在Web应用程序中,有可能有一些搜索界面,需要输入一个或多个选项,然后根据这些已选择的条件去执行检 ...
- 笔记:Maven 下载和安装
Windows 安装 下载 Apache Maven,下载地址为 http://maven.apache.org/ 解压缩下载的 ZIP 文件,复制到安装目录 增加环境变量 M2_HOME ,值为 A ...
- java大数(BigInteger)
JAVA之BigInteger 用Java来处理高精度问题,相信对很多ACMer来说都是一件很happy的事,简单易懂.用Java刷了一些题,感觉Java还不错,在处理高精度和进制转换中,调用库函数的 ...
- 解决NSURLConnection finished with error - code -1100错误
更新到xcode9以后,拖进工程中一个html文件,webview加载这个文件,xcode一直抛出 NSURLConnection finished with error - code -1100异常 ...
- 外部 Storage Provider - 每天5分钟玩转 Docker 容器技术(149)
如果 Kubernetes 部署在诸如 AWS.GCE.Azure 等公有云上,可以直接使用云硬盘作为 Volume,下面是 AWS Elastic Block Store 的例子: 要在 Pod 中 ...
- Beta 第七天
今天遇到的困难: 构造新适配器的时候出现了某些崩溃的问题 ListView监听器有部分的Bug 今天完成的任务: 陈甘霖:完成相机调用和图库功能,完成阿尔法项目遗留下来的位置调用问题,实现百度定位 蔡 ...