2016-10-04 103 views
0

我的應用程序(網頁API)與高CPU的痛苦,同時分析轉儲,我看到我的大部分線程都有這個dumpstack - !WinDbg的崩潰轉儲分析,CPU佔用率過高 -

Child-SP   RetAddr   Caller, Callee 
00000030497bec00 00007ffbb19e1118 KERNELBASE!WaitForSingleObjectEx+0x94, 

    calling ntdll!NtWaitForSingleObject 
    00000030497beca0 00007ffba8375dda clr!CLRSemaphore::Wait+0xee, calling kernel32!WaitForSingleObjectEx 
    00000030497becd0 00007ffba837345d clr!GCCoop::GCCoop+0xe, calling clr!GetThread 
    00000030497bed60 00007ffba8375842 clr!ThreadpoolMgr::WorkerThreadStart+0x482, calling clr!CLRSemaphore::Wait 
    00000030497bee00 00007ffba8393e1e clr!Thread::intermediateThreadProc+0x7d 
    00000030497bee30 00007ffbb19e1f86 KERNELBASE!ConsoleCallServerGeneric+0xf2, calling KERNELBASE!_security_check_cookie 
    00000030497bee50 00007ffbb45011a5 ntdll!RtlpLowFragHeapAllocFromContext+0x355, calling ntdll!memset 
    00000030497beed0 00007ffbb450d0c6 ntdll!LdrpGetProcedureAddress+0x66, calling ntdll!RtlImageNtHeaderEx 
    00000030497bef50 00007ffbb450c6f5 ntdll!LdrpResolveNonStaticDependency+0x1cd, calling ntdll!LdrpDereferenceNode 
    00000030497befd0 00007ffbb4500d07 ntdll!RtlAllocateHeap+0xd7, calling ntdll!RtlpLowFragHeapAllocFromContext 
    00000030497bf000 00007ffbb45011a5 ntdll!RtlpLowFragHeapAllocFromContext+0x355, calling ntdll!memset 
    00000030497bf020 00007ffbb450f5f3 ntdll!LdrGetProcedureAddressForCaller+0x153, calling ntdll!_security_check_cookie 
    00000030497bf030 00007ffb93fc8c84 mfc120u!DllMain+0x210, calling mfc120u!__security_check_cookie 
    00000030497bf080 00007ffba8ce2cbb mscoreei!operator delete+0x34, calling kernel32!HeapFreeStub 
    00000030497bf0d0 00007ffbb4500d07 ntdll!RtlAllocateHeap+0xd7, calling ntdll!RtlpLowFragHeapAllocFromContext 
    00000030497bf140 00007ffbb4500d07 ntdll!RtlAllocateHeap+0xd7, calling ntdll!RtlpLowFragHeapAllocFromContext 
    00000030497bf180 00007ffbac0c51bd gzip!DllMainCRTStartup+0x139, calling gzip!DllMain 
    00000030497bf1e0 00007ffb979dbc9d clrcompression!calloc_impl+0x5d, calling ntdll!RtlAllocateHeap 
    00000030497bf210 00007ffb979d8eff clrcompression!initptd+0xb7, calling clrcompression!unlock 
    00000030497bf230 00007ffbb44ebf57 ntdll!RtlDeactivateActivationContextUnsafeFast+0xc7, calling ntdll!_security_check_cookie 
    00000030497bf240 00007ffb979d7919 clrcompression!CRT_INIT+0x135, calling kernel32!GetCurrentThreadId 
    00000030497bf270 00007ffb979d7a0e clrcompression!__DllMainCRTStartup+0x8a, calling clrcompression!DllMain 
    00000030497bf280 0000000056b32052 msvcr100!_initptd+0xaa, calling msvcr100!_unlock 
    00000030497bf2a0 00007ffbac051779 IitTlsCleanupHelper!UnregisterTLSCleanupCallback+0x679, calling IitTlsCleanupHelper!UnregisterTLSCleanupCallback+0xf0 
    00000030497bf2b0 0000000056b31308 msvcr100!__CRTDLL_INIT+0x16c, calling msvcr100!_CrtEndBoot 
    00000030497bf2d0 00007ffbb450bee8 ntdll!LdrpReleaseModuleEnumLock+0x1c, calling ntdll!RtlReleaseSRWLockShared 
    00000030497bf2e0 00007ffbb44ec0f4 ntdll!LdrpCallInitRoutine+0x4c 
    00000030497bf300 00007ffbb450be9b ntdll!LdrpReleaseLoaderLock+0x27, calling ntdll!LdrpReleaseModuleEnumLock 
    00000030497bf340 00007ffbb44ebe53 ntdll!LdrpInitializeThread+0x1f3, calling ntdll!LdrpReleaseLoaderLock 
    00000030497bf3b0 00007ffbb44ebd93 ntdll!LdrpInitializeThread+0x133, calling ntdll!RtlActivateActivationContextUnsafeFast 
    00000030497bf3b8 00007ffbb44ebdc6 ntdll!LdrpInitializeThread+0x166, calling ntdll!RtlDeactivateActivationContextUnsafeFast 
    00000030497bf420 00007ffbb44e8d73 ntdll!_LdrpInitialize+0x93, calling ntdll!NtTestAlert 
    00000030497bf490 00007ffbb44e8c98 ntdll!LdrInitializeThunk+0x18, calling ntdll!NtContinue 
    00000030497bf900 00007ffba8393e07 clr!Thread::intermediateThreadProc+0x66, calling clr!_chkstk 
    00000030497bf940 00007ffbb43613d2 kernel32!BaseThreadInitThunk+0x22 
    00000030497bf970 00007ffbb44e54e4 ntdll!RtlUserThreadStart+0x34 

