想要合理配置線程池線程數的大小,需要分析任務的類型,任務類型不同,線程池大小配置也不同。
配置線程池的大小可根據以下幾個維度進行分析來配置合理的線程數:
- 任務性質可分為:CPU密集型任務,IO密集型任務,混合型任務。
- 任務的執行時長。
- 任務是否有依賴——依賴其他系統資源,如數據庫連接等。
- CPU密集型任務
盡量使用較小的線程池,一般為CPU核心數+1。
因為CPU密集型任務使得CPU使用率很高,若開過多的線程數,只能增加上下文切換的次數,因此會帶來額外的開銷。
- IO密集型任務
可以使用稍大的線程池,一般為2*CPU核心數+1。
因為IO操作不占用CPU,不要讓CPU閑下來,應加大線程數量,因此可以讓CPU在等待IO的時候去處理別的任務,充分利用CPU時間。
- 混合型任務
可以將任務分成IO密集型和CPU密集型任務,然后分別用不同的線程池去處理。
只要分完之后兩個任務的執行時間相差不大,那么就會比串行執行來的高效。
因為如果划分之后兩個任務執行時間相差甚遠,那么先執行完的任務就要等后執行完的任務,最終的時間仍然取決於后執行完的任務,而且還要加上任務拆分與合並的開銷,得不償失
- 依賴其他資源
如某個任務依賴數據庫的連接返回的結果,這時候等待的時間越長,則CPU空閑的時間越長,那么線程數量應設置得越大,才能更好的利用CPU。
借鑒別人的文章 對線程池大小的估算公式:
最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目
比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那么根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。
可以得出一個結論:
線程等待時間所占比例越高,需要越多線程。線程CPU時間所占比例越高,需要越少線程。
