參考文件:
一般需要根據任務的型別來配置執行緒池大小:
如果是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密集型任務...