Apache Bench(ab)是一个对HTTP Web服务器(基于HTTP/HTTPS协议)进行负载测试和基准测试的开源免费、跨平台的单线程命令行工具。
如果此前你已经安装了 Apache Web Server,那么 ab 工具应该也是一起自动安装了的。当然ab也可以单独作为Apache实用工具单独安装。
注意:
ab的负载测试类似于DOS攻击,没有指令可以在运行测试时按特定间隔增加/减少并发性(即:不能梯度加压测试或梯度减压测试-JMeter可以实现加压测试,但使用上没有ab简单)- 不论将
ab的并发数设置到多大,ab始终是通过单线程的方式来执行的,因此:当需要进行量级非常大的高并发测试时,ab本身单线程的处理能力却成了瓶颈从而导致并发测试结果不准确(一下子发起的请求或请求返回来的结果太多,ab自身处理不过来)!
原句:Apache Bench uses only one operating system thread irrespective of the concurrency level (specified by the -c flag). Therefore, when benchmarking high-capacity servers, a single instance of Apache Bench can itself be a bottleneck. To completely saturate the target URL, it is better to use additional instances of Apache Bench in parallel, if your server has multiple processor cores.
因此:ab 更适合单一URL的非精准压力测试!
安装
# Ubuntu/Debian
apt-get install apache2-utils
# RHEL/CentOS/Fedora
yum -y install httpd-tools
安装完毕之后,可以使用 ab -V 或 ab -h 验证安装是否成功!

使用说明
ab 的功能定位都很简单,用法:ab [options] [http[s]://]hostname[:port]/path。

参数
请求设置
| 参数 | 作用 |
|---|---|
| -X |
设置代理信息 |
| -P |
设置代理网络认证 |
| -A |
添加基本网络请求认证 |
| -E |
指定客户端私钥证书 |
| -B <address> | 绑定出口IP地址 |
| -H |
设置额外请求头信息,如:’Accept-Encoding: gzip’ (该参数可重复添加多个值) |
| -C <key=value> | 为请求头附加Cookie信息(该参数可重复添加多个值) |
| -n |
发起的请求次数 |
| -c |
并发请求数(!!!注意:并发数设置不能大于请求总数) |
| -t |
设置整个测试过程的时间限制-默认没有限制 |
| -s |
设置测试过程中每一个请求的等待时间-默认为 30 秒 |
| -b |
设置TCP发送/接收缓冲区的大小,单位-字节 |
| -T |
为POST/PUT请求设置Header中的Content-type。如:'application/x-www-form-urlencoded'-默认'text/plain' |
| -k | 使用 HTTP KeepAlive 持久连接功能 |
| -i | 使用 HEAD 而不是 GET 请求方式 |
| -m |
设置HTTP请求方法 |
| -p |
POST请求的文件数据(记得设置-T参数) |
| -u |
PUT请求的文件数据 (记得设置-T参数) |
打印结果
| 参数 | 作用 |
|---|---|
| -v |
设置输出信息的详细程度(1-打印测试结果;2-在上一个等级基础上额外增加打印请求头+打印警告信息;3-在上一个等级基础上额外增加打印响应头;) |
| -w | 用HTML table 方式将结果打印在stdout(通过管道重定向到文件便于查看、邮件) |
| -x |
当使用-w参数输出时,在<table>标签的属性输出 |
| -y |
当使用-w参数输出时,在<tr>标签的属性输出 |
| -z |
当使用-w参数输出时,在<td>、<th>标签的属性输出 |
| -d | 不要显示请求百分比-毫秒时刻表 |
| -S | 不要打印结果 warning 级别信息 |
| -q | 当执行超过150个请求时,不显示进度 |
| -l | 接受可变的文档长度(用于动态页面) |
| -g |
将请求统计数据输出到文件(颇为鸡肋) |
| -e |
将请求进度-百分比数据输出到文件(颇为鸡肋) |
| -r | 不要在socket接收错误时退出 |
结果分析
服务器信息
- Server Software -
Web服务器的名称,对应HTTP Respone Headers中Server的值,因此该值不一定有或正确 - Server Hostname - 服务器主机名
- Server Port - 服务器端口(80-http;443-https)
- SSL/TLS Protocol - 客户端和服务器之间协商的协议参数(只有使用了
SSL才会有值) - Server Temp Key - 服务器临时密钥信息(不一定有该结果)
- TLS Server Name - 公钥服务器名称
传输信息
- Document Path - 测试的页面路径
- Document Length - 页面大小
(重点)压测结果
- Concurrency Level - 并发数(同一时间发起的)
- Time taken for tests - 整个测试过程的耗时
- Complete requests - 成功的请求数
- Failed requests - 失败的请求数
- Total transferred - 整个测试过程网络传输量(单位:字节)
- HTML transferred - 整个测试过程
HTML传输量(单位:字节) - Requests per second - 吞吐率(
RPS-单位:reqs/s) = 成功总请求数(Complete requests) / 测试过程耗时(Time taken for tests) - Time per request - 用户平均请求等待时间 = 总时间(
Time taken for tests) / (总请求数-Complete requests/ 并发用户数-Concurrent Level) - Time per request(across all concurrent requests) - 服务器平均等待时间 = 总时间-
Time taken for tests/ 成功总请求数-Complete requests - Transfer rate - 平均网络传输流量(可以帮助排除是否存在网络流量过大导致响应时间延长的问题)
网络连接耗时-毫秒
格式:最小值、平均值、中位数、最大值
- Connect -
TCP连接耗时 - Processing - 服务端处理耗时
- Waiting - 等待耗时
- Total - 完整请求耗时
推荐阅读:


