resource-leak - 通过 "System"进程诊断CPU使用率100%的原因

标签 resource-leak xperf

我有一个 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/

相关文章:

java - MTaaS 导致资源泄漏

java - 我的java程序中的资源泄漏

java - 资源泄漏: 'rset' is not closed at this location

java - Java 对象能否判断对它的引用何时超出范围?

windows-7 - Windows 7 中一个进程的 GDI 对象上限是多少?

windows - 使用 wevtutil 安装 WPT list 时出现问题

xperf - 是否需要 DisablePagingExecutive 以允许 xPerf 为在 64 位 Windows 上运行的 32 位应用程序进行堆栈遍历

windows - xperf 调用堆栈跟踪,特定于 dll

windows - XPerfViewer 与新的 Storport Provider?