最大工做線程數,後端服務通常也有個配置,工做線程池的線程數量,這個線程數的配置不一樣的業務架構師有不一樣的經驗值,有些業務設置爲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