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

2021-08-17  本文已影响0人  章碧莹

先谈谈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

3. 如何配置队列大小?

queueSize = 最大并发数 - coreSize

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

性能压测验证

引申思考

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

上一篇下一篇

猜你喜欢

热点阅读