电商领域中, 每到各种活动, 什么 618, 双十一, 双十二, 各种优惠活动就纷至沓来, 对营销工具是一个巨大的挑战, 因此, 营销相关系统的压测是保障系统稳定运行,应对突发流量的必要手段.
优惠券系统作为营销工具中的一种大杀器, 其稳定性保障必不可少.
下面主要介绍我负责的优惠券系统在应对双十一突发流量的压测过程:
1. 压测前准备
下载 压测工具: Jmeter
提前统计好每个要压测接口的数据: 日常QPS, 99线, 双十一预估QPS
压测线程数计算: 1000/接口99线 x 线程数 = 目标QPS
日常QPS:系统非活动时的 QPS, 去系统监控大盘查看, 如 cat
99线: 99% 的请求耗时(ms)
双十一预估QPS: 每个公司规定不同, 我司是日常 QPS 的 50-100 倍,根据接口业务场景选择
线程数: 压测中在 Jmeter 中填写的线程数
启动 jmeter
$ jmeter [10:17:24]
WARNING: package sun.awt.X11 not in java.desktop
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
由 jmeter 启动信息可知,我们应该使用 GUI 编写压测脚本, 用命令行 jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder] 进行压测
Jmeter 的基本使用去晚上找个demo案例,亲自操作一番即可, 下面我主要介绍生产级别的 Jmeter 脚本编写
Jmeter 脚本编写
新建一个文件夹: testplan
打开 jmeter ,
语言体调整为中文, options -> choose Language -> chinese
创建 testplan:
保存到 我们 创建的 testplan 文件夹
右键添加 HTTP 请求默认值
填写你的压测环境, 一般脚本测试使用 test 环境
添加 JSON 断言: 当响应 code 为 10000 时为成功
根据你的系统请求参数,添加 相应的请求头: HTTP信息头管理器
添加: 聚合报告: 可以查看 接口压测信息
做完上面的通用步骤, 接下来就开始真正的接口压测了:
testplan 上右键,添加 线程组, 线程组的概念可以理解为一个具体测压测接口, 包括请求地址, 参数, 线程数,都在这里面设置
线程数: 根据上面的计算公式,自己计算
Ramp_Up: 在 10秒内逐步启动 100 个线程
持续时间: 防止压测接口一直执行, 定个 持续时间
添加HTTP 请求
重点关注下: ${calcReceivedPromotionForProductList} 这个就是我们的请求参数集, 因为压测我们要尽量模拟真实的用户请求, 一个方法就是 从线上日志中, 拉出一批请求,保存再文件中, 让压测接口去读取, 而 ${calcReceivedPromotionForProductList} 就是我们从线上拉取的请求参数. 下面介绍下,如何添加这个请求参数集
添加: CSV 数据文件设置
在我们的 testplan 文件夹中创建 文件夹: requests, 然后新建: calcReceivedPromotionForProductList-test.txt 文件,里面就是请求参数,我这里使用换行分割
请求参数编写完成, 还要再添加一个 观察结果树, 用来查看压测时每个接口的响应情况, 包括出入参等:
至此, 一个压测接口就编写完成,我们点击 Jmeter 菜单栏上的额启动按钮,测试下并查看聚合报告
我这里写了两个线程组, 也就是两个接口, 可以按照上面的步骤,添加你自己需要的压测接口
线上压测
根据 Jmeter 的建议,线上压测,我们不能使用 GUI, 需要使用命令行.
那我们上面的压测接口举例, 我们 Jmeter 命令执行如下:
jmeter -n -t ./优惠券-lzg.jmx -l ./result/result.txt -e -o ./webreport
优惠券-lzg.jmx 为测试计划文件路径
/result/result.txt 为测试结果文件路径
/webreport 为web报告保存路径。
注意我们的文件夹: testplan 下执行此命令, 里面用到的 文件我们都是使用 相对文件位置,这样做的好处是,我们可以直接把 testplan 文件夹打为一个压缩包,上传到我们的跳板机去执行压测请求
命令行进入 testplan 文件夹下,执行
可以看到 testplan 文件夹下多了一个 测试报告
双击打开就能在浏览器中查看此次压测结果
至此, 一个线上的压测接口的编写已经介绍完成, Jmeter 还有一些更高级的功能, 感兴趣的可以去官网看其介绍.
|