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文件 ...
随机推荐
- opencv3.4+vs2015+win10安装过程问题解决
在使用cmake configure生成vs的工程文件时,有几个第三方的库和文件会频繁下载不成功,分别是: ffmpeg_version.cmake opencv_ffmpeg.dll opencv_ ...
- ELK学习笔记(五)简单搜索和DSL查询
检索文档 现在我们有一些数据存储在Elasticsearch中,我们可以开始处理这个应用程序的业务需求. 这在Elasticsearch中很容易.我们只需执行HTTP GET请求并指定文档的地址--索 ...
- 【Java】 重拾Java入门
[概论与基本语法] 取这个标题,还是感觉有些大言不惭.之前大三的时候自学过一些基本的java知识,大概到了能独立写一个GUI出来的水平把,不过后来随着有了其他目标,就把这块放下了.之后常年没有用,早就 ...
- hostPath Volume - 每天5分钟玩转 Docker 容器技术(148)
hostPath Volume 的作用是将 Docker Host 文件系统中已经存在的目录 mount 给 Pod 的容器.大部分应用都不会使用 hostPath Volume,因为这实际上增加了 ...
- bash下常用快捷键
Ctrl-A 相当于HOME键,用于将光标定位到本行最前面Ctrl-E 相当于End键,即将光标移动到本行末尾Ctrl-B 相当于左箭头键,用于将光标向左移动一格Ctrl-F 相当于右箭头键,用于将光 ...
- Go语言标准库_输入/输出
Go语言标准库_输入/输出 转载节选自<Go语言标准库> Reader 接口 type Reader interface { Read(p []byte) (n int, err erro ...
- c字符数组
一.PTA实验作业 题目1:统计一行文本的单词个数 1. 本题PTA提交列表 2. 设计思路 定义一个长度为1000的字符数组str[1000] 在定义 i=0,cnt=0:cnt用来记录单词的个数 ...
- NO.7 项目需求分析
NO.7 项目需求分析 由于我们组的第一次选题并没有通过,所以我们又重新选择了一个题目--高校学生征信系统. 结合老师的作业要求,我们对该项目进行了详细的需求分析,软件需求规格说明书地址请点击这里.软 ...
- Python 远程部署 Fabric
参考文章:http://zmrenwu.com/post/21/ Fabric是一个Python的库,它提供了丰富的同SSH交互的接口,可以用来在本地或远程机器上自动化.流水化地执行Shell命令.因 ...
- 201421123042 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1. 常用异常 结合题集题目7-1回答 1.1 自己以前编写的代码中经常出现 ...