docker搭建并使用AB(apache bench)测试工具压力测试

构建镜像

构建镜像准备:

了解alpine:

Alpine Linux 是一个社区开发的面向安全应用的轻量级Linux发行版
构建的Alpine基础镜像的大小为6M 左右 …特点就是小 比咱们使用的linux小20倍左右…

准备Dockerfile
FROM alpine
RUN apk update                \
&& apk add apache2-utils  \
&& rm -rf /var/cache/apk/*

Apache Bench本身就是apache2-utils包中的一个工具,所以只需要在Alpine中执行apk add apache2-utils即可完成Apache Bench的镜像化

构建命令

docker build -t apachebench:v1 .

-t: 代表使用当前目录

-f使用指定目录 例如:docker build -f /xx/xx/Dockerfile apachebench:v1 .

如果遇到异常:error checking context: ‘file (’/proc/758/fd/7’) not found or excluded by .dockerignore’.
就在当前这个目录下创建 .dockerignore 文件 里面写入* (具体也不知道啥原因,网上是这样的解决方案,有知道的给我留言哈哈)

echo ‘*’ >> .dockerignore

再重新执行构建就可以了.
在这里插入图片描述

测试使用

启动容器

docker run -it --rm apachebench:v1

exit; 退出

-i: 交互式操作。

-t: 终端。

使用–rm ,容器将在退出时自动删除。

docker搭建并使用AB(apache bench)测试工具压力测试_第1张图片

执行命令

ab -n 1000 -c 100 http://localhost:8088/
如果带参数请把"" 起来.否则无法识别到第二个及以后参数
ab -n 1000 -c 100 “http://localhost:8088?a=a&b=b”

-n: 测试执行总次数

-c: 并行度,类似JMeter中的线程组和LR中的Virtual User

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)

docker搭建并使用AB(apache bench)测试工具压力测试_第2张图片

结果说明:
Completed 100 requests    完成100个请求
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests  完成1000个请求

--请求信息
Server Software:        
Server Hostname:        127.0.0.1 
Server Port:            8021

Document Path:          /send?type=TOPIC
Document Length:        95 bytes

Concurrency Level:      100   #并发数
Time taken for tests:   0.565 seconds     #测试所需的时间
Complete requests:      1000        #请求次数
Failed requests:        0       #失败次数
Non-2xx responses:      1000         #如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码
Total transferred:      200000 bytes     #  所有请求的响应数据总和(数据正文+Header信息)
HTML transferred:       95000 bytes               #所有请求的数据正文数据总和
Requests per second:    1771.19 [#/sec] (mean)      #吞吐量,平均每秒完成的请求数
Time per request:       56.459 [ms] (mean)      #平均每个请求所花时间 (用户平均等待时间)
Time per request:       0.565 [ms] (mean, across all concurrent requests)       #用户平均等待时间=
Transfer rate:          345.94 [Kbytes/sec] received       #传输率(单位时间从服务器获取的数据长度)

Connection Times (ms)   
              min  mean[+/-sd] median   max
Connect:        3    5   0.5      5       6
Processing:     5   48  31.6     45     124
Waiting:        5   43  30.8     38     120
Total:          9   53  31.6     50     129

这几行组成的表格主要是针对响应时间也就是第一个Time per request进行细分和统计。
一个请求的响应时间可以分成网络链接(Connect),系统处理(Processing)和等待(Waiting)三个部分。
表中min表示最小值; mean表示平均值;[+/-sd]表示标准差(Standard Deviation) ,也称均方差(mean square error),这个概念在中学的数学课上学过,表示数据的离散程度,数值越大表示数据越分散,系统响应时间越不稳定。 median表示中位数; max当然就是表示最大值了。
需要注意的是表中的Total并不等于前三行数据相加,因为前三行的数据并不是在同一个请求中采集到的,可能某个请求的网络延迟最短,但是系统处理时间又是最长的呢。所以Total是从整个请求所需要的时间的角度来统计的。
这里可以看到最慢的一个请求花费了129ms,这个数据可以在下面的表中得到验证。

Percentage of the requests served within a certain time (ms)    #在一定时间内处理的请求的百分比
  50%     50                    #50%请求的时间都在50ms内完成
  66%     72
  75%     83
  80%     84
  90%     96
  95%    105
  98%    115
  99%    119
 100%    129 (longest request)  #全部请求的时间都在129ms内完成

注释

结果关联关系(网上找的)

RPS(吞吐量)公式:

Requests per second = Complete requests / Time taken for tests = 1000 / 0.591 = 1692 (近似等于1693)

Time per request公式:

Time per request = Time taken for tests / (Complete requests / Concurrency Level)= 0.591 / 10 = 0.0591s = 59.1 ms

Time per request(mean, across all concurrent requests)公式:

Time per request(mean, across all concurrent requests) = Time taken for tests / Complete requests = 0.591 / 1000 = 0.000591s = 0.591ms

Transfer rate公式:

Transfer rate = Total transferred / Time taken for tests = 845000 / 0.591= 1429780.034 = 1429.78 kb/s(近似等于1397.07)

你可能感兴趣的:(docker,docker,apache,测试工具)