ApacheBench

nginx 限流配置详解

Posted by leone on 2018-04-20

ApacheBench

ApacheBench

是一个指令列程式,专门用来执行网站服务器的运行效能,特别是针对Apache 网站服务器。这原本是用来检测 Apache 网站服务器能够提供的效能,特别是可以看出Apache能提供每秒能送出多少网页。

ApacheBench( ab )工具程式是标准 Apache 网站服务器发布的一部分,跟 Apache 网站服务器一样,也是免费软件,并可以用 Apache许可证 的规范下散布此软件。

Apache Bench命令原理:

ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx、lighttpd、tomcat、IIS等其它Web服务器的压力。
ab命令对发出负载的计算机要求很低,既不会占用很高CPU,也不会占用很多内存,但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也须注意,否则一次上太多的负载,可能造成目标服务器因资源耗完,严重时甚至导致死机。

Apache Bench相关使用说明:

Apache HTTP Server 网站下载最新版,如果你要在 Windows 的环境执行 ApacheBench 可以直接下载 Win32 Binary 的版本就好,由于在线所提供的版本是 MSI 的封装档,安装好之后也等同于在你的计算机内安装了一套 Apache HTTP Server,如果你不需要多执行一套 Apache HTTP Server 的话,你可以在安装好之后进入 C:\Program Files\Apache Group\Apache2\bin 目录,找到 ab.exe 执行档,复制出来后再移除 Apache 安装即可,因为 ab.exe 是可以独立执行的,不需要任何关连的 dll 。

ApacheBeach使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
Usage: ab [options] [http[s]://]hostname[:port]/path
用法:ab [选项] 地址

选项:
Options are:
-n requests #执行的请求数,即一共发起多少请求。
-c concurrency #请求并发数。
-t timelimit #测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-s timeout #指定每个请求的超时时间,默认是30秒。
-b windowsize #指定tcp窗口的大小,单位是字节。
-B address #指定在发起连接时绑定的ip地址是什么。
-p postfile #指定要POST的文件,同时要设置-T参数。
-u putfile #指定要PUT的文件,同时要设置-T参数。
-T content-type #指定使用POST或PUT上传文本时的文本类型,默认是'text/plain'。
-v verbosity #设置详细模式等级。
-w #将结果输出到html的表中。
-i #使用HEAD方式代替GET发起请求。
-y attributes #以表格方式输出时,设置html表格tr属性。
-z attributes #以表格方式输出时,设置html表格th或td属性。
-C attribute #添加cookie,比如'Apache=1234'。(可重复)
-H attribute #为请求追加一个额外的头部,比如'Accept-Encoding: gzip'。(可重复)
-A attribute #对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。
-P attribute #对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
-X proxy:port #指定代理服务器的IP和端口。
-V #打印版本信息。
-k #启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。
-d #不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。
-q #如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。
-g filename #把所有测试结果写入一个'gnuplot'或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。
-e filename #产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。
-r #当收到错误时不要退出。
-h #输出帮助信息
-Z ciphersuite #指定SSL/TLS密码套件
-f protocol #指定SSL/TLS协议(SSL3, TLS1, TLS1.1, TLS1.2 or ALL)

模拟压测某个网站首页

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
[root@localhost ~]# ab -n 500 -c 10 http://gitee.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking gitee.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests


Server Software: nginx # 平台前端服务器类型
Server Hostname: gitee.com # 服务器主机名
Server Port: 80 # 服务器端口

Document Path: / # 访问的路径
Document Length: 178 bytes # 返回数据大小

Concurrency Level: 10 # 并发数
Time taken for tests: 3.898 seconds # 整个测试持续的时间
Complete requests: 500 # 完成的请求数量
Failed requests: 0 # 表示失败的请求数,这里的失败是指请求的连接服务器、发送数据、接收数据等环节发生异常,以及无响应后超时的情况。对于超时时间的设置可以用ab的-t参数。而如果接受到的http响应数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算是失败的请求
Write errors: 0 # 输出错误数量
Non-2xx responses: 500 #
Total transferred: 217500 bytes # 整个场景中的网络传输量,表示所有请求的响应数据长度总和,包括每个http响应数据的头信息和正文数据的长度。注意这里不包括http请求数据的长度,所以Total transferred代表了从Web服务器流向用户PC的应用层数据总长度。通过使用ab的-v参数即可查看详细的http头信息
HTML transferred: 89000 bytes # 整个场景中的HTML内容传输量,表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中http响应数据中头信息的长度
Requests per second: 128.26 [#/sec] (mean) # 每秒钟平均处理的请求数(相当于 LR 中的 每秒事务数)这便是我们重点关注的吞吐率,它等于:Complete requests / Time taken for tests
Time per request: 77.964 [ms] (mean) # 每次并发请求时间(当前并发10)
Time per request: 7.796 [ms] (mean, across all concurrent requests) # 平均每个请求处理时间,所有并发的请求加一起
Transfer rate: 54.49 [Kbytes/sec] received # 平均每秒网络流量

# 花费在连接Connect,处理Processing,等待Waiting的时间的最小min,平均值mean,标准差[+/-sd],中值median,最大表max的一个表。

Connection Times (ms)
min mean[+/-sd] median max
Connect: 23 27 1.3 27 30 # 连接
Processing: 36 49 7.8 50 155 # 处理
Waiting: 35 48 7.8 50 154 # 等待
Total: 61 75 8.0 76 180 # 总量

# 在一定比例的请求服务时间
Percentage of the requests served within a certain time (ms)
50% 76 # 50%的用户响应时间小于76毫秒
66% 79 # 66%的用户响应时间小于79毫秒
75% 80 # 以此类推...
80% 81
90% 83
95% 85
98% 87
99% 89
100% 180 (longest request)
[root@localhost ~]#

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 模拟1个客户端请求100次:
$ ab -n 100 http://www.example.com/


# 模拟100个客户端请求10000次
$ ab -n 10000 -c 100 http://www.example.com/

# 调用POST方法的接口10次,传输的数据格式为JSON
$ ab -n 10 -p json-file http://www.example.com/

# 调用OPTIONS方法的接口10次
$ ab -n 10 -m OPTIONS http://www.example.com/

# 输出每次请求的返回信息
$ ab -n 10 -v 2 http://www.example.com/

注意事项

  • 使用-H Content-Type 不能代替-T Content-Type指定Content-Type 头部

  • 如果提示ab: invalid URL,可能是URL最右边缺少/,例如http://www.example.com需要改为http://www.example.com/。

  • 需要注意如果压测的HTTP接口是通过返回结果判断是否成功(只要能响应都会返回200状态码),则需要自行去想办法识别失败的请求

  • ab属于一个轻量级的压测工具,结果不会特别准确,可以用作参考。
    追求准确的话,推荐使用jmeter或者LoadRunner。