中午吃完饭回来,刚想眯一会,突然发现公司预警群报警,某台机器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暴涨的更多相关文章

  1. Dictionary导致IIS CPU 100%案例分析 学会使用WinDbg工具

    .NET  开发注意 线程安全性问题.弄不好可能会导致CPU满载 特别主要 Dictionary作为静态变量使用的情况. 解决方法: Dictionary 换成  ConcurrentDictiona ...

  2. [自带避雷针]DropShadowEffect导致内存暴涨

    原文:[自带避雷针]DropShadowEffect导致内存暴涨  [自带避雷针]DropShadowEffect导致内存暴涨 周银辉 从学习WPF开始, 就知道"位图效果"不是什 ...

  3. Mybatis 并发执行导致cpu占满的问题

    最近线上服务经常 出现cpu达到100%的问题,发现都是执行oracle操作的方法就没有返回.经过排查,最后定位到cpu消耗在以下方法 System.Collections.Generic.Dicti ...

  4. 利用windbg查找dictionary导致IIS占CPU100%案例分析(一)

    一.背景 先说下windbg使用场景.各位coder在工作中或多或少都会遇到下面四种情况 1.本地代码好好的,放服务器上运行一段时间后,IIS服务突然占用 w3wp.exe CPU突然100% ,不得 ...

  5. [转]不正当使用HashMap导致cpu 100%的问题追究

    以前项目中遇到类似业务,但使用的是CurrentHashMap,看到这篇文章,转载记录,警示自己. 以下内容转自: 转载自并发编程网 – ifeve.com(http://ifeve.com/hash ...

  6. magento 由于Httpd进程增多,导致CPU占用100%问题

    由于Httpd进程增多,导致CPU占用100%问题 magento for version 2.2.3 前些天一直导致CPU无法控制的增多问题. 根据报错我设置了如下内容: [Mysql]mysql. ...

  7. 云主机被拿去挖矿,cpu暴涨,tcp连接突增

    1.云主机被拿去挖矿,cpu暴涨,tcp连接突增 2.现象:top -c 3.然后我再查看pstree进程树 4.查找文件来源 ind  / -name '*suppoie*' 5. 然后删除 sup ...

  8. 阿里云被挖矿使用,导致cpu长期处于100%,ddgs进程,xWx3T进程,关于redis密码

    1.使用top命令,查看到一个叫xWx3T的进程cpu占用99.8%,由于我的阿里云是单核的,所以最高只能100%. 把它用kill命令杀死后,过一会儿又启动了,又占用100%. 使用ps -ef可以 ...

  9. Visual Studio 2012安装VASSISTX插件后导致CPU高的解决的方法

    笔者一直都喜欢用VAX插件来做C++的开发,但发现VS2012安装了VAX后,CPU占用超级高,有时界面卡死得很厉害.我卸了又装,升级最新版,都无论用. 直到有天.看到网友说:VS2012的sdf文件 ...

随机推荐

  1. js 标签云

    以前只看到wordpress上面有个标签云的效果挺6,就好奇的弄个试试,还好网上有很多小伙伴的分享了,借鉴过来了  哈哈 html代码 <!DOCTYPE html> <html&g ...

  2. 我的linux一万小时

    这不是一篇鸡汤文,因为我并没有在使用 Linux 一万小时后成为 Linux 达人,甚至在很多方面,我连新手都算不上.我走的这些弯路能篇成一本很有参考价值的反面教材,下面,我在www.itxdl.cn ...

  3. http.request的请求

    var http=require('http'); var request=require('request'); var body = { "data":{ "id&q ...

  4. FileReader对象的readAsDataURL方法来读取图像文件

     FileReader对象的readAsDataURL方法可以将读取到的文件编码成Data URL.Data URL是一项特殊的技术,可以将资料(例如图片)内嵌在网页之中,不用放到外部文件.使用Dat ...

  5. POJ 1979 DFS

    题目链接:http://poj.org/problem?id=1979 #include<cstring> #include<iostream> using namespace ...

  6. 网络通信 --> Linux 五种IO模型

    Linux 五种IO模型 聊聊Linux 五种IO模型

  7. QueryBuilder 前端构造SQL条件的插件使用方法

    页面引入JS等: <script type="text/javascript" src="/qysds-jx/pages/gzrw/js/jquery.js&quo ...

  8. java并发包——阻塞队列BlockingQueue及源码分析

    一.摘要 BlockingQueue通常用于一个线程在生产对象,而另外一个线程在消费这些对象的场景,例如在线程池中,当运行的线程数目大于核心的线程数目时候,经常就会把新来的线程对象放到Blocking ...

  9. Beta冲刺计划---Day0

    Beta阶段报告---Day0 1.需要改进完善的功能   我们上一阶段开发由于开发时间匆忙,对于爬虫耗时的优化没有考虑.优化的空间我在Alpha阶段的总结报告里说过,具体看下图.   这张图显示出爱 ...

  10. 下载文件downloadFile

    public static void downLoadFile(InputStream inStream, String fileName) { if (StringUtils.isBlank(fil ...