執行緒數設多少合適??

2021-08-18 06:40:23 字數 1807 閱讀 4071

提問:工作執行緒數是不是設定的越大越好?

回答:肯定不是的

1)一來伺服器cpu核數有限,同時併發的執行緒數是有限的,1核cpu設定10000個工作執行緒沒有意義

2)執行緒切換是有開銷的,如果執行緒切換過於頻繁,反而會使效能降低

提問:如果cpu是單核,設定多執行緒有意義麼,能提高併發效能麼?

回答:即使是單核,使用多執行緒也是有意義的

1)多執行緒編碼可以讓我們的服務/**更加清晰,有些io執行緒收發包,有些worker執行緒進行任務處理,有些timeout執行緒進行超時檢測

2)如果有乙個任務一直占用cpu資源在進行計算,那麼此時增加執行緒並不能增加併發,例如這樣的乙個**

while(1)

該**一直不停的占用cpu資源進行計算,會使cpu佔用率達到100%

3)通常來說,worker執行緒一般不會一直占用cpu進行計算,此時即使cpu是單核,增加worker執行緒也能夠提高併發,因為這個執行緒在休息的時候,其他的執行緒可以繼續工作

上圖是乙個典型的工作執行緒的處理過程,從開始處理start到結束處理end,該任務的處理共有7個步驟:

1)從工作佇列裡拿出任務,進行一些本地初始化計算,例如http協議分析、引數解析、引數校驗等

2)訪問cache拿一些資料

3)拿到cache裡的資料後,再進行一些本地計算,這些計算和業務邏輯相關

4)通過rpc呼叫下游service再拿一些資料,或者讓下游service去處理一些相關的任務

5)rpc呼叫結束後,再進行一些本地計算,怎麼計算和業務邏輯相關

6)訪問db進行一些資料操作

7)操作完資料庫之後做一些收尾工作,同樣這些收尾工作也是本地計算,和業務邏輯相關

分析整個處理的時間軸,會發現:

1)其中1,3,5,7步驟中【上圖中粉色時間軸】,執行緒進行本地業務邏輯計算時需要占用cpu

2)而2,4,6步驟中【上圖中橙色時間軸】,訪問cache、service、db過程中線程處於乙個等待結果的狀態,不需要占用cpu,進一步的分解,這個「等待結果」的時間共分為三部分:

2.1)請求在網路上傳輸到下游的cache、service、db

2.2)下游cache、service、db進行任務處理

2.3)cache、service、db將報文在網路上傳回工作執行緒

最後一起來回答工作執行緒數設定為多少合理的問題。

通過上面的分析,worker執行緒在執行的過程中,有一部計算時間需要占用cpu,另一部分等待時間不需要占用cpu,通過量化分析,例如打日誌進行統計,可以統計出整個worker執行緒執行過程中這兩部分時間的比例,例如:

1)時間軸1,3,5,7【上圖中粉色時間軸】的計算執行時間是100ms

2)時間軸2,4,6【上圖中橙色時間軸】的等待時間也是100ms

得到的結果是,這個執行緒計算和等待的時間是1:1,即有50%的時間在計算(占用cpu),50%的時間在等待(不占用cpu):

1)假設此時是單核,則設定為2個工作執行緒就可以把cpu充分利用起來,讓cpu跑到100%

2)假設此時是n核,則設定為2n個工作執行緒就可以把cpu充分利用起來,讓cpu跑到n*100%

n核伺服器,通過執行業務的單執行緒分析出本地計算時間為x,等待時間為y,則工作執行緒數(執行緒池執行緒數)設定為 n*(x+y)/x,能讓cpu的利用率最大化。

一般來說,非cpu密集型的業務(加解密、壓縮解壓縮、搜尋排序等業務是cpu密集型的業務),瓶頸都在後端資料庫,本地cpu計算的時間很少,所以設定幾十或者幾百個工作執行緒也都是可能的。

執行緒數究竟設多少合適

2018年08月06日 11 32 53 小無相功 一 需求 web server通常有個配置,最大工作執行緒數,後端服務一般也有個配置,工作執行緒池的執行緒數量,這個執行緒數的配置不同的業務架構師有不同的經驗值,有些業務設定為cpu核數的2倍,有些業務設定為cpu核數的8倍,有些業務設定為cpu核...

多執行緒 空值執行緒數 執行緒池設定多少執行緒合適

執行緒池應該設定多少執行緒合適,怎麼樣估算出來?其實之前對這塊概念比較模糊 沒怎麼用到就漸漸忘了 趁著專案要用到,仔細的研究了一遍,寫下來作為筆記。首先要明白乙個概念 io密集型和cpu密集型。cpu密集型也叫計算密集型,這種型別大部分狀況下,cpu使用時間遠高於i o耗時。有許多計算要處理 許多邏...

到底多少執行緒算是執行緒數太多?

我寫了乙個服務,並為每個請求分配乙個執行緒來處理,我這樣做的原因是因為基本上每個請求都是一次資料庫的查詢操作。我使用了乙個執行緒池的庫來減少執行緒的建立和銷毀。我的問題是 像這樣的i o多執行緒,什麼才是乙個好的臨界點?我知道這需要乙個粗略的估計值,但這個值應該是幾百呢還是幾千?更新 非常感謝你們所...