用“系统”过程诊断100%CPU使用率的原因

时间:2010-07-27 15:06:19

标签: resource-leak xperf

我有一个Windows服务器应用程序,使用Win32 API在C ++中实现,可以进行大量的串行和TCP / IP通信。在运行时,CPU使用率逐渐增加,直到达到100%。任务管理器指示大多数(> 75%)的CPU使用率来自“系统”过程。如果我终止了我的服务器进程,那么CPU使用率将恢复正常。

有没有“简单”的方法可以准确诊断出问题所在?

我怀疑I / O连接正在打开并且从未关闭,因此操作系统花费越来越多的时间来处理这些请求,但我想在我尝试解决问题之前验证是这种情况。 / p>


更新:在使用xperf后,我发现系统进程花费的时间超过ntoskrnl.exe!KxWaitForSpinLockAndAcquire的一半。我对此一无所知,但函数的名称告诉我可能存在死锁/争用问题。

系统正在使用的其他功能包括NETIO.SYS!FilterMatchEnumNETIO.SYS!MatchConditionOverlapNETIO.SYS!IsFilterVisibleMpNWMon.sys!NetFlowUpendByCompletionHandle

5 个答案:

答案 0 :(得分:3)

如果您尚未使用,我建议您查看sysinternals工具。

我非常喜欢的一个工具是Handle工具,它会显示系统中打开的所有文件。

另一个似乎直接适用于您的方案的是ProcDump,它允许您在给定进程超过CPU使用率的x%时转储进程信息。

答案 1 :(得分:2)

使用进程资源管理器,但打开您自己的进程而不是系统进程。系统进程可能只是响应您的请求。由于你没有它的代码,你将很难知道它正在做什么

适用于您自己的流程:

  • 打开显示的效果标签 句柄计数等,
  • 打开显示的tcp-ip选项卡 连接。
  • 同时检查窗格 这个过程的下半部分 探索器为您的过程显示 事件,文件等..

希望您可以从其中一个中看到过度使用的资源。

Portmon也值得一试,看看活动是否符合预期。

答案 2 :(得分:1)

我建议使用sysinternal的Process MonitorPortmon,它们应该显示TCP连接和串口活动的状态。

如果您发现它与CPU使用率之间存在相关性,那么您就有了良好的领先优势。

答案 3 :(得分:1)

用户转储。在这种情况下获取进程的用户转储。然后在winDbg中加载转储并查看它在做什么。一个非常有用的命令是!失控。这将告诉您哪些线程使用的CPU最多。然后看看那些线程,看看他们在做什么。

答案 4 :(得分:0)

你的手柄数是多少 - 如果它上升,它会指向一些未被关闭的东西。