如果Web应用程序经常遇到的问题按频率排名的话,我觉得
第一名unhandled exception
第二名high memory
第三名high cpu
这篇文章介绍web应用程序中cpu使用率过高问题相应的数据收集方式和调试问题的方法。
对ASP.NET Web应用程序CPU使用率过高的问题,从宏观上分分类,大概就这么几种情况,
- 大量请求
- 过多循环
- GC频繁
数据收集
收集性能计数
通过以下命令行创建性能计数信息,该命令的意思是在系统性能计数器里面添加以下性能计数分类中的所有计数器,生成的日志大小最大为500M,达到该上限计数会停止,采样时间间隔为15秒,生成的日志存放在c:\PerfLog\Perf-15Sec.blg文件中。
Processor
Memory
Process
Asp.NET
ASP.NETApplications
.NET CLRExceptions
.NET CLRMemory
.NET CLRLoading
logman.execreate counter Perf-15Sec -f bincirc -max 500 -c "\Processor(*)\*""\Memory\*" "\Process(*)\*" "\ASP.Net(*)\*" "\ASP.Net Applications(*)\*" "\.NET CLRExceptions(*)\*" "\.NET CLR Memory(*)\*" "\.NET CLRLoading(*)\*" -si 00:00:15 -o C:\PerfLog\Perf-15Sec.blg
重现该问题前通过如下命令开始计数,
logman.exestart Perf-15Sec
重现问题后通过如下计数停止计数。
logman.exe stop Perf-15Sec
收集Full User Dump
收集性能计数能够从统计信息的角度对问题进行大概的定位,如果要查看程序内部逻辑,需要收集user dump,通过调试器查看程序详细信息。
收集dump的工具较多,对于high cpu的问题可以选择以下几种,其中Procdump是专门针对high cpu问题而设计,命令和节奏控制比较简单,推荐使用。
Procdump
下载地址
http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx
在命令行里面运行以下命令,意思是当目标进程 w3wp的CPU使用率高于80%连续超过10秒钟的时候,连续收集三个dump到目标路径c:\dump目录下。参数需要根据需要自行调整。
procdump -c 80 -s 10 -n 3 -o w3wpc:\dump
Debug Diag
下载地址
http://www.microsoft.com/en-us/download/details.aspx?id=26798
DebugDiag有图形界面,可以配置类似的参数规则来抓取不同类型的dump。比如抓进程高cpu使用率的情况。
添加一个performnce规则,按照cpu的performance counter来添加相应的参数。(可以添加多种条件)
Adplus
Adplus包含在windbg安装包中,
下载地址
http://www.microsoft.com/en-us/download/details.aspx?id=8279
在问题发生的时候,打开命令行执行以下命令,
adplus -hang -pnw3wp.exe -quiet
问题调试
调试high cpu的问题就是要弄清楚cpu时间都花在了什么地方。CPU使用率就是一个统计数据,在采样时间内cpu忙的时间所占的百分比。
如何查看cpu时间具体花在了什么地方?
首先我们要弄清楚是哪个或者哪几个进程占用了cpu的处理时间。我们看到机器的cpu使用率偏高,一般都是注意到机器整体的使用率,这个时候性能计数可以帮助我们定位high cpu的进程都有哪些。
打开日志查看process/processortime对于各个进程不同数值,就可以看出来在特定时间哪个进程在占用cpu资源。
确定了进程后,要看进程中到底在做什么。我们研究的是asp.net web应用程序,这里假设发现w3wp进程占用了大量的cpu资源。
接下来我们要搞清楚,我们的cpu资源使用大概落在我们之前分类的那一种或者几种类型中。
大量请求
请求过多的情况一般表现为
-
大量工作线程在运行
-
Queue 中存在未处理的请求