记录一次接口压测遇到的问题
前提条件 :
虚拟机 4G8核 单接口性能 tps2000 tp99 50ms
虚拟机 4G8核 批处理接口性能 tps1000 tp99 50ms
接口性能观察点
TPS TP99 TP999 成功率/失败率
接口方法处理逻辑
多规则时间范围命中 拒绝营销命中 多规则任务命中 命中则响应结果不进行后续逻辑 未命中进行下一个规则
时间范围规则:通过开始时间结束时间进行判断命中。
拒绝营销规则: 查询Redis hset 判断是否命中。
任务多规则命中: 获取小时、天级别缓存 进行N天、N小时综合和配置规则总次数进行比较,均取Redis数据。
单接口优化策略
单接口优化策略:任务多规则配置时同步到Mysql和Redis 查询时获取Redis中缓存,并存入本地缓存caffeine,获取小时、天级别缓存时候Redis管道PipelineHelper进行一次性获取。
优点:规则配置同步到Redis ,减少Mysql查询压力,Redis存内存读写,性能远高于Mysql , Redis数据备份到本地缓存caffeine并进行查询,减少查询Redis交换的网络损耗,提升查询性能,但是cafferine有自己的策略,需要允许时间上的容错。
批量接口优化策略
批量接口是在单接口的基础上允许接收多个关机入参userId -> userIdList ,业务需要限制在50以内。
批量接口优化策略:在单接口基础上进行代码优化,时间范围命中,命中一个全部返回,减少无必要的循环浪费资源。拒绝营销优化复杂封装 直接使用key filed 进行value提 ,结合PipelineHelper一次性获取多个value,内存中纯计算是否命中。
优点:由于批量接口都是调用者当前时间,所有时间相同,一个命中则可以判断都命中,否则进行下一个规则,减少了无效循环。拒绝营销进行了复杂封装考虑的是复用性,但是这里只有一个类型,所有规则直接提取。
影响接口性能的指标:
1.SQL慢查询优化
2.代码内部逻辑优化
3.线程优化
4.锁优化
5.内存优化
6.网络消耗
7.CPU优化
8.json序列化
9.日志输出优化
10.性能监控插件
提升接口性能的方式
1.SQL查询优化: sql语句优、 索引优化、使用第三方缓存插件、读写分离、 分库分表 。
2.代码逻辑优化:判断逻辑优化、 读写流优化(流及时关闭)、 尽可能使用局部变量 、 避免方法过长 、 避免循环中使用try-catch、 无效循环优化(批查询 、PipelineHelper等技术)、 串行变并行(多线程)。
3.线程优化: 使用多线程、 异步线程、 修改线程数量、 修改队列大小。
4.锁优化: 减少锁的粒度、 重量级锁轻量级锁。
5.内存优化: 提升内存 提升堆内存栈内存大小 减少对象创建 减少GC次数
6.网络消耗优化: 流入流出达到峰值会限制数据传输 减少每次网络传输数据 (无关字段优化,传输数据压缩)
7.CPU优化:增大运行内存、CPU达到峰值已是达到最大算力、会限制接口性能、 CPU标高原因(内部计算、上下文切换,磁盘交互,Json序列化,监控插件均会增大Cpu压力)。
8.json序列化:减少无关 json序列化次数,删除日志序列化。
9.日志输出优化:删除无关日志输出, 减少日志相关json序列化。
10.性能监控插件:监控插件会占用Cpu 且占用较大,考虑优化或替换。
11.增加服务器,提升整体算力。
接口性能指标:
tps 、 tp99
成功率/失败率
CPU使用:
内存使用率:
堆栈内存:
网络流入/网络流出:
磁盘:
JVM参数配置: