線程池參數值配置依據


 

一、聊聊線程池的參數配置規則

 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

           最大線程數=( 最大任務數-等待隊列容量)/ 每個線程每秒處理能力

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM