我有一个 Windows 服务器应用程序,使用 Win32 API 在 C++ 中实现,它执行大量串行和 TCP/IP 通信。随着它的运行,CPU 使用率逐渐增加,直到达到 100%。任务管理器表明大部分 (>75%) 的 CPU 使用率是由“系统”进程使用的。如果我杀死我的服务器进程,那么 CPU 使用率就会恢复正常。
是否有任何“简单”的方法可以准确诊断问题所在?
我怀疑 I/O 连接正在打开并且从未关闭,因此操作系统花费越来越多的时间来服务这些请求,但我想在尝试解决问题之前验证情况是否如此。
更新:玩弄之后xperf
,我发现 System 进程有一半以上的时间花在ntoskrnl.exe!KxWaitForSpinLockAndAcquire
. 我对此一无所知,但该函数的名称向我表明可能存在死锁/争用问题。
System 经常使用的其他功能包括NETIO.SYS!FilterMatchEnum
、NETIO.SYS!MatchConditionOverlap
、NETIO.SYS!IsFilterVisible
和MpNWMon.sys!NetFlowUpendByCompletionHandle
。