【GoReplay】 基于线上真实请求的流量重放压测
背景
为了评估后台服务的各个接口真实的抗住多少并发,往往在线上用户导量或者大版本发布前,会对核心服务,例如用户服务,社区频道服务,做一轮或多轮压测,根据压测结果,检查各个核心服务的可能出现的漏洞和瓶颈,同时根据压测结果调整线上的机器资源
这里主要记录我们团队使用GoReplay做流量重放的经验和步骤
备注:我们项目后台服务使用的是K8s容器编排
安装
进入到生产环境容器内操作下载gor或提现准备好gor工具,这里是放在usr/bin目录下
#cd /usr/bin #chmod +x gor 修改gor权限为可执行
gor使用方法: gor --help 或 https://www.cnblogs.com/sunsky303/p/9072871.html
抓包
抓包保存到文件夹var目录下
#cd /var
#gor --input-raw :${PORT} --output-file ${APP_NAME}.gor -output-file-size-limit 1gb --output-file-queue-limit 0
APP_NAME:自己输出的流量文件名称
PORT:JAVA服务端口
说明: 使用--output-file-size-limit和--output-file-queue-limit选项设置块限制。块队列的长度和每个块的大小。默认值分别是256和32mb。可以使用后缀“k”(KB),“m”(MB)和“g”(GB)output-file-size-limit。如果你只想要大小限制,你可以设置--output-file-queue-limit为0,反之亦然
流量可直接转发 (不保存抓包文件)----不推荐
gor --input-raw :${PORT} --output-http "http://目标IP:${PORT}"
注意:这里可以抓包时间长一点,根据情况尽量多抓线上的流量,这样在重放时,放大倍数的效果更明显
流量重放
将文件下载到压测环境,放大倍数进行流量重放
gor --input-file "${APP_NAME}_0.gor|200%" --output-http "http://目标IP:${PORT}" --input-file-loop
说明: |200% 将流量按照 200%放大
--output-http "http://IP:端口” 压测环境容器ip和端口
观察结果
Prometheus实时监控,监控指标涉及到的指标:内存,CPU,GC,线程数
注意事项
线上流量重放到压测环境,部分请求涉及到TOKEN校验的问题,需要特殊处理