线程隔离的线程池配置最佳姿势

先谈谈qps,rt和线程数的关系

单机单线程能够处理的最大qps为1000ms/rt(抛开cpu利用率等等其他的因素)

比如任务的rt为100ms,那么单机单线程理论上能够处理的最大值为10qps

对于多线程场景,最大qps =(1000/rt)* coreSize * cpu利用率。(假定统一设置coreSize=maxSize)

比如我的dubbo服务,默认最大线程池为200,那么最大qps =(1000/rt)* 200 * cpu利用率

注意:rt在不同并发度下的表现可能不一样。

可以参考看看这篇文章,讲得比较清楚: https://blog.csdn.net/sinat_34976604/article/details/88125707

再谈谈线程数和系统最大并发数的关系

假设服务端只有10个线程,同一时刻有16个请求并发打过来,这时系统会将10个请求立刻执行,另外6个请求则需要在queue中等待。

只有当有一个线程执行完,可以理解为线程空了一个槽位,才会执行在queue中排队的一个任务。所以线程数决定了系统中在同一时刻最大并行的任务数,也就是最大并发数。 如果我们想要让一个线程在一秒内处理多个请求,后面的请求势必要在队列中等待。

进入正题

1. 为什么要使用线程隔离?

为了避免由个别下游依赖出现问题,影响其他依赖的使用资源,占用大量线程资源,导致链路rt升高,进而造成雪崩效应

2. 怎么配置核心线程数?

coreSize = qps / (timout/rt)

qps:打到下游最大的qps, timeout:对下游能够忍受的最大rt, rt:下游rt

  • 公式解析

    这个公式直接拿出来可能不太好理解,没关系,我们先看前人总结的公式,我对这个公式进行了优化

    原始版本:

    coreSize=qps * rt + buffer 我们先抛开buffer这一项来看,这个等式等价于coreSize= qps / (1000/rt)

    很容易想到,这个计算思路就是: qps除以单线程能够处理的最大qps,得出的就是所需要的线程数

  • 网上已有公式,为什么还要提出这个变种的公式呢?

    1. 按1000ms打满算,但是我的业务并不允许一个20ms的请求,排队执行等到1000ms才返回
    1. 公式里面简单粗暴的+buffer,每个下游处理情况不一样要怎么加buffer呢?心里是不是没谱
  • 优化分析

    很容易发现,优化后的公式与原公式的差别是将1000变量化了,可以根据各个业务场景适配。timeout/rt还是一个线程需要分担的qps,但是这样可以量化到最排队在最后的任务也不会超过timeout这个时间。而不是简单粗暴的对coreSize加buffer

    线程池coresize.png

3. 如何配置队列大小?

queueSize = 最大并发数 - coreSize

  • 为什么是最大并发数而不是qps?

    举个例子,我们dubbo服务最大线程数200,此时260个请求同时打过来,只有200个请求能够立即执行。

    假设对下游的调用是1:1的,那么打到下游最大的并发数也是200,只有下游执行成功一个,下游隔离的线程池空了一个位置,并且这个请求做完剩下所有的事情成功返回,才会将队列中的等待的60个请求漏一个下来。

    所以我们只要保证我的隔离线程池每时每刻都能够承接下最大的并发数即可。

    服务并发处理情况.png

4. 对每个下游独立线程池开销很大,有没有办法优化?

  • 满足 同一来源 && 不会同时执行 这两个特征的下游依赖,可以考虑合并线程池管理

    比如系统对A和B两个下游接口依赖,如果A B都只在同一个中调用,并且这个接口对A和B的执行一定是串行的,那么可以将这两个接口的线程池合并。

    线程池合并.png

    可以看到执行完A空闲的时候,线程池可以处理另一个request的B,这样可以提高线程池的利用率

    需要注意的是代入公式计算的时候,可以把A和B看成一个整体,将AB的rt之和代入计算。

性能压测验证

  • 压测场景

    购物车加购,目标qps260,配置下游线程池coreSize:87,queue:120

    爬坡1分钟,持续10分钟

  • 压测表现

    • 未开启hystrix,平均rt 70ms

      未开启 加购压测数据.png
  • 开启hystrix之后,平均rt 69ms

    开启后加购压测数据.png
  • 是不是纳闷加入了排队机制rt不升反降了?

    我们来看看压测期间下游rt情况

    • 未开启hystrix,下游rt 29.24ms

      未开启下游rt情况.png
    • 开启hystrix后,下游rt 28.92ms

      开启下游rt情况.png
  • 结论

    对下游的并发度,会影响下游的处理能力,如果配置的线程数是 下游并发处理能力的拐点时,这时候的效果应该会比较好。所以想要满足要求的线程池配置通过上面的公式很容易配置,但是对下游并发度的控制,也就是timeout的取值,就需要压测慢慢调,才能拿到最优的参数了。

引申思考

线程池隔离的思想也能够用来做限流, 对某个接口分配一个线程池,以线程池大小来控制这个接口的最大并发量。理论上对应限制的qps可以认为是(1000/rt) * coreSize

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容