4

我有一个 Windows 服务器应用程序,使用 Win32 API 在 C++ 中实现,它执行大量串行和 TCP/IP 通信。随着它的运行,CPU 使用率逐渐增加,直到达到 100%。任务管理器表明大部分 (>75%) 的 CPU 使用率是由“系统”进程使用的。如果我杀死我的服务器进程,那么 CPU 使用率就会恢复正常。

是否有任何“简单”的方法可以准确诊断问题所在?

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


更新:玩弄之后xperf,我发现 System 进程有一半以上的时间花在ntoskrnl.exe!KxWaitForSpinLockAndAcquire. 我对此一无所知,但该函数的名称向我表明可能存在死锁/争用问题。

System 经常使用的其他功能包括NETIO.SYS!FilterMatchEnumNETIO.SYS!MatchConditionOverlapNETIO.SYS!IsFilterVisibleMpNWMon.sys!NetFlowUpendByCompletionHandle

4

5 回答 5

3

如果您还没有,我建议您查看sysinternals工具。

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

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

于 2010-07-27T15:10:29.897 回答
2

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

对于您自己的过程:

  • 打开显示句柄计数等的性能选项卡,
  • 打开显示连接的 tcp-ip 选项卡。
  • 还要检查进程资源管理器下半部分的窗格,以查看显示事件、文件等的进程。

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

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

于 2010-07-29T22:36:44.840 回答
1

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

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

于 2010-07-29T22:55:24.897 回答
1

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

于 2010-08-01T17:49:50.897 回答
0

What's your handle count - if that's rising, it would point to something not being closed.

于 2010-07-29T20:23:46.093 回答