影响系统吞吐量的因素有哪些呢?下面层QPS三要素 线程、响应时间、瓶颈资源做分析
1.线程
设置多少线程合适?
- 设置过多
- 设置过少
对象的生命周期,内存的占用总量,内核态与用户态的切换
场景一
- cpu计算时间18ms(running)
- 查询数据库,网络io时间80ms(waiting)
- 解析结果2ms
- 如果服务器2CPU,大家看看这里多少线程合适?
在充分利用CPU资源的情况下:
线程数量 = (18+80+2)/(18+2) * 2 = 10
结论1:以CPU计算为性能瓶颈
线程数量=((CPU时间+CPU等待时间) / CPU时间) * CPU数量
场景二
- 线程同步锁(数据库事务锁)50ms
- cpu时间18ms
- 查询数据库,网络io时间80ms
- 解析结果2ms
以CPU计算为瓶颈,计算线程数量
线程数=(18 + 2 + 50 + 80) / 20 * 2 = 15
以线程同步锁为瓶颈,计算线程数
线程数=(50 + 18 + 2 + 80) / 50 * 1/1 = 3
结论2:已线程阻塞资源为瓶颈
瓶颈资源的线程并行数=瓶颈资源的总份数/单次请求占用瓶颈资源的份数
线程数量 =(线程总时间/瓶颈资源时间) * 瓶颈资源的线程并行数
2.响应时间
响应时间决定QPS?
QPS = 1000/响应时间 * 线程数量
线程数量=线程总时间/瓶颈资源时间 * 瓶颈资源并行数
线程数量=(30+10+30+10+20)/ (10 + 10 + 20) * 4 = 10
QPS = 线程数量 * 1000/响应总时间
QPS = 10 * 1000/(30+10+30+10+20)
= 100
改进,将查询操作并行
线程数量=线程总时间/瓶颈资源时间 * 瓶颈资源并行数
线程数量=(30+10+10+20)/ (10 + 10 + 20) * 4 = 9
QPS = 线程数量 * 1000/响应总时间
QPS = 9 * 1000/(30+10+10+20)
= 100
结论3:QPS = 1000/瓶颈资源时间 * 瓶颈资源并行数
线程数量=线程总时间/瓶颈资源时间 * 瓶颈资源幵行数
QPS = 线程数量 * 1000/线程总时间
===>
QPS = 1000/瓶颈资源时间 * 瓶颈资源并行数
3.瓶颈资源
要分析系统的瓶颈资源,需求对系统特性做个区分,分析出系统是哪种类型的系统
-
IO密集型系统
定义:IO密集型,即该任务需要大量的IO,即大量的阻塞。
在单线程上运行IO密集型任务会导致浪费大量的CPU运算能力浪费在等待。
所以IO密集型任务中使用多线程可以大大的加速程序运行,即使在单核CPU上,这种加速主要利用了被浪费掉的阻塞时间。第一种配置方式: 由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程。 配置公式:CPU核数 * 2 第二种配置方式: IO密集型时,大部分线程都阻塞,故需要多配置线程数。 配置公式:CPU核数 / (1 – 阻塞系数)(0.8~0.9之间) 比如:8核 / (1 – 0.9) = 80个线程数
CPU密集型系统
定义:CPU密集型的意思就是该任务需要大量运算,而没有阻塞,CPU一直全速运行
CPU密集型任务只有在真正的多核CPU上才可能得到加速(通过多线程)
CPU密集型任务配置尽可能少的线程数
CPU密集型线程数配置公式:(CPU核数+1)个线程的线程池