一般說(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)注明出處!