Apache Bench,是 Apache 自带的压力测试工具。a可以对服务器进行访问压力测试。
系统安装 Apache Server,自带 ab 命令。
1. 概念
- 吞吐率:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
- 并发连接数:某一时刻服务器所接受的请求数(会话数)。
- 并发用户数:某一时刻服务器所接受的连接数,一个用户可能同时产生多个连接。
- 用户平均请求等待时间:总请求数 / 并发用户数。
- 服务器平均请求等待时间:处理完成所有请求数所花费的时间 / 总请求数。
2. 命令
➜ ~ ab
ab: wrong number of arguments
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
# 本次测试所发的总请求数
-n requests Number of requests to perform
#
-c concurrency Number of multiple requests to make at a time
-t timelimit Seconds to max. to spend on benchmarking
This implies -n 50000
-s timeout Seconds to max. wait for each response
Default is 30 seconds
-b windowsize Size of TCP send/receive buffer, in bytes
-B address Address to bind to when making outgoing connections
-p postfile File containing data to POST. Remember also to set -T
-u putfile File containing data to PUT. Remember also to set -T
-T content-type Content-type header to use for POST/PUT data, eg.
'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. 'Apache=1234'. (repeatable)
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-q Do not show progress when doing more than 150 requests
-l Accept variable document length (use this for dynamic pages)
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-r Don't exit on socket receive errors.
-m method Method name
-h Display usage information (this message)
-I Disable TLS Server Name Indication (SNI) extension
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol
(TLS1, TLS1.1, TLS1.2 or ALL)
3. 测试示例
3.1 基础访问测试
ab -n 1000 -c 10 http://cms.test.com/
测试结果如下
Server Software:
Server Hostname: cms.kaleidoapp.cn
Server Port: 80
Document Path: /
Document Length: 2746 bytes
Concurrency Level: 10
Time taken for tests: 8.352 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 2981000 bytes
HTML transferred: 2746000 bytes
Requests per second: 119.74 [#/sec] (mean)
Time per request: 83.517 [ms] (mean)
Time per request: 8.352 [ms] (mean, across all concurrent requests)
Transfer rate: 348.57 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 29 39 11.2 37 173
Processing: 33 43 12.0 42 190
Waiting: 32 43 12.0 41 189
Total: 62 82 17.8 79 226
Percentage of the requests served within a certain time (ms)
50% 79
66% 84
75% 89
80% 90
90% 93
95% 96
98% 135
99% 197
100% 226 (longest request)
结果可以看出:
- 吞吐率:119.74
- 整个测试持续的时间:8.352s
- 完成的请求数:1000
- 失败的请求数:0
- 总的网络传输量:2981000 bytes
- HTML内容传输量:2746000 bytes
- 用户平均请求等待时间:83.517 ms
- 服务器平均请求处理时间:8.352 ms
- 平均每秒网络上的流量:348.57 kb
网络消耗时间分解
展示最小、平均、方差、中位值、最大值。
Connection Times (ms)
min mean[+/-sd] median max
Connect: 29 39 11.2 37 173
Processing: 33 43 12.0 42 190
Waiting: 32 43 12.0 41 189
Total: 62 82 17.8 79 226
请求处理时间分布
可以看出,95% 的请求用时在 95ms 以内,最长请求时间为 226ms。
Percentage of the requests served within a certain time (ms)
50% 79
66% 84
75% 89
80% 90
90% 93
95% 96
98% 135
99% 197
100% 226 (longest request)
3.2 接口请求
ab -n 1000 -c 10 -p 'list.json' -T 'application/json' -H 'Authorization: token' -s 10 http://api.test.com/app/v1/list
说明:
-p 代表的是入参的 json 文件,或是 text 的键值对
-T 代表 contentType
-H 代表的是 http header 信息
-s 代表的是超时时间,单位是秒,默认是 30s