我有一个Windows服务器应用程序,使用Win32 API在C ++中实现,可以进行大量的串行和TCP / IP通信。在运行时,CPU使用率逐渐增加,直到达到100%。任务管理器指示大多数(> 75%)的CPU使用率来自“系统”过程。如果我终止了我的服务器进程,那么CPU使用率将恢复正常。
有没有“简单”的方法可以准确诊断出问题所在?
我怀疑I / O连接正在打开并且从未关闭,因此操作系统花费越来越多的时间来处理这些请求,但我想在我尝试解决问题之前验证是这种情况。 / p>
更新:在使用xperf
后,我发现系统进程花费的时间超过ntoskrnl.exe!KxWaitForSpinLockAndAcquire
的一半。我对此一无所知,但函数的名称告诉我可能存在死锁/争用问题。
系统正在使用的其他功能包括NETIO.SYS!FilterMatchEnum
,NETIO.SYS!MatchConditionOverlap
,NETIO.SYS!IsFilterVisible
和MpNWMon.sys!NetFlowUpendByCompletionHandle
。
答案 0 :(得分:3)
如果您尚未使用,我建议您查看sysinternals工具。
我非常喜欢的一个工具是Handle工具,它会显示系统中打开的所有文件。
另一个似乎直接适用于您的方案的是ProcDump,它允许您在给定进程超过CPU使用率的x%时转储进程信息。
答案 1 :(得分:2)
使用进程资源管理器,但打开您自己的进程而不是系统进程。系统进程可能只是响应您的请求。由于你没有它的代码,你将很难知道它正在做什么
适用于您自己的流程:
希望您可以从其中一个中看到过度使用的资源。
Portmon也值得一试,看看活动是否符合预期。
答案 2 :(得分:1)
我建议使用sysinternal的Process Monitor和Portmon,它们应该显示TCP连接和串口活动的状态。
如果您发现它与CPU使用率之间存在相关性,那么您就有了良好的领先优势。
答案 3 :(得分:1)
用户转储。在这种情况下获取进程的用户转储。然后在winDbg中加载转储并查看它在做什么。一个非常有用的命令是!失控。这将告诉您哪些线程使用的CPU最多。然后看看那些线程,看看他们在做什么。
答案 4 :(得分:0)
你的手柄数是多少 - 如果它上升,它会指向一些未被关闭的东西。