爱陪小樱桃

导航

 

首先要知道整个系统需要多少个线程干活:

系统总并发数计算:

线程数据=QPS*平均响应时间;
这是总资源目标,接下来我们把总的线程数分配到每台机器上。

设计单机线程池:

线程池:参数里面:分为“核心线程池”和最大线程池。两者的逻辑完全不同

1.核心线程池:设置(和cpu的核数保持一致)

核心线程池:是线程池的备用军,处理一些低负载请求,设计原则是不浪费CPU。也不高余切换。

1.要是cpu密集型(复杂计算)核心线程设置:CPU核数+1

2.要是混合I/o密集型:核心线程设置:CPU核数即可,即可以让CPU在低负载的时候跑满,又不会导致切换的时候开销太多。

2.最大线程数的计算:

最大线程:是核心线程和队列都满了才会启动的,设计的核心用更多的线程填补IO的等待时间,让CPU不空闲。

这里用到一个通用的公示:最大线程数据=CPU核数*(1+线程等待时间/线程CPU时间)
例如:500ms 响应时间:

cpu 耗时间:50ms

IO耗时:450ms(查询mysql ,调下游 RPC接口)
套入公式:8(1+450/50)=810=80;

为何这样计算:
因为线程在450ms的等待时间里面:CPU是空闲的,--这时候多开线程,让CPU去处理其他的请求,就能最大化单机吞吐,80个线程刚好能让CPU 在IO等待的“不闲着”,又不会因为线程太多导致切换爆炸。

算机器的数量:

知道了单机线程池的配置,就可以算多少台机器了,---我们需要先算单机的最大QPS,在反推总机器数量:
1.单机最大计算过程:
单线程:500ms处理一个请求,每秒中处理2个(1000ms/500)=2,单机最大线程池80,所以单机最大QPS=80*2=160;(每秒中最多处理160个请求)

2.要求QPS:10000
所以机器数量:10000/160=62.5(取整数63)

3.实际的机器数量:
线上系统绝不能跑100%负载,万一遗漏到(比如QPS1.2万),或者机器故障了,所以通常规定要让系统负载保持在70%左右,(预留30%作为缓冲),所以实际的机器数量:63/0.7=90(台)

posted on 2025-11-11 23:39  cherry小樱桃  阅读(0)  评论(0)    收藏  举报