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文件 ...
随机推荐
- C/S 和B/S 详解 --- 2017-04-25
来源:脚本之家 一.C/S 架构 1. 概念 C/S 架构是一种典型的两层架构,其全程是Client/Server,即客户端服务器端架构,其客户端包含一个或多个在用户的电脑上运行的程序,而服务器端有两 ...
- 自己动手写泛型dao
在经过一系列的问题得到解决之后,泛型dao终于写出来了.泛型dao相比于以前写的dao最大的好处就是,大大提高了代码的复用性,以往我们要对数据库中表中的数据进行操作的时候,每张表都需要写一个dao来操 ...
- linux内核管理
一 linux组成:kernel.库.rootfs.程序 1.kernel的功能: 1) kernel提供的功能都通过系统调用给用户接口 2) kernel包括:进程管理 .内存管理 .网络管理 ...
- 【Python】 更棒的Excel操作模块xlwings
[xlwings] 说到Python操作Excel,有好多模块都可以支持这个工作.比如最底层的win32模块不仅可以操作Excel,还可以操作其他一众windows的软件. 其他的比较熟悉的有xlrd ...
- java.lnag.Throwable详细解读
public class Throwable extends Object implemnts Serializable Throwable类是所有错误或异常的超类.只有当对象是此类(或其中之 ...
- 02-Python的下载和安装_Python编程之路
原文发布在特克斯博客www.susmote.com 之前给大家讲了关于python的背景知识,还有Python的优点和缺点,相信通过之前的介绍很多人已经清楚自己到底要不要选择学习Python,如果已经 ...
- selenium2自动化测试学习笔记(四)
今天是学习selenium2第四天.总结下今天的学习成果,自动登录网易邮箱并写信发送邮件. 知识点or坑点: 1.模块化编写测试模块(类似java里的抽象方法,js的函数编写) from 包名 imp ...
- c语言程序设计第6周编程作业一(分解质因数)
分解质因数 题目内容: 每个非素数(合数)都可以写成几个素数(也可称为质数)相乘的形式,这几个素数就都叫做这个合数的质因数.比如,6可以被分解为2x3,而24可以被分解为2x2x2x3. 现在,你的程 ...
- 创建带缩进的XML
from xml.etree import ElementTree as ET from xml.dom import minidom root = ET.Element('}) son=ET.Sub ...
- bzoj千题计划219:bzoj1568: [JSOI2008]Blue Mary开公司
http://www.lydsy.com/JudgeOnline/problem.php?id=1568 写多了就觉着水了... #include<cstdio> #include< ...