java線程池的大小如何設置?

概念,IO密集型和CPU密集型

CPU密集型(計算密集型):

cpu密集型任務的特點是要進行大量的計算,消耗CPU資源,比如計算圓周率、對視頻進行高清解碼等等,全靠CPU的運算能力 計算機密集型任務主要消耗CPU資源,因此,代碼運行效率至關重要,Python這樣的腳本代碼運行效率很低,完全不適合計算機密集型任務。對於計算密集型任務,最好用C語言編寫。

IO密集型
IO密集型涉及到網絡、磁盤IO的任務都是IO密集型任務,這類任務的特點是CPU消耗很少,任務的大部分時間都在等待IO操作完成(因爲IO的速度遠遠低於CPU和內存的速度)。對於IO密集型任務,任務越多,CPU效率越高,但是也有一個限度。常見的大部分任務都是IO密集型任務,比如web應用。

大家對線程數量的設置有一個經驗的計算公式

 如果是CPU密集型應用,則線程池大小設置爲N+1(N:CPU的個數)
 如果是IO密集型應用,則線程池大小設置爲2N+1

如果一臺服務器上只部署這一個應用並且只有這一個線程池,那麼這種估算或許是合理的。但是在IO優化中,下面的估算公式是可能更合適:

 最佳線程數量=((線程等待時間+線程CPU時間)/線程CPU時間)*CPU數目

顯然,線程等待時間所佔比例越高,需要的線程數量 就越多,反之則越少。

舉個例子,一臺8核的服務器,平均每個CPU運行時間爲1S,線程等待時間(非CPU運行時間)爲2S,那麼公式就是((1+2)/1)*8 = 24 。公式可以進一步轉化爲:

最佳線程數量=(線程的等待時間與線程的計算(CPU)時間之比+1)*CPU數目

最後總結:

其實要想獲得最準確的線程數量,我們還需要通過壓力測試來進行微調,只有經過壓力測試過的纔是最適用於自己的項目的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章