「ab」- Apache 基准测试 | Apache Benchmark

认识

ab 是 Apache HTTP 服务器的基准测试工具,用于对 Apache HTTP 服务器进行基准测试。目的就是为了让你对当前的 Web Server 的性能有个印象。尤其显示了当前的 Web Server 每秒能处理的请求数。

ab 属于 httpd 软件包。

命令行语法

ab [ -A auth-username:password ] [ -b windowsize ] [ -B local-address ] [ -c concurrency ] [ -C cookie-

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

如果测试时,发送了数据,该字段显示发出的数据的总字节数。否则不会显示该字段。

If configured to send data as part of the test, this is the total number of bytes sent during the tests. This field is omitted if the test did not include a body to send.

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