全链路压测是一种模拟真实用户操作场景,对整个系统进行压力测试的方法,旨在评估系统在高负载下的性能表现。在全链路压测中,流量录制与回放技术起着关键作用,能够捕获并重现真实的用户流量,帮助发现潜在的性能瓶颈和问题。
全链路压测似乎是端到端负载测试,检查系统在高负载下的表现。它看起来像是确保系统能处理真实使用场景。
一般在软件发布之前,都会经过单元测试, 接口测试, 集成测试, 性能测试等。但是这些测试往往都是基于自己定义的测试数据集合,很可能会有漏网之鱼,那么在软件上线之后,在线上流量冲击下,会出现各种之前测试中并没有发现的问题。这是因为线上的流量数据比测试的数据更加多样性,并且随着用户数量的增加,线上流量的也越来越大,更多的隐藏问题也会暴露,比如并发处理不当导致的Crash。那么我们有什么方法能够在上线之前完成这些测试呢?就是借助流量回放工具。
流量录制和回放的作用
流量录制捕捉真实用户请求,回放则模拟大量用户访问,研究表明这能更准确反映系统性能。
如何进行?
- 录制流量:用工具如Apache JMeter捕捉HTTP请求,注意保护敏感数据。
- 处理录制:清理数据,参数化动态元素,确保测试稳健。
- 设置回放:用负载测试工具配置用户数和测试时长,监控性能。
- 运行测试:观察系统表现,收集数据。
- 分析结果:找出瓶颈,优化系统。
GoReplay流量回放工具
GoReplay工具是go语言编写的一个http实时流量复制工具。功能强大,支持流量的放大、缩小、频率限制,还支持把请求记录到文件,方便回放和分析。
goplay工具不是代理,而是监听网络上的流量,不需要更改生产基础架构,而是在与服务相同的计算器上运行goplay守护程序。
1)安装部署
1- 安装golang依赖环境:因为这个工具是go语言开发的,所以需要安装go的依赖环境
-
yum install -y epel-release
-
yum install -y golang
-
校验是否安装成功:go version
2- Goreplay下载安装:
-
https://github.com/buger/goreplay/releases 从官网下载安装包:gor_1.3.3_x64.tar.gz
-
创建goreplay这个文件夹:mkdir goreplay
-
把下载的安装解压到指定目录:tar -xzvf gor_1.3.3_x64.tar.gz -C ./goreplay
-
进入解压后的文件夹,执行这gor可执行文件:./gor
3- 运行校验:./gor version:会看到gor的版本号信息
2)流量的录制:
在链路的起点进行录制:比如Nginx网关上进行录制:./gor -input-raw :8082 -output-file requests.gor
-
输入的是8082的端口的所有流量
-
输出到文件:requests.gor 里, 文件会自动加一个后缀:requests_0.gor
可以cat查看一下这个文件内容:录制其实就是把http请求的信息保存下来了
3)流量的回放
切换到另外一个复刻的项目服务器:也需要安装goreplay的依赖和工具
./gor -input-file requests.gor -output-http "http://ip:8082"
所有保存在requests.gor中的请求通过相同的时间顺序请求到指定的服务器。【另外一个台服务器需要复刻好用户或者生产的环境】
生产环境的录制文件拉取下来,放到专门用于流量回放的服务器里
注意:不要直接在生产环境里回放流量,因为流量回放本质就是goreplay发起请求,你放在生产环境里直接回放影响生产环境的性能 ,因为goreplay发起请求需要占用资源。
而且,这个工具需要回放的环境跟录制的环境 保持一致,包括数据和整个链路。不然回放不成功。
4)Goreplay工具的其他一些用法:
1)捕获流量并实时打印到屏幕上:【不是输出到文件】:
./gor -input-raw :8082 -output-stdout
-
监控8082的端口上所有的流量,并通过终端stdout输出 也就是输出到屏幕
2)捕获流量并实时同步到另外的机器:
-
./gor -input-raw :8082 -output-http "[http://192.168.61.155:8082](http://192.168.61.155:8082/)"
-
将8082端口的流量实时同步访问http://192.168.61.155:8082
-
要确保两台机器的复刻数据和服务,并且网络是通的
-
两边实时同步。
-
3)将捕获到的流量回放到多台服务器:
-
./gor -input-raw :8082 -output-http "[http://192.168.61.155:8082](http://192.168.61.155:8082/)" -output-http "[http://192.168.61.156:8082](http://192.168.61.155:8082/)"
-
可以加上多台回放机器:默认会向所有输出机器发送相同的的流量,但是可以进行流量切割:
-
--split-output 选项将其平均分配:./gor -input-raw :8082 -output-http "[http://192.168.61.155:8082](http://192.168.61.155:8082/)" -output-http "[http://192.168.61.156:8082](http://192.168.61.155:8082/)" --split-output true
-
4)请求过滤:不想要捕获所有的流量,过滤你想要的流量进行捕获。【这个参数跟位置没有关系 前面后面都可以】
-
1-按照method进行过滤:./gor -input-raw :8082 -output-http "[http://192.168.61.155:8082](http://192.168.61.155:8082/)" --http-allow-method GET
-
过滤只有GET请求会被捕获并回放,在目标机器里只能看到get请求的回放。【POST就会只回放捕获post的请求,这个一定要大写才可以识别】
-
-
2-按照path进行过滤:
• 允许指定path路径:./gor -input-raw :8082 -output-http " [http://192.168.61.155:8082](http://192.168.61.155:8082/)" --http- allow-url /user/login
-
不允许指定path:./gor -input-raw :8082 -output-http " [http://192.168.61.155:8082](http://192.168.61.155:8082/)" --http- disallow-url /user/login
-
只有接口地址为 /user/login -登录请求才不会被捕获和回放
-
只有 接口地址为 /user/login -登录请求才会被捕获和回放
-
5)限速机制:可以在回放的时候限制每秒请求数
-
每秒请求数限制2个以内:./gor -input-raw :8082 -output-http "http://192.168.61.155:8082|2"
-
回放机器上就只会看到每秒2个请求
-
6)流量回放频率控制:可以进行性能测试加速,只能通过文件进行回放加速
-
./gor -input-file "requests.gor|200%" -output-http "[http://192.168.61.155:8082](http://ip:8082/)"
7)循环使用文件进行回放:-input-file-loop ,重复使用数据进行压测
-
./gor -input-file "requests.gor" -output-http "[http://192.168.61.155:8082](http://ip:8082/)" -input-file-loop
流量录制和回放的重要性
研究表明,基于真实流量录制的测试比合成流量测试更能反映实际用户行为。以下是其主要优势:
- 真实性:录制的流量基于实际用户操作,测试结果更贴近真实使用场景。
- 可扩展性:通过回放,可以模拟数百或数千用户的并发访问,帮助理解系统在高负载下的表现。
- 可重复性:录制的场景可一致重放,便于比较系统变更前后的性能。
然而,流量录制和回放也面临挑战,例如敏感数据的处理和系统状态管理。这些问题将在后续讨论中详细阐述。
常用工具
以下是一些支持流量录制和回放的工具,适合全链路压测:
工具 | 描述 | 适用场景 |
---|---|---|
Apache JMeter | 开源,内置录制功能,支持HTTP流量回放 | Web应用性能测试,中小规模负载 |
Gatling | 开源,基于Scala,支持高并发流量回放 | 高性能测试,微服务架构 |
LoadRunner | 商业工具,支持复杂场景录制和回放 | 企业级应用,大规模分布式测试 |
Amazon Load Testing Service | 云服务,支持基于录制流量的负载测试 | 云原生应用,跨区域测试 |
最佳实践
- 代表性录制:从多个用户和场景录制流量,确保覆盖高峰期和典型操作。
- 参数化与动态数据:处理动态数据,避免回放时因数据不一致导致测试失败。
- 渐进式测试:从小规模测试开始,逐步增加负载,避免测试环境崩溃。
- 监控与分析:集成监控工具,全面观察系统各层面的性能,包括应用层、数据库和网络。
- 法律与安全:确保录制和回放过程符合数据保护法规,处理敏感信息时进行脱敏。
考虑因素
法律与安全
录制生产环境流量时,需注意法律合规性,确保不捕捉个人身份信息(PII)。建议使用数据掩码或脱敏工具,保护用户隐私。
系统状态管理
回放录制的流量时,需确保系统状态一致。例如,如果录制的操作包括创建或删除数据,回放时可能导致数据不一致。建议在每次测试前重置系统,或使用数据清理脚本恢复初始状态。
总结
链路压测,中文中常被称为“端到端负载测试”,是一种性能测试方法,旨在评估系统从客户端到服务器再返回的整个链条在各种负载条件下的表现。其目标是模拟真实世界的使用场景,识别性能瓶颈,确保系统在高流量下稳定运行。
流量录制和回放是全链路压测的重要组成部分。流量录制涉及捕捉真实用户交互或HTTP请求,以了解实际使用模式。回放则是在测试环境中以规模化方式重放这些请求,模拟大量用户访问,评估系统性能。
全链路压测通过流量录制和回放模拟真实用户行为,是性能测试的重要方法。实施时需注意录制代表性、处理敏感数据、参数化动态元素,并确保系统状态一致。使用适当工具和最佳实践,可有效识别瓶颈,优化系统性能。