我正在尝试分析使用.net
编写的C#
应用程序,该应用程序使用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
答案 0 :(得分:1)
试着在这里帮助你,我不是专家。
ntoskrnl.exe!KeSynchronizeExecution 例程将指定例程的执行与分配给一组一个或多个中断对象的中断服务例程(ISR)同步。
ntoskrnl.exe!KeWaitForMultipleObjects 例程将当前线程置于可警告或不可退出的等待状态,直到任何或所有调度程序对象设置为信号状态或(可选)直到等待时间。
ntoskrnl.exe!KeWaitForMutexObject 例程将当前线程置于可警告或不可退出的等待状态,直到给定的互斥对象设置为信号状态或(可选)直到等待超时。 / p>
我认为在等待多个对象例程未解析时会调用 ntoskrnl.exe!KEStallWhileFrozen 例程。
ntoskrnl.exe!_misaligned_access 例程是cpu无法读取未对齐数据时的警报。似乎未对齐的内存访问会对在硬件中不支持它们的目标造成巨大的性能损失。参考:https://msdn.microsoft.com/en-us/library/ms253949(v=vs.80).aspx。另请参阅“避免对齐错误”部分。
ntoskrnl.exe!NtWaitForSingleObject 等待指定的对象达到信号状态。
对 setjmp 函数的调用会保存当前指令地址以及其他CPU寄存器。随后对 longjmp 函数的调用将恢复指令指针和寄存器,并在setjmp调用之后的点恢复执行。
ntdll.dll!ZwWaitForSingleObject 例程等待,直到指定的对象达到Signaled状态。还可以指定可选的超时。
KERNELBASE.dll!WaitForSingleObjectEx 等待指定的对象处于信号状态,I / O完成例程或异步过程调用(APC)排队到线程或超时间隔过去了。
clr.dll!GetMetaDataInternalInterface 获取一个指向内部接口实例的指针,该实例用于在内存中读取和写入元数据。
答案 1 :(得分:0)
之前我使用过Jetbrains解决方案。它可以很容易地找到优化点。我的建议使用:https://www.jetbrains.com/profiler/并找出哪些进程和方法使用率高的cpu。你也可以找到记忆等。
我知道你可以安装试用版。安装试用版并解决您的问题。