1、关于性能测试
性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。负载测试和压力测试都属于性能测试,两者可以结合进行。通过负载测试,确定在各种工作负载下系统的性能,目标是测试当负载逐渐增加时,系统各项性能指标的变化情况。压力测试是通过确定一个系统的瓶颈或者不能接受的性能点,来获得系统能提供的最大服务级别的测试。
1、ConcurrencyThreadGroup
阶梯加压
2、ThreadGroup
直线指线性加压
2、性能测试指标
1、Vus 并发数
从50,100,200 并发数进行性能测试分析
2、TPS 每秒钟request/事务 数量
目标在80~400之间,具体看实际业务场景,业务复杂度、服务器CPU,mysql业务库表数据量,是否使用Redis,cache等。
3、响应时间
Response Time 响应时间
Average Response Time 平均响应时间
一个系统吞吐量通常由QPS(TPS)、并发数两个因素决定,每套系统这两个值都有一个相对极限值,在应用场景访问压力下,只要某一项达到系统最高值,系统的吞吐量就上不去了,如果压力继续增大,系统的吞吐量反而会下降,原因是系统超负荷工作,上下文切换、内存等等其它消耗导致系统性能下降。
3、动手实践
1、优化业务方法层次拆分
首选需要拆分业务方法,针对各个节点的处理进行整合拆分。
1、如对前置的查询:
mysql查询
redis查询
内部feign查询
2、如对数据进行业务封装:
各自业务分析得出
3、如对业务数据进行对应场景校验:
各自业务分析得出
2、本地StopWatch分析
工具可以使用org.springframework.util.StopWatch
1、整体单元测试分析:
loading....
2、方法内层次分析:
loading....
3、通过不同的检测时间分析
整个接口的响应:
loading....
层次处理响应:
loading....
异步查询线程响应:
loading....
整个接口的优化点:
loading....
3、准备Jmemter脚本
创建Http访问脚本
使用SVC访问(注册的服务名称)
添加Http响应消息类型
添加成功断言数据
查看请求结果,保证接口正常
3、请求参数分析
由一到多
由浅到深
4、分析优化
1、性能测试报告
由梯度变化来检测分析
2、TPS优化方向
优化数据计算,提前业务异常退出
整合stream流处理,减少重复List,Map处理
3、Response Time优化方向
异步查询mysql,redis,feign采用redis查询,减少IO响应时间
5、总结
内部异步线程存在最大查询时间609ms,可以着手优化
1、拆分单一职责的接口方法,如查询、校验、封装,以及数据的处理,尽可能将颗粒度细化。
2、采用CompletableFuture,如果涉及到高级参数传递,需要对异步任务进行编排,使用上下流处理。
3、整合List,Map的转换,使用参数上下文传递,减少内存重复处理。
4、对数据使用Redis缓存,如菜品活动等信息,管理服务优先处理各种业务使用的缓存数据,减少业务服务再校验封装。
5、对非核心业务处理,如数据的封装进行并行处理(需要考虑实际使用场景,如果数据量小于100以下,不推荐使用并行流)。目前业务校验任需串行处理,暂不使用异步流。
6、对前置数据的查询使用门店级+ID主键,存在上下外键关联查询,优先采用内存处理,提高数据库查询命中,特别是对表数量过大查询,新增组合索引。
7、目前去下单、提交订单不存在mysql事务,暂不需要考虑,如果涉及到mysql事务,需要进行整合,预计算处理,如果业务场景容许的情况下考虑使用补偿性事务。
8、减少JVM的开销,对ListmMap的使用,可以从扩容因子、明确的Size大小进行指定创建,或最大创建,如菜品10个,进行过滤的List最大值设置10,即使过滤后只有2。