31全链路压测(压力测试)

522 阅读3分钟

1.什么是压力测试?

应对未来更大流量的摸底

压力测试指的是在高并发大流量下进行的测试,测试人员可以通过观察系统在峰值负载下的表现,从而找到系统中存在的性能隐患。\

\

错误的压力测试:

  • 先搭建一套与正式环境功能相同的测试环境,并且导入或者生成一批测试数据\

  • 启动多个线程并发地调用需要压测的接口\

  • 就调用接口参数相同

  • 通过统计访问日志或者查看测试环境的监控系统,来记录最终压测 QPS\

错误之处:

  • 没有使用线上数据和线上环境

  • 使用模拟请求,而不是线上流量

    • 可以从生产环境拷贝流量,避免压测结果误差很大
    • 模拟请求只会命中一次缓存
  • 将流量放在离用户更近的位置

    • 模拟线上真实请求

\

压力测试成本高,可以通过搭建一套全链路压测平台

\

2.怎么做压力测试?(如何搭建全链路压测平台)

关注点

  • 流量隔离

    • 区分正式流量和压力流量
  • 避免对正常用户的访问

\

压测平台的架构

  • 流量构造和产生模块\

  • 压测数据隔离模块\

  • 系统健康度检查和压测流量干预模块\

\

\

2.1压测数据的产生

在系统流量高峰期时,将流量拷贝一份,清理后保存至存储服务中

\

流量的拷贝:

  • 直接拷贝负载均衡服务器的访问日志,数据就以文本的方式写入到流量数据工厂中\

    • 缺点:需要直接写解析脚本解析日志
  • 开源工具实现流量拷贝

    • goreplay

\

注意:需要对压测流量进行上色,标记为压测流量

2.2数据如何隔离

将压测流量和正式流量进行隔离,避免对线上服务造成影响

  • 读流量

    • 针对不能压测的服务做mock处理

      • 某些服务会影响线上报表
    • 推荐服务是有状态

      • 压测会影响服务状态
  • 写流量

    • 将压测实际操作写入影子库

      • 创建相同mysql的schema
      • redis增加统一前缀
      • 存入单独的Elasticsearch中

2.3压力测试如何实施

  • 设定压力测试目标

  • 通过一定的步长增加QPS

  • 出现瓶颈后,先减少压测流量,扩容后继续压力测试

    • 通过自动化监控,异常后扩容和缩容及时报警

\

压测平台的功能打通小异,流量染色、打压、监控熔断等步骤

3.总结

  • 怎么实施压力测试

    • 压力测试是一种发现系统性能隐患的重要手段,所以应该尽量使用正式的环境和数据;
    • 对压测的流量需要增加标记,这样就可以通过 Mock 第三方依赖服务和影子库的方式来实现压测数据和正式数据的隔离;
    • 压测时,应该实时地对系统性能指标做监控和告警,及时地对出现瓶颈的资源或者服务扩容,避免对正式环境产生影响。
  • 价值

    • 它可以帮助我们发现系统中可能出现的性能瓶颈,方便我们提前准备预案来应对\

    • 做容量评估,提供数据上的支撑\

    • 压测一般会安排在流量的低峰期进行,这样我们可以降级一些服务来验证预案效果,并且可以尽量减少对线上用户的影响\

\