我的疑問是在這3行 - :

ntdll!RtlAllocateHeap+0xd7, calling ntdll!RtlpLowFragHeapAllocFromContext 
00000030497bf140 00007ffbb4500d07 ntdll!RtlAllocateHeap+0xd7, calling ntdll!RtlpLowFragHeapAllocFromContext 
00000030497bf180 00007ffbac0c51bd gzip!DllMainCRTStartup+0x139, calling gzip!DllMain 

該線程可以導致高CPU使用率?

+1

我已經跑!失控的命令,這是一個堆棧跟蹤..他們是很多線程具有相同的堆棧跟蹤..只是試圖瞭解這個堆棧跟蹤試圖告訴什麼..雖然我懷疑,這個線程是cpu使用的罪魁禍首.. – user3359453

+0

是的。這是否回答你的問題?線程在CPU上執行,所以它是使用CPU時間和高CPU的線程。與記憶相反。內存不在CPU上執行,因此不會導致高CPU故障。也許你想重新解釋這個問題來得到一個符合你需求的答案。 –

+1

WinDbg是一個很棒的工具,但是imo不是這份工作的正確工具。它只能給你關於某個特定時間點的信息。爲了更好地瞭解你的應用程序在做什麼,你應該使用類似ETW *(或procmon)*的東西,並從那裏得出結論。也就是說,你似乎在壓縮某些東西,所以我希望*高CPU。 –

回答

1

您要運行的第一個WinDBG命令是:!runaway
該命令將顯示哪個線程使用CPU的時間最長。
收到此命令的輸入後,我們可以思考發生了什麼...

+0

如果!失控使用率很高,那麼線程可能會做一些與高CPU原因完全無關的事情。失控導致許多誤報。 –

+1

@Thomas:!runaway顯示哪個線程使用CPU的時間最長,從應用程序的開始到整個一段時間。如果你的可執行文件是CPU的話,那麼!失控應該會向你展示列表開頭最有問題的線程,這將幫助你分析你正在做的密集任務。我多次使用它,從未遇到誤報。 – PazO

+0

那麼你很幸運,你在當前執行正確堆棧的時候捕獲了狀態。 !失控者可能會報告3天前活躍的線索,目前無所作爲。 –

2

Windbg不適合這份工作。轉儲只是快照,因此您不知道之前發生了什麼。使用ETW,這裏是CPU採樣,它彙總所有調用並詳細顯示CPU使用情況。

安裝Windows性能工具包,其是Windows 10 SDK的一部分(V1607 works上的Win8/8.1(Server2012/R2)和Win10或V1511 SDK如果您使用Windows 7/Server2008R2)),運行WPRUi.exe和選擇CPU Usage

enter image description here

並按下Start。捕獲1分鐘的高CPU使用率,然後點擊Save。打開與WPA.exe(逆足分析儀),拖動所產生的ETL和CPU Usage (Sampled)圖形拖放到觀窗格

enter image description here

load the Debug Symbols。現在在圖表中選擇你的過程,放大和展開堆棧,在這裏你看到所有調用的CPU使用的權重

在本示例中,Internet Explorer中大多數CPU使用率來自HTML東西。

對於.NET應用程序WPA顯示你的.NET相關分組像GC或JIT:

enter image description here

+1

問題在生產環境中,支持不允許安裝工具。 – user3359453

+0

支持最有可能不知道ETW是什麼。向他們解釋這是微軟用來排除系統故障的方法[包括生產系統](https://blogs.technet.microsoft.com/robertsmith/2012/02/07/analyzing-storage-performance-using-the-windows - 表演分析的工具包-WPT /)。如果您仍然不允許xcopy啓動跟蹤所需的文件,我會將案件交給他們或詢問他們的偏好是什麼:添加您自己的重量級日誌記錄以進一步分析問題或使用輕量級內置日誌記錄微軟提供的。 –

+0

感謝您的回覆..我今天將通過ETW .. – user3359453

-1

任何分析後設置正確的符號路徑。
設置在文件 - >符號文件路徑菜單: YOUR_SYMBOLS_PATH; OTHERS_PATH; SRV C:\ symcachehttp://msdl.microsoft.com/download/symbols

試試這個命令來查看管理堆棧:

 
.cordll -ve -u -l 
ld* 
!EEStack 

+0

您看到什麼好處!EEStack結束!DumpStack?如何解決性能問題? –

+0

用於顯示可能導致問題根源的一些相關信息。對於那些通常調查崩潰的人來說,這很重要。 – lsalamon