一、聊聊線程池的參數配置規則
1、CPU密集型、IO密集型、混合型任務
2、任務執行時間
3、任務是否有依賴----比如其他系統資源(數據庫,第三方接口等)
這里講解,根據CPU密集型、IO密集型、任務執行時間來決定如何配置:核心線程數、最大線程數、等待隊列數
1、CPU密集型:一般使用較小的線程池---》 CPU核心數+1
2、IO密集型:2*CUP核心數+1
3、任務執行時間(系統任務吞吐量、任務執行完成需要時間等考慮)
那么就需要以下幾個參數來決定核心線程數、最大線程數、等待隊列數的具體參考范圍
taskSecond=20~100 //每秒系統接收的任務數量:參考我的業務系統大概是20~100個
taskCost=5~10 //每個任務需要花費的時間(單位:秒):這里參考我的文件處理業務系統是:5s~10s
responseTime=1 //系統允許容忍最大響應時間,這里1秒,其實我的業務系統是異步處理,所以基本是毫秒級別響應,但是為了保守起見,為1秒吧
那么我們開始根據這幾個服務器的參考參數來計算一下核心線程數、最大線程數、等待隊列數的取值范圍
- 核心線程池數=corePoolSize=每秒需要多少個線程來處理,所以有了下面的公式:(公式的值是一個范圍,大伙看不懂記得在紙上寫出來就看得通熟易懂)
1、corePoolSize=taskSecond / ( 1 / taskCost )=(20~100)/(1/5~10)=(20~100)* (5~10)=(100~500)~(200~1000) 。也就是corePoolSize說明:
5秒內可能產生的任務是:100~500
10秒內可能產生的任務數量數:200~1000
2、但是根據8020原則,如果80%的每秒任務小於800,那么corePoolSize設置為80即可。
注意:但是我的當時為什么考慮沒有根據自己計算出來的參數,主要是我的是文件處理,處理時間過長,最大的文件上限時:100M,當時文件分片上傳,默認是5M一片,那么最長時間是涉及20分片文件進行下載,
再接着上傳到第三方接口。那么考慮點來了:上面參考我自己的業務系統10~15秒處理完成一個任務,那么最壞的情況是:文件下載,上傳各占50%的時間,此刻: 按照上面8020原則:(5秒~10秒)*80=400~800個任務。那么針對上面計算出來的: 5秒內任務數量,8020原則比對在范圍內:100<400<500 10秒內任務最量,8020原則比對在范圍內:200<800<1000 所以我自己設置:corePoolSize=80
- 等待隊列數=queuePoolSize=(corePoolSize / taskCose) * responseTime
代入數據maxPoolSize=(80/5~10)*1=16~8,也就是說,queuePoolSize的取值范圍是8~16,意思是等待隊列里面的線程,可以等待8~16秒,超過了這個時間就需要開新的線程來執行。
- 最大線程池數=maxPoolSize=(max(taskSecond) - queuePoolSize) / (1 / taskCost)=(100-(8~6)) / (1/5~10) = (92~94) / ( 1/ 5~10) =(92~94)* (5~10)=(92*5)~(94*10)=460~940
最大線程數=( 最大任務數-等待隊列容量)/ 每個線程每秒處理能力