線程隔離的線程池配置最佳姿勢

先談?wù)剄ps蚯姆,rt和線程數(shù)的關(guān)系

單機(jī)單線程能夠處理的最大qps為1000ms/rt(拋開cpu利用率等等其他的因素)

比如任務(wù)的rt為100ms爹袁,那么單機(jī)單線程理論上能夠處理的最大值為10qps

對于多線程場景碌廓,最大qps =(1000/rt)* coreSize * cpu利用率忿磅。(假定統(tǒng)一設(shè)置coreSize=maxSize)

比如我的dubbo服務(wù),默認(rèn)最大線程池為200条霜,那么最大qps =(1000/rt)* 200 * cpu利用率

注意:rt在不同并發(fā)度下的表現(xiàn)可能不一樣间雀。

可以參考看看這篇文章悔详,講得比較清楚: https://blog.csdn.net/sinat_34976604/article/details/88125707

再談?wù)劸€程數(shù)和系統(tǒng)最大并發(fā)數(shù)的關(guān)系

假設(shè)服務(wù)端只有10個線程,同一時刻有16個請求并發(fā)打過來惹挟,這時系統(tǒng)會將10個請求立刻執(zhí)行茄螃,另外6個請求則需要在queue中等待。

只有當(dāng)有一個線程執(zhí)行完连锯,可以理解為線程空了一個槽位归苍,才會執(zhí)行在queue中排隊的一個任務(wù)。所以線程數(shù)決定了系統(tǒng)中在同一時刻最大并行的任務(wù)數(shù)运怖,也就是最大并發(fā)數(shù)拼弃。 如果我們想要讓一個線程在一秒內(nèi)處理多個請求,后面的請求勢必要在隊列中等待摇展。

進(jìn)入正題

1. 為什么要使用線程隔離吻氧?

為了避免由個別下游依賴出現(xiàn)問題,影響其他依賴的使用資源,占用大量線程資源医男,導(dǎo)致鏈路rt升高砸狞,進(jìn)而造成雪崩效應(yīng)

2. 怎么配置核心線程數(shù)捻勉?

coreSize = qps / (timout/rt)

qps:打到下游最大的qps镀梭, timeout:對下游能夠忍受的最大rt, rt:下游rt

  • 公式解析

    這個公式直接拿出來可能不太好理解踱启,沒關(guān)系报账,我們先看前人總結(jié)的公式,我對這個公式進(jìn)行了優(yōu)化

    原始版本:

    coreSize=qps * rt + buffer 我們先拋開buffer這一項來看埠偿,這個等式等價于coreSize= qps / (1000/rt)

    很容易想到透罢,這個計算思路就是: qps除以單線程能夠處理的最大qps,得出的就是所需要的線程數(shù)

  • 網(wǎng)上已有公式冠蒋,為什么還要提出這個變種的公式呢羽圃?

    1. 按1000ms打滿算,但是我的業(yè)務(wù)并不允許一個20ms的請求抖剿,排隊執(zhí)行等到1000ms才返回
    1. 公式里面簡單粗暴的+buffer朽寞,每個下游處理情況不一樣要怎么加buffer呢?心里是不是沒譜
  • 優(yōu)化分析

    很容易發(fā)現(xiàn)斩郎,優(yōu)化后的公式與原公式的差別是將1000變量化了脑融,可以根據(jù)各個業(yè)務(wù)場景適配。timeout/rt還是一個線程需要分擔(dān)的qps缩宜,但是這樣可以量化到最排隊在最后的任務(wù)也不會超過timeout這個時間肘迎。而不是簡單粗暴的對coreSize加buffer

    線程池coresize.png

3. 如何配置隊列大小锻煌?

queueSize = 最大并發(fā)數(shù) - coreSize

  • 為什么是最大并發(fā)數(shù)而不是qps?

    舉個例子妓布,我們dubbo服務(wù)最大線程數(shù)200,此時260個請求同時打過來宋梧,只有200個請求能夠立即執(zhí)行匣沼。

    假設(shè)對下游的調(diào)用是1:1的,那么打到下游最大的并發(fā)數(shù)也是200乃秀,只有下游執(zhí)行成功一個肛著,下游隔離的線程池空了一個位置,并且這個請求做完剩下所有的事情成功返回跺讯,才會將隊列中的等待的60個請求漏一個下來枢贿。

    所以我們只要保證我的隔離線程池每時每刻都能夠承接下最大的并發(fā)數(shù)即可。

    服務(wù)并發(fā)處理情況.png

