首先要知道整个系统需要多少个线程干活:
系统总并发数计算:
线程数据=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(台)
浙公网安备 33010602011771号