線程池的幾個靈魂拷問(二)

線程池雖然在并發(fā)編程里很強大唤衫,但線程池使用面臨的核心的問題在于:線程池的參數(shù)并不好配置婆赠。一方面線程池的運行機制不是很好理解,配置合理需要強依賴開發(fā)人員的個人經(jīng)驗和知識佳励;另一方面页藻,線程池執(zhí)行的情況和任務(wù)類型相關(guān)性較大,IO密集型和CPU密集型的任務(wù)運行起來的情況差異非常大植兰,這導致業(yè)界并沒有一些成熟的經(jīng)驗策略幫助開發(fā)人員參考。

美團方案

比如網(wǎng)上流傳的比較多的一個策略:

  • 如果是CPU密集型任務(wù)璃吧,就需要盡量壓榨CPU楣导,參考值可以設(shè)為 N(CPU)+1(比如是4核心 就配置為5)
  • 如果是IO密集型任務(wù),參考值可以設(shè)置為2*N(CPU)

CPU密集型的為什么要+1呢畜挨?《Java并發(fā)編程實戰(zhàn)》給出的原因是:即使當計算(CPU)密集型的線程偶爾由于頁缺失故障或者其他原因而暫停時筒繁,這個“額外”的線程也能確保 CPU 的時鐘周期不會被浪費。

這里先來看看美團幫我們總結(jié)的現(xiàn)在業(yè)界的一些線程池調(diào)參方案:

cpu參數(shù)方案

第一套方案是并發(fā)編程實戰(zhàn)給出的巴元,明顯太理論化了毡咏,和實際業(yè)務(wù)想去甚遠!

N(threads) = N(Cpu個數(shù))*U(cpu的使用率)*(1+ 等待時間/計算時間)

第二套方案就沒有考慮多個業(yè)務(wù)線程池的情況逮刨。
第三套方案的用到了TPS來參與計算呕缭,但是這也是流量恒定情況下算出來的,真實情況往往比較隨機。

有啥比較好的辦法嗎恢总?——那就是:線程池參數(shù)動態(tài)化迎罗,采用這種方案最好就是用這么一個辦法來做:

  • 簡化線程池配置:線程池構(gòu)造參數(shù)有8個,但是最核心的是3個:corePoolSize片仿、maximumPoolSize纹安,workQueue,它們最大程度地決定了線程池的任務(wù)分配和線程分配策略
  • 參數(shù)可動態(tài)修改:為了解決參數(shù)不好配砂豌,修改參數(shù)成本高等問題
  • 加線程池監(jiān)控

為什么能做到動態(tài)修改線程池參數(shù)呢厢岂?這是因為JDK本身就提供api方法支持動態(tài)的修改:

設(shè)置核心線程數(shù)的大小

至于如何在運行時狀態(tài)實時查看,這里也有一個辦法:用戶基于JDK原生線程池ThreadPoolExecutor提供的幾個public的getter方法阳距,可以讀取到當前線程池的運行狀態(tài)以及參數(shù):

線程池的運行時狀態(tài)

用戶基于這個功能可以了解線程池的實時狀態(tài)塔粒,比如當前有多少個工作線程,執(zhí)行了多少個任務(wù)娄涩,隊列中等待的任務(wù)數(shù)等等窗怒。

Netty進階指南給出來的方案

在Netty服務(wù)編寫的過程中,也要涉及到兩個線程池的參數(shù)配置蓄拣,尤其是IO線程池的配置扬虚,這里書中也給了一套經(jīng)驗方案來針對線程的監(jiān)控情況,可以參考:
同樣的先用CPU核數(shù)*2球恤,看看是否存在瓶頸辜昵,運行時的監(jiān)控則用比較土的辦法了:

  • 打印thread dump,同時獲取當時cpu排在前面幾個的線程號
  • 然后在線程dump文件中去對應(yīng)的線程號堆棧
  • 然后在堆棧中查找是否有SelectotImpl.lookAndDoSelect處的lock信息

如果多次采集都發(fā)現(xiàn)有這堆信息的話咽斧,說明此時此刻的IO線程比較空閑堪置,無需調(diào)整;但是如果一直在read或者write的執(zhí)行處张惹,則說明IO較為繁忙舀锨,可以適當?shù)娜フ{(diào)大NioEventLoop線程的個數(shù)來提升網(wǎng)絡(luò)的讀寫性能。但是這邊線程數(shù)的改動就不是動態(tài)化的了宛逗,服務(wù)啟動后指定的線程數(shù)就不能再修改了坎匿。

參考文章


1、Java線程池實現(xiàn)原理及其在美團業(yè)務(wù)中的實踐
2雷激、微信文章:如何設(shè)置線程池參數(shù)替蔬?美團給出了一個讓面試官虎軀一震的回答。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屎暇,一起剝皮案震驚了整個濱河市承桥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌根悼,老刑警劉巖凶异,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀撑,死亡現(xiàn)場離奇詭異,居然都是意外死亡唠帝,警方通過查閱死者的電腦和手機屯掖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來襟衰,“玉大人贴铜,你說我怎么就攤上這事∑偕梗” “怎么了绍坝?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長苔悦。 經(jīng)常有香客問我轩褐,道長,這世上最難降的妖魔是什么玖详? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任把介,我火速辦了婚禮,結(jié)果婚禮上蟋座,老公的妹妹穿的比我還像新娘拗踢。我一直安慰自己,他們只是感情好向臀,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布巢墅。 她就那樣靜靜地躺著,像睡著了一般券膀。 火紅的嫁衣襯著肌膚如雪君纫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天芹彬,我揣著相機與錄音蓄髓,去河邊找鬼。 笑死舒帮,一個胖子當著我的面吹牛双吆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播会前,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼匾竿!你這毒婦竟也來了瓦宜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤岭妖,失蹤者是張志新(化名)和其女友劉穎临庇,沒想到半個月后反璃,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡假夺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年淮蜈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片已卷。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡梧田,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侧蘸,到底是詐尸還是另有隱情裁眯,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布讳癌,位于F島的核電站穿稳,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏晌坤。R本人自食惡果不足惜逢艘,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骤菠。 院中可真熱鬧它改,春花似錦、人聲如沸娩怎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽截亦。三九已至爬泥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間崩瓤,已是汗流浹背袍啡。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留却桶,地道東北人境输。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像颖系,于是被迫代替她去往敵國和親嗅剖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345