设为首页 收藏本站
查看: 1152|回复: 0

[经验分享] 利用windbg查找dictionary导致IIS占CPU100%案例分析(一)

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-8-12 10:08:45 | 显示全部楼层 |阅读模式
  一.背景
  先说下windbg使用场景.各位coder在工作中或多或少都会遇到下面四种情况
  1.本地代码好好的,放服务器上运行一段时间后,IIS服务突然占用 w3wp.exe CPU突然100% ,不得不回收应用程序池,如果哪次回收晚了,被客户发现,后果很痛苦~
  2.你的w3wp.exe 内存高居不下 并且逐步上升
  3.cpu很低,内存也很低,但你的网页打开却越来越慢,而你该做的优化都做过了,却没有任何效果..
  4.你的程序本地运行好好的,但是到服务器上了,在某个时候会突然报错,再次刷新却又好了。而偏偏是客户操作的报错,你自己访问正常,会让你非常苦恼。
  
  而最痛苦的是,你是负责维护的,刚接手项目没多久,不懂技术的老板直接就让你解决,根本不管这代码是不是你写的(我目前就这环境)。上述情况第四点 还有 会有一些系统日志等帮你分析,而前三点则没有任何
  报错信息等供你参考,加上上万行的代码不是你写的,你根本不可能一行行的去看...这个时候 windbg就可以用上了~~
  
  二.问题描述以及工具准备
  老板:有个项目w3wp.exe CPU100%了 到时网页打开非常慢,你赶紧去看下,今天处理好...
  我:呵呵..
  最近的工作全是这样,什么CPU100,内存满了等 因为代码不是我写的,写这个代码的3年前就走了...于是开始准备神奇windbg
  这里一定要注意 windbg 有32位和64位 不要下载错了。微软官网即可下载到,不过现在是在线安装的,会装其他很多东西,而且安装的很慢..
  于是,登录到生产环境上,如果你很幸运,是win2008 服务器,自带的就有抓dump.那么点击任务管理器,找到CPU100%的进程,然后右键创建转储文件,稍等片刻后,dump就抓下来了~
  如果你是win03服务器,也没关系,后面告诉你抓去方式~
  下面是下载包地址
  微软官方在线安装下载地址:http://msdn.microsoft.com/en-us/windows/hardware/hh852365
  独立快速安装包:http://download.iyunv.com/detail/zhang957411207/4750492
  64位离线安装包:http://download.iyunv.com/detail/lazry/5555291
  
  三.分析开始
  1.先通过windbg打开dump包  并设置好符号文件
  2.载入sos.dll  执行.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\SOS.DLL
( 我是4.0 的 注意版本 64位)
  3.执行几个常见指令 开始分析  我总结下 cpu问题 执行这几个指令
  !threadpool  查看当前CPU状况 线程数等等
DSC0000.jpg
  !runaway  查看那几个线程使用的高 建议多抓几个dump 然后确定到底是哪个线程
DSC0001.jpg
  ~线程IDs 跳转到那个线程
  !clrstack 看看这个线程再干嘛 执行那些方法
  !clrstack -p  具体方法的参数值地址
DSC0002.jpg
  !do 地址  查看参数值
DSC0003.jpg
  这样问题基本就能找到了  下面看实际操作图
  
  四.解决
  好了,看到最后都是停留在字典类的操作上
  就是这些对字典的操作导致CPU100%..windbg只能帮你到这里了。调试重要的是思想,不是工具。
  可是这些字典的操作,为啥么会导致CPU100% 很平常的操作啊  这时看下源码..发现字典是静态的  这个静态字典做缓存。这是很多人的做法...代码大概都是这样
DSC0004.jpg
  于是,微微一笑...你们啊,毕竟还是图样图森破..只知道字典做缓存,却不知道这种情况要考虑线程安全么...字典类不是线程安全的 所以导致CPU。为了印证猜想
  去搜了一下 MSDN上有介绍  字典类型导致CPU100%
  http://blogs.msdn.com/b/tess/archive/2009/12/21/high-cpu-in-net-app-using-a-static-generic-dictionary.aspx
  复合猜想,猜想正确.果然是这样的原因。
  于是果断使用了.net4.0提供的线程安全的字典类 ConcurrentDictionary  也可以使用lock解决~
  从此..世界太平了
  
  顺便说下  不要一听到CPU100% 都说死循环导致的 谁没事写死循环啊... 很多时候 都是各种阻塞造成的 IO阻塞等   看似很平常的代码 都会造成CPU100%的~
  
  五.配合windbg使用的工具
  有的时候 我们希望在程序出错时 或者CPU100%时 等情况时 自动抓去dump  这个时候 可以使用
  Debug Diagnostic Tool   用这个可以自动抓取 并且自带分析功能 非常方便 支持各种操作系统 解决上面只能08的问题
  其次 分析系统问题 有的时候非常复杂 因为有可能会遇到不是代码引起的,这个时候一定要利用好 windows自带的性能检测
  利用好这个 会给你分析带来很大的灵感~
  (比如 因为配置文件 config 配置的debug=true 导致的问题 )
  
  
  六.后续
  如果你的程序员也正在受到上面介绍的4种情况困扰,可以把dump抓下来给我,我可以帮忙分析修改
  一个只要1块钱 长期包年帮忙解决 只要12元 还赠送价值22元的无空格键盘....你还等什么....前10个联系的更有1折优惠,对,你没听错,就是1折...赶紧发短消息联系我吧...
  下一篇 内存高的案例分析
  最后 真诚提前祝大家新年快乐!!
  QQ群推荐 33353329

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-97808-1-1.html 上篇帖子: 深入ASP.NET MVC 之一:IIS到路由表 下篇帖子: 如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表