如何合理設定執行緒池大小

2021-09-08 14:13:10 字數 1429 閱讀 4326

要想合理的配置執行緒池的大小,首先得分析任務的特性,可以從以下幾個角度分析:

任務的性質:cpu密集型任務、io密集型任務、混合型任務。

任務的優先順序:高、中、低。

任務的依賴性:是否依賴其他系統資源,如資料庫連線等。

性質不同的任務可以交給不同規模的執行緒池執行。

對於不同性質的任務來說,cpu密集型任務應配置盡可能小的執行緒,如配置cpu個數+1的執行緒數,io密集型任務應配置盡可能多的執行緒,因為io操作不占用cpu,不要讓cpu閒下來,應加大執行緒數量,如配置兩倍cpu個數+1,而對於混合型的任務,如果可以拆分,拆分成io密集型和cpu密集型分別處理,前提是兩者執行的時間是差不多的,如果處理時間相差很大,則沒必要拆分了。

若任務對其他系統資源有依賴,如某個任務依賴資料庫的連線返回的結果,這時候等待的時間越長,則cpu空閒的時間越長,那麼執行緒數量應設定得越大,才能更好的利用cpu。 

當然具體合理執行緒池值大小,需要結合系統實際情況,在大量的嘗試下比較才能得出,以上只是前人總結的規律。

在這篇如何合理地估算執行緒池大小?文章中發現了乙個估算合理值的公式

最佳執行緒數目 = ((執行緒等待時間+執行緒cpu時間)/執行緒cpu時間 )* cpu數目
比如平均每個執行緒cpu執行時間為0.5s,而執行緒等待時間(非cpu執行時間,比如io)為1.5s,cpu核心數為8,那麼根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:

最佳執行緒數目 = (執行緒等待時間與執行緒cpu時間之比 + 1)* cpu數目
可以得出乙個結論: 

執行緒等待時間所佔比例越高,需要越多執行緒。執行緒cpu時間所佔比例越高,需要越少執行緒。 

以上公式與之前的cpu和io密集型任務設定執行緒數基本吻合。

併發程式設計網上的乙個問題 

高併發、任務執行時間短的業務怎樣使用執行緒池?併發不高、任務執行時間長的業務怎樣使用執行緒池?併發高、業務執行時間長的業務怎樣使用執行緒池? 

(1)高併發、任務執行時間短的業務,執行緒池執行緒數可以設定為cpu核數+1,減少執行緒上下文的切換 

(2)併發不高、任務執行時間長的業務要區分開看: 

a)假如是業務時間長集中在io操作上,也就是io密集型的任務,因為io操作並不占用cpu,所以不要讓所有的cpu閒下來,可以適當加大執行緒池中的執行緒數目,讓cpu處理更多的業務 

b)假如是業務時間長集中在計算操作上,也就是計算密集型任務,這個就沒辦法了,和(1)一樣吧,執行緒池中的執行緒數設定得少一些,減少執行緒上下文的切換 

(3)併發高、業務執行時間長,解決這種型別任務的關鍵不在於執行緒池而在於整體架構的設計,看看這些業務裡面某些資料是否能做快取是第一步,增加伺服器是第二步,至於執行緒池的設定,設定參考(2)。最後,業務執行時間長的問題,也可能需要分析一下,看看能不能使用中介軟體對任務進行拆分和解耦。

如何合理設定執行緒池大小

這個問題雖然看起來很小,卻並不那麼容易回答。大家如果有更好的方法歡迎賜教,先來乙個天真的估算方法 假設要求乙個系統的tps transaction per second或者task per second 至少為20,然後假設每個transaction由乙個執行緒完成,繼續假設平均每個執行緒處理乙個t...

如何合理設定執行緒池大小

要想合理的配置執行緒池的大小,首先得分析任務的特性,可以從以下幾個角度分析 任務的性質 cpu密集型任務 io密集型任務 混合型任務。任務的優先順序 高 中 低。任務的依賴性 是否依賴其他系統資源,如資料庫連線等。性質不同的任務可以交給不同規模的執行緒池執行。對於不同性質的任務來說,cpu密集型任務...

java執行緒池如何合理的設定大小

任務一般分為 cpu密集型 io密集型 混合型,對於不同型別的任務需要分配不同大小的執行緒池 1 cpu密集型 盡量使用較小的執行緒池,一般cpu核心數 1 因為cpu密集型任務cpu的使用率很高,若開過多的執行緒,只能增加執行緒上下文的切換次數,帶來額外的開銷 2 io密集型 方法一 可以使用較大...