一般說來,大家認為線程池的大小經驗值應該這樣設置:(其中N為CPU的個數)
- 如果是CPU密集型應用,則線程池大小設置為N+1
- 如果是IO密集型應用,則線程池大小設置為2N+1
如果一臺服務器上只部署這一個應用并且只有這一個線程池,那么這種估算或許合理,具體還需自行測試驗證。
但是,IO優化中,這樣的估算公式可能更適合:
最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目
因為很顯然,線程等待時間所占比例越高,需要越多線程。
線程CPU時間所占比例越高,需要越少線程。
下面舉個例子:比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那么根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。
這個公式進一步轉化為:最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1) * CPU數目
同理,數據庫連接池也不是越大越好
IO密集型
Nthreads = NCPU * UCPU * (1 + W/C)
NCPU是處理器的核的數目,可以通過Runtime.getRuntime().availableProcessors()得到
UCPU是期望的CPU利用率(該值應該介于0和1之間)
W/C是等待時間與計算時間的比率
無IO操作
Nthreads=NCPU+1
技術討論 & 疑問建議 & 個人博客
版權聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協議,轉載請注明出處!