如何合理地估算線程池大?。?/h2>

線程池的長度取決于未來提交的任務(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í)是這種公式的一種估算值。

參考 如何合理地估算線程池大???

文章到這里就全部講述完啦,若有其他需要交流的可以留言哦~!~!

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

相關(guān)閱讀更多精彩內(nèi)容

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