我有一个 Windows 服务器应用程序,使用 Win32 API 用 C++ 实现,它执行大量串行和 TCP/IP 通信。随着它的运行,CPU 使用率逐渐增加,直到达到 100%。任务管理器指示大部分 (>75%) CPU 使用率是由“系统”进程执行的。如果我终止了我的服务器进程,那么 CPU 使用率就会恢复正常。
是否有任何“简单”的方法可以准确诊断问题所在?
我怀疑 I/O 连接正在打开并且从未关闭,因此操作系统花费越来越多的时间来为这些请求提供服务,但我想在尝试解决问题之前验证情况是否如此。
更新:在玩弄 xperf
之后,我发现系统进程在 ntoskrnl.exe!KxWaitForSpinLockAndAcquire
上花费了一半以上的时间。 .我对此一无所知,但该函数的名称向我表明可能存在死锁/争用问题。
System 经常使用的其他功能包括 NETIO.SYS!FilterMatchEnum
, NETIO.SYS!MatchConditionOverlap
, NETIO.SYS!IsFilterVisible
, 和 MpNWMon.sys!NetFlowUpendByCompletionHandle
.
最佳答案
我建议查看 sysinternals工具,如果你还没有。
我非常喜欢的一种工具是 Handle工具,它会显示系统中打开的所有文件。
另一个似乎直接适用于您的场景的是 ProcDump ,它允许您在给定进程超过 CPU 使用率的 x% 时转储进程信息。
关于resource-leak - 通过 "System"进程诊断CPU使用率100%的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3344991/