作者:Jim Cheshire
此疑难解答中使用的工具:
- 调试诊断1.2
- 性能监视器
此材料仅供参考。Microsoft不作任何明示或暗示的保证。
概观
此问题排查工具将帮助您识别IIS应用程序池中持续存在的高CPU的原因。重要的是要记住,随着Web应用程序提供请求,CPU使用率正常增加。但是,如果您始终认为CPU长时间保持在高水平(在80%或更高的区域),您的应用程序的性能将会受到影响。因此,了解持续高CPU的原因很重要,以便可以解决和纠正
脚本
IIS中的应用程序池遇到长时间超过90%的高CPU。当测试应用程序时,不会遇到任何问题。然而,一旦应用程序遇到实际的用户负载,CPU将爬升到很高的百分比并保持不变。要恢复,应该重新启动应用程序池,但是在这样做之后,CPU再次爬上高层。
数据采集
遇到高CPU时,首先应该做的是确定正在消耗CPU的进程。您可以使用任务管理器中的进程选项卡来执行此操作。确保您检查显示所有用户的进程复选框。图1显示了此框,并显示了w3wp.exe进程(承载IIS应用程序池的进程),消耗高级别的CPU。
图1 - 任务管理器显示高CPU。
您还可以使用性能监视器来确定使用CPU的进程。有关使用性能监视器的更多信息,请参阅此故障排除程序中稍后分析性能数据。
小费
如果您需要确定哪个应用程序池与特定的w3wp.exe进程相关联,请打开管理命令提示符,切换到该%windir%\System32\inetsrv文件夹cd %windir%\System32\inetsrv并运行appcmd list wp。这将以引号显示w3wp.exe进程的进程标识符(PID)。您可以将该PID与任务管理器中可用的PID相匹配。
一旦您确认w3wp.exe进程遇到高CPU,您将需要收集两条信息,以确定导致问题的原因。
- 性能监视器数据收集器集。
- w3wp.exe进程的用户模式内存转储。
这些都将需要在高CPU事件期间收集。
收集性能监视器数据收集器集
性能监视器(Perfmon)数据对于确定高CPU问题的原因往往至关重要。获取应用程序执行的“大图”视图也是非常有用的。
可以实时查看Perfmon数据,也可以将其收集到数据收集器集中,以便稍后进行查看。为了排除高CPU问题,我们需要收集数据收集器集。要创建用于排除高CPU故障的数据收集器集,请按照下列步骤操作。
- 从Windows控制面板打开管理工具。
- 双击性能监视器。
- 展开“数据收集器集”节点。
- 右键单击“用户定义”,然后选择“新建”,“数据收集器集”。
- 输入高CPU作为数据采集器的名称。
- 选择手动创建(高级)单选按钮。
- 点击下一步。
- 选择创建数据日志单选按钮。
- 检查性能计数器复选框。
- 点击下一步。
-
单击添加按钮。
如果您的应用程序不是ASP.NET应用程序,请继续执行步骤19。
- 滚动到计数器列表的顶部,然后选择.NET CLR内存。
- 在实例列表中,选择
。 - 单击添加按钮将计数器添加到添加的计数器列表。
- 从计数器列表中选择ASP.NET,然后单击添加。
- 从计数器列表中选择ASP.NET应用程序。
- 从实例列表中选择
。 - 单击添加。
- 从计数器列表中展开“处理”。(确保展开Process而不是处理器。)
- 从Process对象中选择%Processor Time。
- 从实例列表中选择
。 - 单击添加。
- 从计数器列表中展开线程。
- 从Thread对象中选择%Processor Time。
- 从实例列表中选择
。 - 单击添加。
- 从实例列表中选择ID线程。
- 单击添加。
您的对话框现在应该如图2所示。
图2 - 创建数据收集器集。
单击确定按钮,然后单击下一步按钮。记下保存数据收集器的位置。(如果需要,可以更改此位置。)然后单击完成。
数据收集器集尚未运行。要启动它,请右键单击用户定义节点下的高CPU,然后从菜单中选择开始。
创建调试诊断1.2规则
发生高CPU状况时收集用户模式进程转储的最简单方法是使用Debug Diagnostics 1.2或DebugDiag。您可以从以下URL下载DebugDiag。
https://www.microsoft.com/download/en/details.aspx?id=26798
在您的服务器上安装DebugDiag 1.2并运行它。(安装后您将在开始菜单中找到它。)运行DebugDiag时,将显示“选择规则类型”对话框。按照以下步骤为应用程序池创建崩溃规则。
- 选择性能并单击下一步。
- 选择性能计数器,然后单击下一步。
- 单击添加Perf触发器。
- 展开Processor(而不是Process)对象并选择%Processor Time。请注意,如果您在Windows Server 2008 R2上,并且有超过64个处理器,请选择Processor Information对象而不是Processor对象。)
- 在实例列表中,选择_Total。
- 单击添加,然后单击确定。
- 选择新添加的触发器,然后单击编辑阈值,如图3所示。
- 在下拉列表中选择上方。
- 将阈值更改为80。
- 输入20秒的秒数。(如果需要,您可以调整此值,但请注意不要指定少量秒钟以防止发生错误触发。)
- 单击确定。
- 点击下一步。
- 单击添加转储目标。
- 从下拉列表中选择Web应用程序池。
- 从应用程序池列表中选择您的应用程序池。
- 单击确定。
- 点击下一步。
- 再次点击下一步。
- 如果您希望输入规则的名称,并记下要保存转储的位置。如果需要,您可以更改此位置。
- 点击下一步。
- 选择激活规则,然后单击完成。
小费
您可以使用与步骤13-15中使用相同的技术添加多个转储目标来创建多个应用程序池的转储。
图3 - 在DebugDiag中添加perf触发器。
此规则将创建11个转储文件。前10名将是“小型转储”,规模相当小。最后的转储将是一个具有完整内存的转储,并且转储将会更大。
一旦发生高CPU问题,您将要停止收集数据的Perfmon数据收集器集。为此,请右键单击用户定义节点下列出的高CPU数据收集器集,然后选择停止。
数据分析
在高CPU事件之后,您将有两组要查看的数据; Perfmon数据收集器集和内存转储。我们先来看一下Perfmon的数据。
分析性能数据
要查看您的问题的Perfmon数据,请右键单击用户定义节点下列出的高CPU数据收集器集,然后选择最新报告。您会看到类似于图4所示的屏幕。
图4 - Perfmon显示高CPU数据。
首先要删除所有当前的计数器,以便您可以添加要查看的显式计数器。选择列表中的第一个计数器。然后滚动到列表的底部,然后在按住键盘上的Shift键的同时单击最后一个计数器。选择所有计数器后,按键盘上的Delete键将其删除。
现在使用这些步骤添加Process /%Processor Time计数器。
- 右键单击Perfmon右窗格中的任意位置,然后选择添加计数器。
- 展开Process对象。
- 从列表中选择%Processor Time。
- 从实例列表中选择
。 - 单击添加。
- 单击确定。
现在将显示一个显示数据收集器集运行时计算机上每个进程使用的处理器时间的图形。隔离哪个进程使用最高级别CPU的最简单的方法是启用Perfmon的高亮功能。
为此,请选择列表中的第一个计数器,然后按Ctrl + H。完成此操作后,所选的过程将在图形上显示为粗体黑线。
使用键盘上的向下箭头向下移动进程列表,直到找到显示最多CPU使用率的进程。在图5中,您可以清楚地看到w3wp.exe进程在计算机上使用了大量的CPU。这证实IIS应用程序池在计算机上造成高CPU利用率。
图5 - 显示w3wp.exe的CPU使用情况的Perfmon。
小费
Perfmon可以在确定应用程序中的性能问题方面非常有用。Perfmon日志中收集的数据可以显示您正在执行的请求数量(使用ASP.NET和ASP.NET应用程序对象),还可以向您显示有关应用程序执行情况的其他重要性能数据。
要解决导致高CPU问题的根源,我们来看看使用DebugDiag创建的转储。
使用DebugDiag进行转储分析
DebugDiag可以通过进行自动转储分析来识别许多问题。对于这个特殊问题,DebugDiag的性能分析器非常适合帮助确定高CPU问题的根本原因。要使用分析仪,请按照下列步骤操作
- 选择DebugDiag中的Advanced Analysis选项卡。
- 选择性能分析仪。
- 单击添加数据文件。
- 浏览到创建转储的位置。默认情况下,这将是文件夹的子C:\Program Files\DebugDiag\Logs文件夹。
- 选择一个转储,然后按Ctrl + A选择该文件夹中的所有转储。
- 单击打开。
- 单击开始分析。
DebugDiag将需要几分钟的时间来解析转储并提供分析。完成分析后,您将看到类似于图6所示的页面。
图6 - DebugDiag分析报告。
请注意,报告的顶部告诉您检测到高CPU。在右栏中,您会看到建议,其中包括平均CPU时间前7位线程的链接。点击该链接,您将看到有关这些顶级CPU消费者在做什么的信息。图7显示了我的应用程序中这些线程正在做什么。
图7 - 高CPU线程的详细信息。
从此分析可以看出,FastApp应用程序中的default.aspx页面正在运行。如果我进一步向下调用堆栈(在页面的底部),我可以看到这个线程正在进行字符串连接。(请注意在调用堆栈上调用System.String.Concat。)如果我分析其他顶级的CPU线程,我看到相同的模式。
下一步是查看FastApp应用程序的default.aspx页面中的Page_Load事件。当我这样做,我找到以下代码。
htmlTable += "<table>";
for (int x = 0; x < 5000; x++)
{ htmlTable += "" + "<td>" + "Cell A" + x.ToString() + "td>";
htmlTable += "<td>" + "Cell B" + x.ToString() + "td>" + "tr>";
}
htmlTable += "table>";
这种代码肯定会导致CPU高。有关详细信息,请参阅Microsoft知识库中的https://support.microsoft.com/kb/307340。
结论
通过使用Perfmon和DebugDiag,您可以轻松收集有助于确定应用程序池中高CPU的原因的数据。如果您无法使用这些技术找到根本原因,您可以通过https://support.microsoft.com/与Microsoft打开支持票据,我们可以帮助您确定问题的原因。当您打开案例时,通过将Perfmon数据和转储准备给我们,您将大大减少我们协助您所需的时间。
其他资源
- 排除高CPU利用率
- 排除高CPU性能问题
- 什么收集排除高CPU或挂起
- .NET调试演示
- IIS工作进程性能监控提示
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29063131/viewspace-2145747/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/29063131/viewspace-2145747/