【发布时间】:2017-05-01 11:02:14
【问题描述】:
我正在尝试分析我用C# 编写的.net 应用程序,它使用了100% 的cpu。应用程序很大,包含大量代码,因此无法提供整个项目代码。我试图为使用 25% CPU(1 个核心)的应用程序线程获取线程堆栈,但我经常得到这个:
ntoskrnl.exe!KeSynchronizeExecution+0x2246
ntoskrnl.exe!KeWaitForMultipleObjects+0x135e
ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9
ntoskrnl.exe!KeWaitForMutexObject+0x373
ntoskrnl.exe!KeStallWhileFrozen+0x1977
ntoskrnl.exe!_misaligned_access+0x13f9
ntoskrnl.exe!KeWaitForMultipleObjects+0x152f
ntoskrnl.exe!KeWaitForMultipleObjects+0xdd9
ntoskrnl.exe!KeWaitForMutexObject+0x373
ntoskrnl.exe!NtWaitForSingleObject+0xb2
ntoskrnl.exe!setjmpex+0x34a3
ntdll.dll!ZwWaitForSingleObject+0xa
KERNELBASE.dll!WaitForSingleObjectEx+0x98
clr.dll!GetMetaDataInternalInterface+0x25b1f
clr.dll!GetMetaDataInternalInterface+0x25ad3
clr.dll!GetMetaDataInternalInterface+0x25a92
clr.dll!GetMetaDataInternalInterface+0x39106
clr.dll!GetMetaDataInternalInterface+0x39a81
clr.dll!GetMetaDataInternalInterface+0x394ad
clr.dll!GetMetaDataInternalInterface+0x39979
clr.dll!GetMetaDataInternalInterface+0x398c1
clr.dll!GetMetaDataInternalInterface+0x3539a
clr.dll!ClrCreateManagedInstance+0x2747
KERNEL32.dll!BaseThreadInitThunk+0x22
ntdll.dll!RtlUserThreadStart+0x34
- 谁能向我解释为什么带有这个调用堆栈的线程会消耗 1 个核心 我的CPU?
- “KeSynchronizeExecution”是什么意思?
- 在这种情况下如何避免 CPU 使用率过高?
【问题讨论】:
-
这个堆栈跟踪的质量很差,当你想看到机器的灵魂时,获取操作系统的PDB是非常重要的。工具 > 选项 > 调试 > 符号 > 勾选“Microsoft 符号服务器”并选择符号缓存目录。 Fwiw,此跟踪没有显示任何关于性能问题的体面提示,WaitForSingleObjectEx() 是一个阻塞线程的同步函数。到目前为止,最好的办法是使用分析器,这样您就可以看到昂贵的代码。
标签: c# .net multithreading profiling