有一天突然發現生產環境單個服務的執行緒數很多,如下圖所示:
因此我想到了兩個問題,第一:為什麼同時存在這麼多執行緒?第二:執行緒是怎麼產生的?
1:通過windbg分析dump檔案,使用命令!threadpool檢視,可以看到存在大量空閒執行緒:
切換到任意乙個執行緒,我選擇了212這個執行緒,用命令!dumpstack輸出堆疊資訊,可以看到執行緒最後呼叫的是waitforsingleobject,此方法的意思就是等待訊號,觸發執行緒執行。
3:由上可見,是因為存在大量的空閒執行緒,所以顯示執行緒數很多。
因為我用的服務是乙個windows服務,對於乙個windows服務來說,執行緒增多主要有如下幾種原因:
1:qps很高
2:**中使用了task或parallel等物件
因此我檢視了qps情況和task、parallel使用情況。
首先:qps並不高(最高每秒只有30個請求),因此不是qps導致的執行緒數很多。
其次:檢視task使用量,可以看到task使用了345次,paralle使用了34次。這個資料比較多了,因此可以說明是因為task和paralle使用量太大了,導致了執行緒數很多。(因為task和paralle底層都是使用執行緒池執行緒。)
1:通過**進行驗證,**很簡單:
迴圈呼叫task不做任何事情。
單獨呼叫task,讓這個執行緒長時間睡眠。
2:執行程式,用windbg分析,可以看到一共存在12個執行緒,其中乙個正在執行,11個處於空閒狀態。
3:用命令!threads檢視具體資訊,可以看到執行緒9正在執行,執行緒10到執行緒20是空閒執行緒。
4:用命令!dumpstack檢視執行緒9的堆疊,該執行緒呼叫了sleep方法,進行長期睡眠,正好能反應**的實現。
5:用命令!dumpstack檢視執行緒10的堆疊,該執行緒呼叫了waitforsingleobject方法,進入等待狀態,這和生產環境的執行緒狀態是一樣的。
由上可見,task會導致執行緒數很多。
1:服務中存在大量的執行緒是因為程式中大量使用task(paralle)導致的。
另外:釋放執行緒時間間隔不固定,有的時候是1秒多,有的時候18秒多,有的時候是39秒多,有的時候是10多毫秒。我的另一篇文章有介紹(何時**執行緒池中空閒執行緒)
windbg分析dump檔案
1 開啟dump格式檔案 開啟windbg,通過選單 file open crash dump 選擇dump檔案開啟,也可通過cmd開啟dos命令視窗,切換到windbg所在目錄,利用命令 windbg z d lines2009 7 25 22 20 33 900.dmp z表示路徑 圖1.1 利...
windbg分析dump檔案
1 開啟dump格式檔案 開啟windbg,通過選單 file open crash dump 選擇dump檔案開啟,也可通過cmd開啟dos命令視窗,切換到windbg所在目錄,利用命令 windbg z d lines2009 7 25 22 20 33 900.dmp z表示路徑 圖1.1 利...
windbg分析死鎖問題
如下 include include include using namespace std critical section cs db1 critical section cs db2 dword winapi threadproc lpvoid lpparam void main delete...