合理設置工做線程數

最大工做線程數,後端服務通常也有個配置,工做線程池的線程數量,這個線程數的配置不一樣的業務架構師有不一樣的經驗值,有些業務設置爲CPU核數的2倍,有些業務設置爲CPU核數的8倍,有些業務設置爲CPU核數的32倍。html

 

一個典型的工做線程的處理過程,從開始處理start到結束處理end,該任務的處理共有7個步驟:數據庫

  • 從工做隊列裏拿出任務,進行一些本地初始化計算,例如http協議分析、參數解析、參數校驗等後端

  • 訪問cache拿一些數據服務器

  • 拿到cache裏的數據後,再進行一些本地計算,這些計算和業務邏輯相關多線程

  • 經過RPC調用下游service再拿一些數據,或者讓下游service去處理一些相關的任務架構

  • RPC調用結束後,再進行一些本地計算,怎麼計算和業務邏輯相關線程

  • 訪問DB進行一些數據操做日誌

  • 操做完數據庫以後作一些收尾工做,一樣這些收尾工做也是本地計算,和業務邏輯相關htm

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

    線程進行本地業務邏輯計算時須要佔用CPU

    訪問cache、service、DB過程當中線程處於一個等待結果的狀態,不須要佔用CPU

 

經過量化分析,例如打日誌進行統計,能夠統計出整個Worker線程執行過程當中這兩部分時間的比例,例如:

  • 執行計算,佔用CPU的時間(粉色時間軸)是100ms

  • 等待時間,不佔用CPU的時間(橙色時間軸)也是100ms

 

獲得的結果是,這個線程計算和等待的時間是1:1,即有50%的時間在計算(佔用CPU),50%的時間在等待(不佔用CPU):

  • 假設此時是單核,則設置爲2個工做線程就能夠把CPU充分利用起來,讓CPU跑到100%

  • 假設此時是N核,則設置爲2N個工做現場就能夠把CPU充分利用起來,讓CPU跑到N*100%

 

結論

N核服務器,經過執行業務的單線程分析出本地計算時間爲x,等待時間爲y,則工做線程數(線程池線程數)設置爲 N*(x+y)/x,能讓CPU的利用率最大化。

 

經驗

通常來講,非CPU密集型的業務(加解密、壓縮解壓縮、搜索排序等業務是CPU密集型的業務),瓶頸都在後端數據庫訪問或者RPC調用,本地CPU計算的時間不多,因此設置幾十或者幾百個工做線程是可以提高吞吐量的。

 

6、總結

  • 線程數不是越多越好

  • sleep()不佔用CPU

  • 單核設置多線程不但能使得代碼清晰,還能提升吞吐量

  • 站點和服務最經常使用的線程模型是「IO線程與工做現場經過任務隊列解耦」,此時設置多工做線程能夠提高吞吐量

  • N核服務器,經過日誌分析出任務執行過程當中,本地計算時間爲x等待時間爲y,則工做線程數(線程池線程數)設置爲 N*(x+y)/x,能讓CPU的利用率最大化

*************** http://www.importnew.com/17384.html

https://mp.weixin.qq.com/s/EPWwJShDNmnQQE24tAOanQ

相關文章
相關標籤/搜索