線程池的長度取決于未來提交的任務(wù)類型和所部署的系統(tǒng)特征。
概述
制定線程池的長度并不是一門精密的科學(xué),需要做的僅僅是避免“過大”和“過小”者兩個(gè)極端情況。如果一個(gè)線程池過大,那么線程對稀缺的CPU和內(nèi)存資源的競爭,會導(dǎo)致內(nèi)存的高使用量,還可能耗盡資源。如果過小,由于存在很多可用的處理器資源卻未在工作,會對吞吐量造成損失。
為了正確地制定線程池的長度,需要理解當(dāng)前的計(jì)算環(huán)境、資源預(yù)算和任務(wù)的自身特性。部署系統(tǒng)中安裝了多少個(gè)CUP?多少內(nèi)存?任務(wù)主要執(zhí)行的是計(jì)算、I/O還是一些混合操作?它們知否需要像JDBCConnection這樣的稀缺資源?如果有不同類別的任務(wù),它們擁有差別很大很為,那么可以考慮使用多個(gè)線程池,這樣每個(gè)線程池可以根據(jù)不同任務(wù)的工作負(fù)載進(jìn)行調(diào)節(jié)。
估算
一般說來,大家認(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
如果一臺服務(wù)器上只部署這一個(gè)應(yīng)用并且只有這一個(gè)線程池,那么這種估算或許合理,具體還需自行測試驗(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ù)目
剛剛說到的線程池大小的經(jīng)驗(yàn)值,其實(shí)是這種公式的一種估算值。
文章到這里就全部講述完啦,若有其他需要交流的可以留言哦~!~!