如何合理的配置线程数?
文章目錄
- 題記
- Java并發(fā)編程實(shí)戰(zhàn)
- 美團(tuán)技術(shù)團(tuán)隊(duì)
- 追求參數(shù)設(shè)置合理性
- 線程池參數(shù)動(dòng)態(tài)化
題記
我想不管是在面試中、還是工作中,我們總會(huì)面臨這種問題,那么到底有沒有一種計(jì)算公式去告訴我們?nèi)绾稳ヅ渲媚?#xff1f;
答案是:沒有
想要合理的配置線程池參數(shù),首先我們需要明白我們的任務(wù)是計(jì)算型還是IO密集型以及和CPU核數(shù)之間的關(guān)系。
Java并發(fā)編程實(shí)戰(zhàn)
該書中推薦的計(jì)算方式
線程數(shù) = CPU 核心數(shù) *(1+平均等待時(shí)間/平均工作時(shí)間)
我覺得將這個(gè)公式轉(zhuǎn)換一下更好理解
線程數(shù) = CPU 核心數(shù) *(平均等待時(shí)間 + 平均工作時(shí)間)/ 平均工作時(shí)間)
怎么理解這個(gè)公式,我舉一個(gè)場景
我這有個(gè)索引服務(wù)需要組裝數(shù)據(jù)并錄入到es中,組裝數(shù)據(jù)期間我可能需要去查詢Hbase、Redis等多數(shù)據(jù)源,假設(shè)CPU核心數(shù)為8、查詢Hbase需要2ms、Redis需要2ms,代碼中涉及的一些計(jì)算(邏輯判斷、json轉(zhuǎn)換等)時(shí)間需要2ms,錄入數(shù)據(jù)到ES(期間需要建立連接、數(shù)據(jù)包傳送)需要4ms,套用上面的公式我的平均等待時(shí)間是2ms+2ms+4ms=10ms,平均工作時(shí)間(計(jì)算時(shí)間)2ms,處理一條數(shù)據(jù)花費(fèi)的總時(shí)間為12ms,線程數(shù):8*12/2=48個(gè)線程
上述這種方式太偏理論,但是實(shí)際我們的業(yè)務(wù)需要花費(fèi)的時(shí)間去細(xì)分,這種方式適合用于RPC框架調(diào)用、各個(gè)業(yè)務(wù)邏輯計(jì)算上報(bào)打點(diǎn)并且監(jiān)控到位的情況下我們能確切知道各個(gè)時(shí)間點(diǎn),但是實(shí)際情況很難做到。
美團(tuán)技術(shù)團(tuán)隊(duì)
以下文章摘選自美團(tuán)技術(shù)團(tuán)隊(duì)的博客,看了這么多篇文章,感覺這里面總結(jié)的是最好的,固記之。
追求參數(shù)設(shè)置合理性
有沒有一種計(jì)算公式,能夠讓開發(fā)同學(xué)很簡易地計(jì)算出某種場景中的線程池應(yīng)該是什么參數(shù)呢?
帶著這樣的疑問,我們調(diào)研了業(yè)界的一些線程池參數(shù)配置方案:
調(diào)研了以上業(yè)界方案后,我們并沒有得出通用的線程池計(jì)算方式。并發(fā)任務(wù)的執(zhí)行情況和任務(wù)類型相關(guān),IO密集型和CPU密集型的任務(wù)運(yùn)行起來的情況差異非常大,但這種占比是較難合理預(yù)估的,這導(dǎo)致很難有一個(gè)簡單有效的通用公式幫我們直接計(jì)算出結(jié)果。
線程池參數(shù)動(dòng)態(tài)化
盡管經(jīng)過謹(jǐn)慎的評(píng)估,仍然不能夠保證一次計(jì)算出來合適的參數(shù),那么我們是否可以將修改線程池參數(shù)的成本降下來,這樣至少可以發(fā)生故障的時(shí)候可以快速調(diào)整從而縮短故障恢復(fù)的時(shí)間呢?基于這個(gè)思考,我們是否可以將線程池的參數(shù)從代碼中遷移到分布式配置中心上,實(shí)現(xiàn)線程池參數(shù)可動(dòng)態(tài)配置和即時(shí)生效,線程池參數(shù)動(dòng)態(tài)化前后的參數(shù)修改流程對(duì)比如下:
基于以上三個(gè)方向?qū)Ρ?#xff0c;我們可以看出參數(shù)動(dòng)態(tài)化方向簡單有效。
美團(tuán)還提供了動(dòng)態(tài)配置線程池參數(shù)、監(jiān)控架構(gòu),感興趣同學(xué)可以去仔細(xì)看看。
傳送門:Java線程池實(shí)現(xiàn)原理及其在美團(tuán)業(yè)務(wù)中的實(shí)踐
總結(jié)
以上是生活随笔為你收集整理的如何合理的配置线程数?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 正则表达式 手机号 邮箱(转载
- 下一篇: IndexOptions类说明