4. 對每個下游獨(dú)立線程池開銷很大刀脏,有沒有辦法優(yōu)化局荚?

  • 滿足 同一來源 && 不會同時執(zhí)行 這兩個特征的下游依賴,可以考慮合并線程池管理

    比如系統(tǒng)對A和B兩個下游接口依賴,如果A B都只在同一個中調(diào)用耀态,并且這個接口對A和B的執(zhí)行一定是串行的轮傍,那么可以將這兩個接口的線程池合并。

    線程池合并.png

    可以看到執(zhí)行完A空閑的時候首装,線程池可以處理另一個request的B创夜,這樣可以提高線程池的利用率

    需要注意的是代入公式計算的時候粥航,可以把A和B看成一個整體漓柑,將AB的rt之和代入計算。

性能壓測驗證

  • 壓測場景

    購物車加購履腋,目標(biāo)qps260系奉,配置下游線程池coreSize:87檬贰,queue:120

    爬坡1分鐘,持續(xù)10分鐘

  • 壓測表現(xiàn)

    • 未開啟hystrix缺亮,平均rt 70ms

      未開啟 加購壓測數(shù)據(jù).png
  • 開啟hystrix之后翁涤,平均rt 69ms

    開啟后加購壓測數(shù)據(jù).png
  • 是不是納悶加入了排隊機(jī)制rt不升反降了?

    我們來看看壓測期間下游rt情況

    • 未開啟hystrix萌踱,下游rt 29.24ms

      未開啟下游rt情況.png
    • 開啟hystrix后葵礼,下游rt 28.92ms

      開啟下游rt情況.png
  • 結(jié)論

    對下游的并發(fā)度,會影響下游的處理能力虫蝶,如果配置的線程數(shù)是 下游并發(fā)處理能力的拐點(diǎn)時章咧,這時候的效果應(yīng)該會比較好。所以想要滿足要求的線程池配置通過上面的公式很容易配置能真,但是對下游并發(fā)度的控制赁严,也就是timeout的取值,就需要壓測慢慢調(diào)粉铐,才能拿到最優(yōu)的參數(shù)了疼约。

引申思考

線程池隔離的思想也能夠用來做限流, 對某個接口分配一個線程池蝙泼,以線程池大小來控制這個接口的最大并發(fā)量程剥。理論上對應(yīng)限制的qps可以認(rèn)為是(1000/rt) * coreSize

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市汤踏,隨后出現(xiàn)的幾起案子织鲸,更是在濱河造成了極大的恐慌,老刑警劉巖溪胶,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搂擦,死亡現(xiàn)場離奇詭異,居然都是意外死亡哗脖,警方通過查閱死者的電腦和手機(jī)瀑踢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門扳还,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人橱夭,你說我怎么就攤上這事氨距。” “怎么了棘劣?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵俏让,是天一觀的道長。 經(jīng)常有香客問我呈础,道長舆驶,這世上最難降的妖魔是什么橱健? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任而钞,我火速辦了婚禮,結(jié)果婚禮上拘荡,老公的妹妹穿的比我還像新娘臼节。我一直安慰自己,他們只是感情好珊皿,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布网缝。 她就那樣靜靜地躺著,像睡著了一般蟋定。 火紅的嫁衣襯著肌膚如雪粉臊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天驶兜,我揣著相機(jī)與錄音扼仲,去河邊找鬼。 笑死抄淑,一個胖子當(dāng)著我的面吹牛屠凶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肆资,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼矗愧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了郑原?” 一聲冷哼從身側(cè)響起唉韭,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犯犁,沒想到半個月后属愤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栖秕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年春塌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡只壳,死狀恐怖俏拱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吼句,我是刑警寧澤锅必,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惕艳,受9級特大地震影響搞隐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜远搪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一劣纲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谁鳍,春花似錦癞季、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涮因,卻和暖如春废睦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背养泡。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工嗜湃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓤荔。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓净蚤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親输硝。 傳聞我的和親對象是個殘疾皇子今瀑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容