近期一項目反饋,在月底時出現某功能反應異常卡頓的情況,總結規律為,只要某個耗時較長的大查詢執行時,被影響的功能就不能正常使用。懷疑出現阻塞問題,先在數據庫層面跟蹤未發現阻塞等異常,跟蹤被影響的功能,發現沒有耗時較長的SQL,但是出現兩個SQL之間時間間隔很長的情況。同時檢查fiddler跟蹤的webservices信息,發現有一個webs持續時間超長。推測可能為應用服務器出現線程阻塞。在問題重現時,抓取w3wp.exe進程dump。分析過程如下:
先檢查是否存在線程阻塞的情況,發現系統當前存在線程阻塞,其中阻塞源為94號線程
根據Tess的解釋:MonitorHeld shows 11. The owner has 1 and then each waiter has 2, so this means we have one owner and 5 waiters. We are synchronizing on a System.Object and the owning thread is thread 94.
檢查線程狀態
發現如下96號線程在等待
打印阻塞源94號線程
查看96號線程堆棧信息,在CalculateEx()出現等待
結合反編譯代碼,檢查發現對應位置處鎖定的粒度太大。。。
https://blogs.msdn.microsoft.com/tess/2006/01/09/a-hang-scenario-locks-and-critical-sections/