線程池中線程數(shù)量如何設(shè)定

一般說(shuō)來(lái),大家認(rèn)為線程池的大小經(jīng)驗(yàn)值應(yīng)該這樣設(shè)置:(其中N為CPU的個(gè)數(shù))

  • 如果是CPU密集型應(yīng)用,則線程池大小設(shè)置為N+1
  • 如果是IO密集型應(yīng)用,則線程池大小設(shè)置為2N+1

如果一臺(tái)服務(wù)器上只部署這一個(gè)應(yīng)用并且只有這一個(gè)線程池,那么這種估算或許合理,具體還需自行測(cè)試驗(yàn)證。
但是,IO優(yōu)化中,這樣的估算公式可能更適合:
最佳線程數(shù)目 = ((線程等待時(shí)間+線程CPU時(shí)間)/線程CPU時(shí)間 )* CPU數(shù)目
因?yàn)楹茱@然,線程等待時(shí)間所占比例越高,需要越多線程。
線程CPU時(shí)間所占比例越高,需要越少線程。

下面舉個(gè)例子:比如平均每個(gè)線程CPU運(yùn)行時(shí)間為0.5s,而線程等待時(shí)間(非CPU運(yùn)行時(shí)間,比如IO)為1.5s,CPU核心數(shù)為8,那么根據(jù)上面這個(gè)公式估算得到:((0.5+1.5)/0.5)*8=32。

這個(gè)公式進(jìn)一步轉(zhuǎn)化為:最佳線程數(shù)目 = (線程等待時(shí)間與線程CPU時(shí)間之比 + 1) * CPU數(shù)目

同理,數(shù)據(jù)庫(kù)連接池也不是越大越好

IO密集型  
Nthreads = NCPU * UCPU * (1 + W/C)
NCPU是處理器的核的數(shù)目,可以通過(guò)Runtime.getRuntime().availableProcessors()得到
UCPU是期望的CPU利用率(該值應(yīng)該介于0和1之間)
W/C是等待時(shí)間與計(jì)算時(shí)間的比率

無(wú)IO操作
Nthreads=NCPU+1

技術(shù)討論 & 疑問(wèn)建議 & 個(gè)人博客

版權(quán)聲明: 本博客所有文章除特別聲明外,均采用 CC BY-NC-SA 3.0 許可協(xié)議,轉(zhuǎn)載請(qǐng)注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容