1.什么是压力测试?
应对未来更大流量的摸底
压力测试指的是在高并发大流量下进行的测试,测试人员可以通过观察系统在峰值负载下的表现,从而找到系统中存在的性能隐患。\
\
错误的压力测试:
-
先搭建一套与正式环境功能相同的测试环境,并且导入或者生成一批测试数据\
-
启动多个线程并发地调用需要压测的接口\
-
就调用接口参数相同
-
通过统计访问日志或者查看测试环境的监控系统,来记录最终压测 QPS\
错误之处:
-
没有使用线上数据和线上环境
-
使用模拟请求,而不是线上流量
- 可以从生产环境拷贝流量,避免压测结果误差很大
- 模拟请求只会命中一次缓存
-
将流量放在离用户更近的位置
- 模拟线上真实请求
\
压力测试成本高,可以通过搭建一套全链路压测平台
\
2.怎么做压力测试?(如何搭建全链路压测平台)
关注点
-
流量隔离
- 区分正式流量和压力流量
-
避免对正常用户的访问
\
压测平台的架构
-
流量构造和产生模块\
-
压测数据隔离模块\
-
系统健康度检查和压测流量干预模块\
\
\
2.1压测数据的产生
在系统流量高峰期时,将流量拷贝一份,清理后保存至存储服务中
\
流量的拷贝:
-
直接拷贝负载均衡服务器的访问日志,数据就以文本的方式写入到流量数据工厂中\
- 缺点:需要直接写解析脚本解析日志
-
开源工具实现流量拷贝
- goreplay
\
注意:需要对压测流量进行上色,标记为压测流量
2.2数据如何隔离
将压测流量和正式流量进行隔离,避免对线上服务造成影响
-
读流量
-
针对不能压测的服务做mock处理
- 某些服务会影响线上报表
-
推荐服务是有状态
- 压测会影响服务状态
-
-
写流量
-
将压测实际操作写入影子库
- 创建相同mysql的schema
- redis增加统一前缀
- 存入单独的Elasticsearch中
-
2.3压力测试如何实施
-
设定压力测试目标
-
通过一定的步长增加QPS
-
出现瓶颈后,先减少压测流量,扩容后继续压力测试
- 通过自动化监控,异常后扩容和缩容及时报警
\
压测平台的功能打通小异,流量染色、打压、监控熔断等步骤
3.总结
-
怎么实施压力测试
- 压力测试是一种发现系统性能隐患的重要手段,所以应该尽量使用正式的环境和数据;
- 对压测的流量需要增加标记,这样就可以通过 Mock 第三方依赖服务和影子库的方式来实现压测数据和正式数据的隔离;
- 压测时,应该实时地对系统性能指标做监控和告警,及时地对出现瓶颈的资源或者服务扩容,避免对正式环境产生影响。
-
价值
-
它可以帮助我们发现系统中可能出现的性能瓶颈,方便我们提前准备预案来应对\
-
做容量评估,提供数据上的支撑\
-
压测一般会安排在流量的低峰期进行,这样我们可以降级一些服务来验证预案效果,并且可以尽量减少对线上用户的影响\
-
\