1. 程式人生 > >(一)執行緒數究竟設定多少合適

(一)執行緒數究竟設定多少合適

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

1、瞭解工作執行緒的工作模式,對量化分析執行緒數的設定非常有幫助:

工作執行緒的處理過程

上圖是一個典型的工作執行緒的處理過程,從開始處理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將報文在網路上傳回工作執行緒

2、量化執行緒設定多少合適

通過上面的分析,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計算的時間很少,所以設定幾十或者幾百個工作執行緒也都是可能的。