记录一次接口压测遇到的问题

前提条件 :

虚拟机 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参数配置:

export maxParameterCount="1000"
export acceptCount="1000"
export maxSpareThreads="750"
export maxThreads="1000"
export minSpareTHreads="50"
export URIEncoding="UTF-8"
export JAVA_OPTS="-Djava.library.path=/usr/local/lib -server -Xms4096m -Xmx4096m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/export/ -XX:MaxMetaspaceSize=512M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m -XX:+ParallelRefProcEnabled -XX:+PrintCommandLineFlags -Djava.awt.headless=true -Dsun.net.client.defaultConnectTimeout=60000 -Dsun.net.client.defaultReadTimeout=60000 -Djmagick.systemclassloader=no -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.ttl=300"
posted @ 2023-01-15 16:00  爵士灬  阅读(149)  评论(0编辑  收藏  举报