一般說來,大家認為線程池的大小經驗值應該這樣設置:(其中N為CPU的個數)
- 如果是CPU密集型應用,則線程池大小設置為N+1
- 如果是IO密集型應用,則線程池大小設置為2N+1(因為io讀數據或者緩存的時候,線程等待,此時如果多開線程,能有效提高cpu利用率)
如果一台服務器上只部署這一個應用並且只有這一個線程池,那么這種估算或許合理,具體還需自行測試驗證。
但是,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數目
剛剛說到的線程池大小的經驗值,其實是這種公式的一種估算值。