.NET  开发注意

线程安全性问题。弄不好可能会导致CPU满载

特别主要 Dictionary作为静态变量使用的情况。

解决方法:

Dictionary 换成  ConcurrentDictionary

例如下图:

下面是参考网上的相关资料:

一.背景

先说下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.csdn.net/detail/zhang957411207/4750492

64位离线安装包:http://download.csdn.net/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状况 线程数等等

!runaway  查看那几个线程使用的高 建议多抓几个dump 然后确定到底是哪个线程

~线程IDs 跳转到那个线程

!clrstack 看看这个线程再干嘛 执行那些方法

!clrstack -p  具体方法的参数值地址

!do 地址  查看参数值

这样问题基本就能找到了  下面看实际操作图

四.解决

好了,看到最后都是停留在字典类的操作上

就是这些对字典的操作导致CPU100%..windbg只能帮你到这里了。调试重要的是思想,不是工具。

可是这些字典的操作,为啥么会导致CPU100% 很平常的操作啊  这时看下源码..发现字典是静态的  这个静态字典做缓存。这是很多人的做法...代码大概都是这样

于是,微微一笑...你们啊,毕竟还是图样图森破..只知道字典做缓存,却不知道这种情况要考虑线程安全么...字典类不是线程安全的 所以导致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 导致的问题 )

Dictionary导致IIS CPU 100%案例分析 学会使用WinDbg工具的更多相关文章

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

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

  2. MySQL Online DDL导致全局锁表案例分析

    MySQL Online DDL导致全局锁表案例分析 我这边遇到了什么问题? 线上给某个表执行新增索引SQL, 然后整个数据CPU打到100%, 连接数暴增到极限, 最后导致所有访问数据库的应用都奔溃 ...

  3. 系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

    系统导出数据到excel,数据量过大(大约10W)条,导致服务器 cpu 100%解决方法

  4. 内存回收导致关键业务抖动案例分析-论云原生OS内存QoS保障

    蒋彪,腾讯云高级工程师,10+年专注于操作系统相关技术,Linux内核资深发烧友.目前负责腾讯云原生OS的研发,以及OS/虚拟化的性能优化工作. 导语 云原生场景,相比于传统的IDC场景,业务更加复杂 ...

  5. MySQL Insert语句单个批次数量过多导致的CPU性能问题分析

    [问题] 最近有台服务器比较频繁的CPU报警,表现的特征有CPU sys占比偏高,大量慢查询,大量并发线程堆积.后面开发对insert的相关业务限流后,服务器性能恢复正常. [异常期间线程处理情况] ...

  6. 数据库sql优化总结之1-百万级数据库优化方案+案例分析

    项目背景 有三张百万级数据表 知识点表(ex_subject_point)9,316条数据 试题表(ex_question_junior)2,159,519条数据 有45个字段 知识点试题关系表(ex ...

  7. 性能分析(3)- 短时进程导致用户 CPU 使用率过高案例

    性能分析小案例系列,可以通过下面链接查看哦 https://www.cnblogs.com/poloyy/category/1814570.html 系统架构背景 VM1:用作 Web 服务器,来模拟 ...

  8. w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法

    对于IIS 管理员来说,经常会碰到 Web 服务器 CPU 占用 100% 的情况,以下是个人的日常工作总结和一些解决办法,主要用来剖析 w3wp.exe(IIS )  占用 CPU 100% 的一些 ...

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

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

随机推荐

  1. Kubernetes集群开启Firewall

    关于端口的官方说明:https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ k8s ...

  2. 18道kafka高频面试题哪些你还不会?(含答案和思维导图)

    前言 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处 ...

  3. MySQL/MariaDB数据库的并发控制

    MySQL/MariaDB数据库的并发控制 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.并发控制概述 1>.什么是并发控制 MySQL是一个服务器级别的数据库,它通常 ...

  4. 万众期待的kintone开发账号免费开放申请啦!

    亲爱的小伙伴们,等了很久很久的kintone开发账号终于可以免费申请使用了! 有人想问了,什么是kintone? kintone是指无需开发知识,即可根据公司业务轻松创建系统的Cybozu的云服务. ...

  5. Linux查看文件指定行数内容

    1.tail date.log               输出文件末尾的内容,默认10行 tail -20  date.log        输出最后20行的内容 tail -n -20  date ...

  6. Python练习——约瑟夫环问题、用类方法描述一个数字时钟

    一.约瑟夫环问题 有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去,有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他 ...

  7. hive日期转换函数2

    转自大神 http://www.oratea.net/?p=944 无论做什么数据,都离不开日期函数的使用. 这里转载一下Hive的日期函数的使用,写的相当完整. 日期函数UNIX时间戳转日期函数: ...

  8. SQL中的trim函数

    Oracle TRIM函数是很常见的函数,下面对Oracle TRIM函数的语法作了详尽的阐述说明,希望可以让您对Oracle TRIM函数有更深的认识. 如果提到Oracle TRIM函数,最简单的 ...

  9. djiango-异步发送邮件--celery

    安装 pip install celery==4.2.0 # celery4.x支持django1.11以上版本 试了好几个版本 就4.2.0能发送成功 1.项目目录里新建一个celery的包cele ...

  10. C++ socket bind() 函数绑定错误

    VS2015编译错误: errorCxxxx: 'initializing' : cannot convert from 'std::_Bind<false,void,SOCKET&,s ...