认识
ab 是 Apache HTTP 服务器的基准测试工具,用于对 Apache HTTP 服务器进行基准测试。目的就是为了让你对当前的 Web Server 的性能有个印象。尤其显示了当前的 Web Server 每秒能处理的请求数。
ab 属于 httpd 软件包。
命令行语法
name=value ] [ -d ] [ -e csv-file ] [ -f protocol ] [ -g gnuplot-file ] [ -h ] [ -H custom-header ] [
-i ] [ -k ] [ -l ] [ -m HTTP-method ] [ -n requests ] [ -p POST-file ] [ -P proxy-auth-username:pass‐
word ] [ -q ] [ -r ] [ -s timeout ] [ -S ] [ -t timelimit ] [ -T content-type ] [ -u PUT-file ] [ -v
verbosity] [ -V ] [ -w ] [ -x <table>-attributes ] [ -X proxy[:port] ] [ -y <tr>-attributes ] [ -z
<td>-attributes ] [ -Z ciphersuite ] [http[s]://]hostname[:port]/path
命令行选项
下面是 ab 命令支持的选项
用于帮助类信息
-h/-V
显示帮助 / 版本信息。
用于数据分析类
-e csv-file
包含了处理每个相应百分比的请求所需要(从 1% 到 100%)的相应百分比的(以微妙为单位)时间
这通常比 gnuplot 文件有用,因为结果已经“二进制”了。
-g gnuplot-file
将所有测量值写为“gnuplot”或 TSV(Tab 分割)文件。该文件可以轻松地导入到 Gnuplot,IDL,Mathematica,Igor 甚至 Excel 等软件中。标签位于文件的第一行。
控制输出结果
-v verbosity
设置输出的详细等级。4+ 时打印标题;3+ 时打印响应代码(404,200 等),2 及以上打印警告和信息。
-w
在 HTML 表格中打印出结果。默认表是两列宽,带有白色背景
-x <table>-attributes
将字符串设置为 table 的标签。
-y <tr>-attributes
将字符串设置为 tr 的标签。
-z <td>-attributes
将字符串设置为 td 的标签。
请求设置类选项
-A auth-username:password
向 server 提供BASIC 认证凭据。username 和 password 使用冒号分割,以 base64 的形式发送。不管服务器需要都会发送认证字符串。关于BASIC 认证凭据请阅读《HTTP 权威指南》一书。
-b windowsize
TCP 的发送 / 接收缓冲的大小。以 byte 为单位。
-B local-address
发送请求时使用的地址。
-c concurrency
同时发送的并发请求数。默认一次只发送一个请求。
-C cookie-name=value
设置 Cookie。格式:name=value。
该参数可重复,即可以指定多个 Cookie。
-d
不要显示“在 XX[ms]表中服务的百分比”。(传统支持)。
-f protocol
指定 SSL/TLS 协议(SSL2,SSL3,TLS1,TLS1.1,TLS1.2,所有的)。
2.4.4 及更高版本中提供 TLS1.1 和 TLS1.2 支持。
-H custom-header
附加额外的请求头。格式是典型的请求头格式,比如:“Accept-Encoding:zip / zop; 8bit”
-i
执行 HEAD 请求。
-k
启用 HTTP KeepAlive 特征,比如:在一个 HTTP 会话中发送多次请求。
默认是没有 KeepAlive。
-l
在响应的长度不是常数的情况下不要报告错误。对于动态页面可能是有用的。2.4.7+ 可用。
-m HTTP-method
自定义 HTTP 方法。2.4.10+ 可用。
-n requests
总共要执行的请求数。如果未指定则只执行一次。
-p POST-file
POST-file 中包含了要 POST 的数据。别忘了使用-T 选项指定 Content-type。
-u PUT-file
PUT-file 包含了 PUT 发送的数据。别忘了设置-T 来指定 Content-type。
-P proxy-auth-username:password
向代理路由提供 BASIC 身份验证凭据。username 和 password 使用冒号分割,并以 base64 的形式发送。无论代理是否要求认证,都会发送认证字符串。
-q
当处理超过 150 个请求时,ab 每 10%或 100 个请求输出进度计数。而-q 会抑制这些消息。
-r
socket 接受接收错误的时候不退出。
-s timeout
socket 超时之前等待的最大秒数。默认值为 30 秒。2.4.4+ 支持。
-S
不要显示中位数和标准偏差值。当平均值和中位数是标准偏差的一倍或两倍以上时,不显示警告 / 错误信息。并默认为最小 / 平均值 / 最大值。(传统支持)。
-t timelimit
基准测试的最大秒数。这意味着内部的一个 50000。使用它来在固定总时间内,对服务器进行基准测试。
默认情况下没有时间限制。
-T content-type
对 POST/PUT 指定 Content-type 头。如:application/x-www-form-urlencoded。默认为 text/plain。
-X proxy[:port]
对请求使用代理服务器。
-Z ciphersuite
指定 SSL/TLS 加密套件
ab 输出值的解释
Server Software
第一个成功响应的服务器 HTTP 头中返回值(如果有)。
包括头中的所有字符从开始到点,检测到十进制值为 32(最值得注意的是:空格或 CR/LF)的字符。
Server Hostname
命令行中给出的 DNS 或者 IP 地址
Server Port
连接的端口号。如果未指定,http 为 80,https 为 443。
SSL/TLS Protocol
client 和 server 协商的协议参数。只有使用 SSL 时才会打印。
Document Path
从命令行中解析的请求 URI。
Document Length
第一个成功响应的文档的字节数。如果在测试的过程中,文档的长度出现了变化,响应会被视为错误。
Concurrency Level
并发 client 数量。
Time taken for tests
测试的时长:从第一个 socket 建立到收到最后一个请求。
Complete requests
接收到的成功的响应数。
Failed requests
失败的请求数量。如果有失败的请求,会打印出由于连接、读取、不正确的文本长度、异常的数量。
Write errors
写时发生的错误数量。
Non-2xx responses
非 200 系列的响应码的数量。如果响应码为 200 不会打印该字段。
Keep-Alive requests
导致 Keep-Alive 请求的连接数。
Total body sent
如果测试时,发送了数据,该字段显示发出的数据的总字节数。否则不会显示该字段。
Total transferred
从服务器接受的总字节数。这个数字本质上是通过“线”发送的字节数。
HTML transferred
从服务器接受到的文档字节数量。这个数量不包含 HTTP 头部。
Requests per second
每秒的请求数 = 请求数 / 总时间
Time per request
每个请求花费的时间。
第一个值通过公式: 并发 * 花费时间 * 1000 / done 来计算,而第二个值使用公式:花费时间 * 1000 / done 来计算。done 表示完成的请求数。
Transfer rate
传输速率 = totalread / 1024 / timetaken
改进
存在的 BUGS
有各种静态声明的固定长度的缓冲区。结合”懒惰解析”命令行参数,来自服务器和其他外部输入的响应头,这可能会造成一些影响。
没有完全实现 HTTP/1.x;只接受一些“预期”形式的响应。在配置文件中显示出当大的 strstr(3)的相使用,这可能表明性能问题;即衡量 ab 的性能而不是服务器的性能。
使用中的一些限制
ab 只能针对单个 URL 进行测试,但是实际中的压力测试环境要求的应该更复杂。而这一点 JMeter 可以做到。
使用 ab 工具,可以得到某个页面的访问性能,但这个结果跟用户的实际请求,很可能不一致。因为用户请求往往会附带着各种各种的负载(payload),而这些负载会影响 Web 应用程序内部的处理逻辑,从而影响最终性能。
可以用 wrk、TCPCopy、Jmeter、LoadRunner 等实现这个目标。像 Jmeter 或者 LoadRunner(商业产品),则针对复杂场景提供了脚本录制、回放、GUI 等更丰富的功能,使用起来也更加方便。
参考
man 1 ab
ab doc: https://httpd.apache.org/docs/2.4/programs/ab.html
ApacheBench Wiki: https://en.wikipedia.org/wiki/ApacheBench