如何做好服务 API 的性能压力测试
一、什么是性能测试
新功能上线或切换底层数据库或扩容调优,根据实际业务场景的需要,做必要的性能压测,收集性能数据,作为上线的基准报告。
性能测试一般分一下几个阶段:
1. 性能测试
并发量小(jmeter 并发线程几十个,可以选择 10 个线程),系统各资源使用率低,接口响应时间端,系统整体吞吐低。
2. 负载测试
并发量适中,系统各资源已趋于高负载,持续观察接口的吞吐量、各资源的负载情况。通过对比个资源负载,寻找性能瓶颈。
举几个例子:
a. 如果 ECS 负载较高,但是数据库负载较低:
可能的原因:
i. 数据库连接池配置的连接数较小,大流量还没到数据库
ii. 各种连接池,比如数据库的、http 连接池等,及 dubbo 线程池大小。
3. 压力测试
做压力测试的目的,主要是观察接口在瞬时大流量过来的情况,接口各性能指标的变化,来判断接口后端服务及依赖的各中间件是否能承受的住。
二、性能相关的术语
1、事务
用户发送请求->服务器接口请求->服务器从数据库或其他三方服务获取数据->生成服务返回结果->返回用户
2、并发数
系统同时处理的 Request 数
3、响应时间
客户端从发出请求到接收到响应总的耗时时间。
QPS(TPS)
4、系统每秒处理的 Query/Transcation Request 数
QPS(TPS)=并发数/响应时间
1000/s =并发数/0.2s ===》并发数=800
2000/s =并发数/0.5s ===》并发数= 1000
三、影响性能压测的因素
1. 压测客户端的并发能力
2. 应用系统
a. 池化资源:http connection pool / db connection pool / rabbion
b. 交互数据的大小
c. 逻辑:串行逻辑
3. 数据库
4. 中间件:redis/kafka 规格及应用使用的参数
三、如何寻找性能瓶颈
1. 首先,要清楚请求链路。从压测机上发出到响应,请求处理需要经过或依赖哪些服务或中间件(同下文的环节,方便描述),所以链路上各每个环节都可能会成为性能瓶颈点。比如请求接口是走域名访问,势必会经过 nginx 转发,那么 nginx 也可能会成为性能瓶颈点。
2. 要清楚整条链路上各环节资源配置。做好链路上各环节的资源的监控,方便及时发现问题。
3. 寻找性能瓶颈,应先从整体到局部排查。首先观察链路上各环节的负载情况,如果发现其中一个环节及之后的环节负载都很低,那么应该是上游领近的节点处理慢了,此时应该重点分析处理慢的节点。待整个链路的各资源(服务器、数据库或其他中间件)的负载上来了,就需要调整环节内部的参数,比如数据库连接池、http 连接池、dubbo 线程池及队列等参数,寻找最优参数值。
四、性能优化措施
性能测试的目的是为了解系统的性能以此评估上线部署时所需要多大资源才能满足业务需求。在调测的过程中,寻找性能瓶颈,发现性能问题,结合业务场景做优化。
1. 读少写多的数据,接受延迟查询的数据,可以考虑异步写入。
2. 优化各连接池及队列的大小
参考:如何做好性能压测丨压测环境设计和搭建
https://baijiahao.baidu.com/s?id=1690639698157730947&wfr=spider&for=pc
评论