優化執行緒池

2022-02-10 12:43:04 字數 1270 閱讀 8293

執行緒池初始時其池內只有乙個執行緒。隨著任務的分配,執行緒池管理器就會向池內「注入」新執行緒來滿足工作負荷的需要,直到最大數量的限制。在足夠的非活動時間之後,執行緒池管理器在認為「**」一些執行緒能夠帶來更好的吞吐量時進行執行緒**。

可以通過呼叫threadpool.setmaxthreads方法來設定執行緒池可以建立的執行緒上限;預設如下:

(這些數字可能根據硬體和作業系統不同而有差異。)數量這麼多是因為要確定阻塞(等待一些條件,比如遠端計算機的相應)的執行緒的條件是否被滿足。

也可以通過threadpool.setminthreads設定執行緒數量下限。下限的作用比較奇妙:它是一種高階的優化技術,用來指示執行緒池管理器在達到下限之前不要延遲線程的分配。當存在阻塞執行緒時,提高下限可以改善程式併發性。

預設下限數量是 cpu 核心數,也就是能充分利用 cpu 的最小數值。在伺服器環境下(比如 iis 中的 asp.net),下限數量一般要高的多,差不多 50 或者更高。

最小執行緒數量是如何起作用的?

將執行緒池的最小執行緒數設定為 x 並不是立即建立至少 x 個執行緒,而是執行緒會根據需要來建立。這個數值是指示執行緒池管理器當需要的時候,立即建立 x 個執行緒。那麼問題是為什麼執行緒池在其它情況下會延遲建立執行緒?

答案是為了防止短生命週期的任務導致執行緒數量短暫高峰,使程式的記憶體足跡(memory footprint)快速膨脹。為了描述這個問題,考慮在乙個 4核的計算機上執行乙個客戶端程式,它一次發起了 40 個任務請求。如果每個任務都是乙個 10ms 的計算,假設它們平均分配在 4 個核心上,總共的開銷就是 100ms 多。理想情況下,我們希望這 40 個任務執行在 4 個執行緒上:

執行緒池就是以這種方式工作的。讓執行緒數量和 cpu 核心數量匹配,就能夠既保持小的記憶體足跡,又不損失效能。當然這也需要執行緒都能被充分使用(在這個例子中滿足該條件)。

但是,現在來假設任務不是進行 10ms 的計算,而是請求網際網路,使用半秒鐘等待響應,此時本地 cpu 是空閒狀態。執行緒池管理器的執行緒經濟策略(譯者注:指上面說的執行緒數量匹配核心數)這時就不靈了,應該建立更多的執行緒,讓所有的請求同時進行。

幸運的是,執行緒池管理器還有乙個後備方案。如果在半秒內沒有能夠響應請求佇列,就會再建立乙個新的執行緒,以此類推,直到執行緒數量上限。

threadpool.setminthreads (50, 50);

(第二個引數是表示多少個執行緒分配給 i/o 完成埠(i/o completion ports,iocp),來被apm使用

最小執行緒數量的預設值是 cpu 核心數。

執行緒池執行緒數量優化設計

實際編碼過程中,不能一味的只進行執行緒池優化效能而不關注具體的設計細節。執行緒池執行緒數量需要根據實際專案中任務數量等進行乙個估算,使得系統的設計效能趨近於我們所想的方向,而不是隨便給乙個數值,但是不進行系統的最大瓶頸的控制。廢話不多說 轉個比較詳細的效能估算思路 jdk1.5中引入了強大的conc...

C 執行緒 入門 優化執行緒池

優化執行緒池 執行緒池從其池中的乙個執行緒開始。分配任務後,池管理器會 注入 新執行緒以應對額外的併發工作負載 最大限制 在足夠長時間的不活動之後,如果池管理器懷疑這樣做會導致更好的吞吐量,則可以 退出 執行緒。您可以通過呼叫threadpool.setmaxthreads 來設定池將建立的執行緒的...

3 2 7 優化執行緒池執行緒數量

執行緒池的大小對系統的效能有一定的影響。過大或者過小的執行緒數量都無法發揮到最優的系統效能。只要避免執行緒池的過大或者過小,那麼一把來說執行緒池對系統的效能影響不大。我經常參考的執行緒池大小的經驗公式 ncpu cpu的數量 ucpu 目標cpu的使用率,0 ucpu 1 w c 等待的時間與計算的...