Apache Bench(简称为 ab) 是 Apache 提供用于对 Apache http server 进行基准测试的工具。但是由于其安装和使用简单,所以也可以用于对 HTTP 接口的压力测试和性能测试。
ab 是一个命令行工具,使用 ab 命令可以模拟多线程并发请求,并且对负载机的要求很低,既不会占用很高 CPU,也不会占用很多内存,但却会给目标服务器造成巨大的负载,其原理类似 DDOS/CC 攻击。
ab 可以提供需要的基本性能指标;但是缺点就是没有图形化结果,不能监控。
Tips:在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对 web 服务器进行压力测试,往往效果不理想(因为网络延时过大或带宽不足)
更多内容可以学习《测试工程师 Python 工具开发实战》书籍、《大话性能测试 JMeter 实战》书籍
Apache 本身会自带 ab,如果没有安装 Apache,以下方法可以用来便捷的安装 ab 工具:
Ubuntu
apt-cache install apache2-util
CentOS
yum install httpd-tools
MacOS
系统自带 apache,查看版本信息:
Windows
Windows 下可以在官网下载最新版本 ,然后按照引导安装即可
使用以上方法安装完成后,在已添加环境变量的情况下,可以直接使用 ab -V 检查是否安装成功。
使用
Options
Usage
注意事项:
1)result.html 中会打印每次请求的请求头信息,请求总数较大时,重定向结果输出时可以不指定-v 参数;
2)使用-H Content-Type:application/json 不能代替-T
3)"application/json", 使用前者服务器可能会返回 400 bad requests;
4)如果提示 ab: invalid URL,可能是 URL 最右边缺少/,例如 http://www.example.com 需要改为http://www.example.com/ ;
5)不支持发送 https 请求;
6)postfile 注意使用正确的编码格式,否则请求参数服务器端可能无法识别;
7)调试请求时,对接口返回的中文字符的支持不友好,会显示乱码;
从上面可以看到 ab 支持参数很多,但一般来说只有-c 和-n 参数是必要的,例如:
AB 和 JMETER 比较
下面分别用 ab 和 jmeter 压测一个 Get 请求,然后通过对比效果,来简单分析二者的异同:
1、ab
在 ab 命令行中设置 10 个并发,持续 60s,结果如下:
2、Jmeter
在 JMETER GUI 界面中编辑脚本信息,线程数设置 10,R-U 时间设置 1s,循环次数设置 Forever。如下图:
然后使用 JMETER 命令行模式运行脚本,这是因为使用非 GUI 模式可以节省负载机资源,测试结果更加准确
在 GUI 界面中打开 JmeterWar.csv 文件,如下:
二者对比:
通过以上表格数据进行分析,可以发现二者的测试效果竟然是如此的接近,但实际上述数据并不是太准确,因为 Jmeter 实际不支持精确的测试时间的限制,所以我是到达 60s 后手动强制杀死进程,这就导致有些请求可能被漏掉,但通过比较聚合数据,基本上误差是在可以接受的范围内。
jmeter 是一次完整的请求和返回, 而 AB 只是发出去请求,并不对返回做处理,只是请求发送成功或者失败。所以从准确性来说,Jmeter 更准确,而 AB 速度更快,可以用最少的机器资源产生更多的访问请求;
Jmeter 本身支持断言、可变参数和 CSV 数据集的输入,能设定更加灵活多变的的测试场景,而 AB 则不支持(暂时没想到);
Jmeter 可以提供更加详细的统计结果数据,比如接口错误信息、单线程的请求时间等,而 AB 则不支持;
Jmeter 不支持精确时间的压测,比如压测 10 分钟,但是 AB 支持;
Jmeter 支持分布式的压测集群,且支持函数,AB 不支持;
软件自身耗费资源:
Jmeter 由于比较重,且统计了很多结果数据,比 AB 耗时耗费资源多,AB 属于超轻量级,在开发测试过程中十分适合做单接口压测。