Linux 中的 ab 命令是 apache 自带的压力测试工具。ab 是 apachebench 命令的缩写。
ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问。它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。
ab 命令对发出负载的计算机要求很低,它既不会占用很高 CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载,其原理类似 CC 攻击。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
我们使用如下命令,安装 ab 工具,具体命令如下:
yum –y install httpd-tools
下载安装完成后,可输入 ab –V 命令来验证是否安装成功,具体命令如下:
ab –V
执行完毕后,如下图所示:
具体使用参数说明,可输入 ab –help 查看,具体命令如下:
ab –help
执行完毕后,如下图所示:
ab [options]
选项 | 功能 |
---|---|
options | 为命令行选项。 |
选项 | 描述 |
---|---|
-n | 在测试会话中,所执行的请求个数,默认时,仅执行一个;表示请求的总数量。 |
-c | 一次产生的请求个数,默认一次一个;表示请求的用户量。 |
-t | 指定每个请求的超时时间,默认是 30 秒。 |
选项 | 描述 |
---|---|
-p | 包含了需要 POST 的数据的文件。 |
-P | 对一个中转代理提供 BASIC 认证信任。用户名和密码由一个 : 隔开,并以 base64 编码形式发送。无论服务器是否需要(即, 是否发送了 401 认证需求代码),此字符串都会被发送。 |
-T | POST 数据所使用的 Content-type 头信息。 |
-v | 设置显示信息的详细程度 -4 或更大值会显示头信息,3 或更大值可以显示响应代码(404,200等),2 或更大值可以显示警告和其他信息。 |
-V | 显示版本号并退出。 |
-w | 以 HTML 表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。 |
-i | 执行 HEAD 请求,而不是 GET。 |
-x | 设置 <table> 属性的字符串。 |
-X | 对请求使用代理服务器。 |
-y | 设置 <tr> 属性的字符串。 |
-z | 设置 <td> 属性的字符串。 |
-C | 对请求附加一个 Cookie: 行。其典型形式是 name=value 的一个参数对,此参数可以重复。 |
-H | 对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如,“Accept-Encoding:zip/zop;8bit”)。 |
-A | 对服务器提供 BASIC 认证信任。用户名和密码由一个:隔开,并以 base64 编码形式发送。无论服务器是否需要(即,是否发送了 401 认证需求代码),此字符串都会被发送。 |
-h | 显示使用方法。 |
-d | 不显示 “percentage served within XX [ms] table” 的消息(为以前的版本提供支持)。 |
-e | 产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从 1% 到 100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经 “二进制化”,所以比 ‘gnuplot’ 格式更有用。 |
-g | 把所有测试结果写入一个 ‘gnuplot’ 或者 TSV(以 Tab 分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor 甚至 Excel 中。其中的第一行为标题。 |
-k | 启用 HTTP KeepAlive 功能,即在一个 HTTP 会话中执行多个请求。默认时,不启用 KeepAlive 功能。 |
-q | 如果处理的请求数大于 150,ab 每处理大约 10% 或者 100 个请求时,会在 stderr 输出一个进度计数。此 -q 标记可以抑制这些信息。 |
字段 | 描述 |
---|---|
Server Software | 表示被测试的 Web 服务器软件名称。 |
Server Hostname | 表示请求的 URL 主机名。 |
Server Port | 表示被测试的 Web 服务器软件的监听端口。 |
Document Path | 表示请求的 URL 中的根绝对路径,通过该文件的后缀名,我们一般可以了解该请求的类型。 |
Document Length | 表示 HTTP 响应数据的正文长度。 |
Concurrency Level | 表示并发用户数,这是我们设置的参数之一。 |
Time taken for tests | 表示所有这些请求被处理完成所花费的总时间。 |
Complete requests | 表示总请求数量,这是我们设置的参数之一。 |
Failed requests | 表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。 如果接收到的 HTTP 响应数据的头信息中含有 2XX 以外的状态码,则会在测试结果中显示另一个名为 “Non-2xx responses” 的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中。 |
Total transferred | 表示所有请求的响应数据长度总和,包括每个 HTTP 响应数据的头信息和正文数据的长度。注意这里不包括 HTTP 请求数据的长度,仅仅为 web 服务器流向用户 PC 的应用层数据总长度。 |
HTML transferred | 表示所有请求的响应数据中正文数据的总和,也就是减去了 Total transferred 中 HTTP 响应数据中的头信息的长度。 |
Requests per second | 吞吐率,也叫 QPS,计算公式:Complete requests/Time taken for tests |
Time per request | 用户平均请求等待时间,从用户角度看,完成一个请求所需要的时间。计算公式:Time token for tests/(Complete requests/Concurrency Level)。 |
Time per requet(across all concurrent request) | 服务器完成一个请求的时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。 也可以这么统计:Time per request/Concurrency Level。 |
Transfer rate | 表示网络传输速度,计算公式:Total trnasferred/ Time taken for tests,这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量。 |
Percentage of requests served within a certain time(ms) | 这部分数据用于描述每个请求处理时间的分布情况,比如以上测试,80% 的请求处理时间都不超过 2ms,这个处理时间是指前面的 Time per request,即对于单个用户而言,平均每个请求的处理时间。 这个表第一行表示有 50% 的请求都是在 2ms 内完成的,可以看到这个值是比较接近平均系统响应时间,以此类推。 |
Connection Times (ms) | 这几行组成的表格主要是针对响应时间也就是第一个 Time per request 进行细分和统计。一个请求的响应时间可以分成网络链接(Connect),系统处理(Processing)和等待(Waiting)三个部分。表中 min 表示最小值; mean 表示平均值;[+/-sd]表示标准差(Standard Deviation) ,也称均方差(mean square error),这个概念在中学的数学课上学过,表示数据的离散程度,数值越大表示数据越分散,系统响应时间越不稳定。 median 表示中位数; max 当然就是表示最大值了。 需要注意的是表中的 Total 并不等于前三行数据相加,因为前三行的数据并不是在同一个请求中采集到的,可能某个请求的网络延迟最短,但是系统处理时间又是最长的呢。所以Total 是从整个请求所需要的时间的角度来统计的。这里可以看到最慢的一个请求花费了2ms(即 100% 2 (longest request))。 |
ab -n1000 -c100 https://www.haicoder.net/
我们使用 ab 命令,测试共 1000 次请求,并发数为 100,具体命令如下:
ab -n1000 -c100 https://www.haicoder.net/
运行后,终端输出如下:
我们看到,我们使用了 ab 命令测试了服务器的性能。
ab 命令会创建多个并发访问线程,模拟多个访问者同时对某一 URL 地址进行访问。它的测试目标是基于 URL 的,因此,它既可以用来测试 apache 的负载压力,也可以测试 nginx、lighthttp、tomcat、IIS 等其它 Web 服务器的压力。