如何配置執行緒池大小

2021-09-22 17:53:23 字數 1407 閱讀 5789

參考文件: 

一般需要根據任務的型別來配置執行緒池大小:

如果是cpu密集型任務,就需要盡量壓榨cpu,參考值可以設為 ncpu+1

如果是io密集型任務,參考值可以設定為2*ncpu

當然,這只是乙個參考值,具體的設定還需要根據實際情況進行調整,比如可以先將執行緒池大小設定為參考值,再觀察任務運**況和系統負載、資源利用率來進行適當調整。

與cpu密集型的關係:

一般情況下,cpu核心數 == 最大同時執行執行緒數.在這種情況下(設cpu核心數為n),大量客戶端會傳送請求到伺服器,但是伺服器最多只能同時執行n個執行緒.

設執行緒池大小為m,且m>>n,則此時會導致cpu頻繁切換執行緒來執行

所以這種情況下,無需設定過大的執行緒池工作佇列,(工作佇列長度 = cpu核心數 || cpu核心數+1) 即可.

與i/o密集型的關係:

1個執行緒對應1個方法棧,執行緒的生命週期與方法棧相同.

比如某個執行緒的方法棧對應的入站順序為:controller()->service()->dao(),由於dao長時間的i/o操作,導致該執行緒一直處於工作佇列,但它又不占用cpu,則此時有1個cpu是處於空閒狀態的.(就是說cpu的效能超過i/o很多,大多數情況下都是cpu在等待i/o這樣浪費cpu效能,所以設定執行緒數為2*ncpu)

所以,這種情況下,應該加大執行緒池工作佇列的長度(如果cpu排程演算法使用的是fcfs,則無法切換),盡量不讓cpu空閒下來,提高cpu利用率.

總結:計算密集型=ncpu(常出現於執行緒中:複雜演算法)

如何檢視核心數呢(windows):

linux檢視邏輯cpu個數來判斷核心數:

cpu總核數 = 物理cpu個數 * 每顆物理cpu的核數 

總邏輯cpu數 = 物理cpu個數 * 每顆物理cpu的核數 * 超執行緒數

檢視cpu資訊(型號)

[root@aaa ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

24 intel(r) xeon(r) cpu e5-2630 0 @ 2.30ghz

# 檢視物理cpu個數

[root@aaa ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

2# 檢視每個物理cpu中core的個數(即核數)

[root@aaa ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq

cpu cores : 6

# 檢視邏輯cpu的個數

[root@aaa ~]# cat /proc/cpuinfo| grep "processor"| wc -l

24

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

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

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

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

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

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