searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Apache Benchmark(AB)压测工具实践

2023-06-29 07:24:20
96
0

AB压测工具可以用来对Web服务镜像压力测试,模拟并发请求对被压测系统执行压力测试,并且输出多想性能测试指标结果值,本文使用该工具对k8s集群中的nginx Pod进行压力测试。

服务压测拓扑:

创建nginx工作负载,工作负载的yaml文件示例为:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: liusu-nginx
  labels:
    app: liusu-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: liusu-nginx
  template:
    metadata:
      labels:
        app: liusu-nginx
    spec:
      nodeSelector:
        kubernetes.io/app: test
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: kubernetes.io/hostname
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app: liusu-nginx
      containers:
      - name: liusu-nginx
        image: docker.io/library/nginx:1.20.2

创建一个服务service关联到这个nginx工作负载上,服务的yaml文件示例为:

kind: Service
apiVersion: v1
metadata:
  name: liusu-service
  namespace: default
  labels:
    app: liusu-service
spec:
  ports:
    - name: http-0
      protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: liusu-nginx
  type: ClusterIP

在测试节点上安装 ab 测试工具:

使用方法:

ab [选项] http://hostname:port/path

选项解释:

-n requests 在测试会话中所执行的请求总个数,默认一个
-c concurrency 一次产生的请求个数,默认一个

执行压测命令示例:

ab -c 1 -n 1 http://10.96.123.181:80/

如下所示为执行了一次压测的输出结果,下面对该输出结果进行解释说明:

[root@gz15-ct4-az1-compute-s7-10e63e0e245 ~]# ab -c 100 -n 100000 http://10.96.123.181:80/
This is ApacheBench, Version 2.3 <$Revision: 1874286 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.96.123.181 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        nginx/1.20.2
Server Hostname:        10.96.123.181
Server Port:            80

Document Path:          /
Document Length:        612 bytes

Concurrency Level:      100
Time taken for tests:   2.683 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      84500000 bytes
HTML transferred:       61200000 bytes
Requests per second:    37277.66 [#/sec] (mean)
Time per request:       2.683 [ms] (mean)
Time per request:       0.027 [ms] (mean, across all concurrent requests)
Transfer rate:          30761.35 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.2      1       3
Processing:     0    2   0.3      2       4
Waiting:        0    1   0.3      1       3
Total:          1    3   0.3      3       5

Percentage of the requests served within a certain time (ms)
  50%      3
  66%      3
  75%      3
  80%      3
  90%      3
  95%      3
  98%      3
  99%      4
 100%      5 (longest request)
  • 命令:ab -c 100 -n 100000 http://10.96.123.181:80/代表模拟100个并发对地址http://10.96.123.181:80/发起总计100000次请求

  • Document Path:请求的具体文件

  • Document Length:请求的具体文件的大小

  • Concurrency Level:并发级别即并发数,请求中的-c参数指定的值

  • Time taken for tests:本次测试总共花费的时间

  • Complete requests:本次测试总共发起的请求数量

  • Failed requests:失败的请求数量。因网络原因或者服务器性能原因,发起的请求不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考

  • Total transferred:总共传输的数据量,指的是ab从被测试服务器接收的总数据量,包括index.html的文本内容和请求头信息

  • HTML transferred:从服务器接收到的index.html文件的总大小,等于Document Length * Complete requests

  • Requests per second:平均每秒完成的请求数:QPS,这是一个平均值,等于Complete requests / Time taken for tests

  • Time per request: 2.683 [ms] (mean):从用户角度看,完成一个请求所需要的时间,因用户数量不止一个,服务器完成10个请求,平均每个用户才接收到一个完整的返回,所以该值是下一项数值的10

  • Time per request: 0.027 [ms] (mean, across all concurrent requests):服务器完成一个请求的时间

  • Transfer rate:网络传输速度。对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息

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

  • Percentage of the requests served within a certain time (ms):这个表第一行表示有50%的请求都是在3ms内完成的,可以看到这个值是比较接近平均系统响应时间:第一个Time per request。以此类推,90%的请求是小于等于3ms的。刚才我们看到响应时间最长的那个请求是5ms,那么显然所有请求100%的时间都是小于等于5毫秒的,也就是表中最后一行的数据肯定是时间最长的那个请求longest request

测试结果:

  • Pod副本数1

序号 总请求数 并发数 Requests per second(QPS) Time taken for tests Failed requests Time per request P99 P100
1 1000000 100 26480.24 37.764 s 0 3.776 ms 5 ms 9 ms
2 1000000 200 26402.27 37.876 s 0 7.575 ms 9 ms 16 ms
3 1000000 300 25767.60 38.808 s 0 11.643 ms 14 ms 20 ms
4 1000000 400 26265.36 38.073 s 0 15.229 ms 18 ms 25 ms
5 1000000 500 25391.22 39.384 s 0 19.692 ms 23 ms 33 ms
6 1000000 600 26201.09 38.166 s 0 22.900 ms 27 ms 233 ms
7 1000000 700 26478.30 37.767 s 0 26.437 ms 31 ms 236 ms
8 1000000 800 25846.25 38.690 s 0 30.952 ms 36 ms 1067 ms
9 1000000 900 25882.31 38.636 s 0 34.773 ms 40 ms 1061 ms
10 1000000 1000 25560.24 39.123 s 0 39.123 ms 45 ms 255 ms
11 1000000 1100 25346.98 39.452 s 1152 43.398 ms 50 ms 263 ms
12 1000000 1200 25960.62 38.520 s 7680 46.224 ms 53 ms 263 ms
13 1000000 1300 34338.41 29.122 s 3008 37.858 ms 53 ms 260 ms
14 1000000 1400 25442.11 39.305 s 102336 55.027 ms 65 ms 276 ms
15 1000000 1500 26970.63 37.077 s 126565 55.616 ms 68 ms 1122 ms

  • Pod副本数10

 

序号 总请求数 并发数 Requests per second(QPS) Time taken for tests Failed requests Time per request P99 P100
1 1000000 100 23902.80 41.836 s 0 4.184 ms 5 ms 13 ms
2 1000000 200 23637.22 42.306 s 0 8.461 ms 10 ms 29 ms
3 1000000 300 23396.11 42.742 s 0 12.823 ms 14 ms 28 ms
4 1000000 400 23930.52 41.788 s 0 16.715 ms 18 ms 24 ms
5 1000000 500 23362.24 42.804 s 0 21.402 ms 23 ms 28 ms
6 1000000 600 31987.30 31.262 s 0 18.757 ms 21 ms 31 ms
7 1000000 700 31812.36 31.434 s 0 22.004 ms 24 ms 34 ms
8 1000000 800 23346.49 42.833 s 0 34.266 ms 37 ms 50 ms
9 1000000 900 31396.92 31.850 s 0 28.665 ms 36 ms 50 ms
10 1000000 1000 23541.75 42.478 s 0 42.478 ms 46 ms 55 ms
11 1000000 1100 31111.62 32.142 s 0 35.357 ms 38 ms 54 ms
12 1000000 1200 30877.27 32.386 s 0 38.864 ms 52 ms 57 ms
13 1000000 1300 31612.70 31.633 s 0 41.123 ms 44 ms 69 ms
14 1000000 1400 30513.07 32.773 s 0 45.882 ms 62 ms 70 ms
15 1000000 1500 30752.16 32.518 s 0 48.777 ms 52 ms 60 ms
16 1000000 2000 23408.74 42.719 s 0 85.438 ms 91 ms 1140 ms
17 1000000 2500 29810.78 33.545 s 0 83.862 ms 88 ms 104 ms
18 1000000 5000 27419.79 36.470 s 0 182.350 ms 232 ms 449 ms
19 1000000 7500 23122.18 43.249 s 0 324.364 ms 349 ms 378 ms
20 1000000 10000 23001.37 43.476 s 3840 434.757 ms 471 ms 643 ms
21 1000000 12500 25904.69 38.603 s 22656 482.538 ms 604 ms 867 ms
22 1000000 15000 5797.20 172.497 s 151869 2587.456 9959 ms 10529 ms

结论:

从上述测试结果中可以看出当Pod副本数增加时可以显著提升压测的并发值,即生产环境中可以通过增加副本数的方式来提升服务的性能。

0条评论
0 / 1000
刘****苏
6文章数
0粉丝数
刘****苏
6 文章 | 0 粉丝
原创

Apache Benchmark(AB)压测工具实践

2023-06-29 07:24:20
96
0

AB压测工具可以用来对Web服务镜像压力测试,模拟并发请求对被压测系统执行压力测试,并且输出多想性能测试指标结果值,本文使用该工具对k8s集群中的nginx Pod进行压力测试。

服务压测拓扑:

创建nginx工作负载,工作负载的yaml文件示例为:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: liusu-nginx
  labels:
    app: liusu-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: liusu-nginx
  template:
    metadata:
      labels:
        app: liusu-nginx
    spec:
      nodeSelector:
        kubernetes.io/app: test
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: kubernetes.io/hostname
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app: liusu-nginx
      containers:
      - name: liusu-nginx
        image: docker.io/library/nginx:1.20.2

创建一个服务service关联到这个nginx工作负载上,服务的yaml文件示例为:

kind: Service
apiVersion: v1
metadata:
  name: liusu-service
  namespace: default
  labels:
    app: liusu-service
spec:
  ports:
    - name: http-0
      protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: liusu-nginx
  type: ClusterIP

在测试节点上安装 ab 测试工具:

使用方法:

ab [选项] http://hostname:port/path

选项解释:

-n requests 在测试会话中所执行的请求总个数,默认一个
-c concurrency 一次产生的请求个数,默认一个

执行压测命令示例:

ab -c 1 -n 1 http://10.96.123.181:80/

如下所示为执行了一次压测的输出结果,下面对该输出结果进行解释说明:

[root@gz15-ct4-az1-compute-s7-10e63e0e245 ~]# ab -c 100 -n 100000 http://10.96.123.181:80/
This is ApacheBench, Version 2.3 <$Revision: 1874286 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.96.123.181 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:        nginx/1.20.2
Server Hostname:        10.96.123.181
Server Port:            80

Document Path:          /
Document Length:        612 bytes

Concurrency Level:      100
Time taken for tests:   2.683 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      84500000 bytes
HTML transferred:       61200000 bytes
Requests per second:    37277.66 [#/sec] (mean)
Time per request:       2.683 [ms] (mean)
Time per request:       0.027 [ms] (mean, across all concurrent requests)
Transfer rate:          30761.35 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.2      1       3
Processing:     0    2   0.3      2       4
Waiting:        0    1   0.3      1       3
Total:          1    3   0.3      3       5

Percentage of the requests served within a certain time (ms)
  50%      3
  66%      3
  75%      3
  80%      3
  90%      3
  95%      3
  98%      3
  99%      4
 100%      5 (longest request)
  • 命令:ab -c 100 -n 100000 http://10.96.123.181:80/代表模拟100个并发对地址http://10.96.123.181:80/发起总计100000次请求

  • Document Path:请求的具体文件

  • Document Length:请求的具体文件的大小

  • Concurrency Level:并发级别即并发数,请求中的-c参数指定的值

  • Time taken for tests:本次测试总共花费的时间

  • Complete requests:本次测试总共发起的请求数量

  • Failed requests:失败的请求数量。因网络原因或者服务器性能原因,发起的请求不一定全部成功,通过该数值和Complete requests相除可以计算请求的失败率,作为测试结果的重要参考

  • Total transferred:总共传输的数据量,指的是ab从被测试服务器接收的总数据量,包括index.html的文本内容和请求头信息

  • HTML transferred:从服务器接收到的index.html文件的总大小,等于Document Length * Complete requests

  • Requests per second:平均每秒完成的请求数:QPS,这是一个平均值,等于Complete requests / Time taken for tests

  • Time per request: 2.683 [ms] (mean):从用户角度看,完成一个请求所需要的时间,因用户数量不止一个,服务器完成10个请求,平均每个用户才接收到一个完整的返回,所以该值是下一项数值的10

  • Time per request: 0.027 [ms] (mean, across all concurrent requests):服务器完成一个请求的时间

  • Transfer rate:网络传输速度。对于大文件的请求测试,这个值很容易成为系统瓶颈所在。要确定该值是不是瓶颈,需要了解客户端和被测服务器之间的网络情况,包括网络带宽和网卡速度等信息

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

  • Percentage of the requests served within a certain time (ms):这个表第一行表示有50%的请求都是在3ms内完成的,可以看到这个值是比较接近平均系统响应时间:第一个Time per request。以此类推,90%的请求是小于等于3ms的。刚才我们看到响应时间最长的那个请求是5ms,那么显然所有请求100%的时间都是小于等于5毫秒的,也就是表中最后一行的数据肯定是时间最长的那个请求longest request

测试结果:

  • Pod副本数1

序号 总请求数 并发数 Requests per second(QPS) Time taken for tests Failed requests Time per request P99 P100
1 1000000 100 26480.24 37.764 s 0 3.776 ms 5 ms 9 ms
2 1000000 200 26402.27 37.876 s 0 7.575 ms 9 ms 16 ms
3 1000000 300 25767.60 38.808 s 0 11.643 ms 14 ms 20 ms
4 1000000 400 26265.36 38.073 s 0 15.229 ms 18 ms 25 ms
5 1000000 500 25391.22 39.384 s 0 19.692 ms 23 ms 33 ms
6 1000000 600 26201.09 38.166 s 0 22.900 ms 27 ms 233 ms
7 1000000 700 26478.30 37.767 s 0 26.437 ms 31 ms 236 ms
8 1000000 800 25846.25 38.690 s 0 30.952 ms 36 ms 1067 ms
9 1000000 900 25882.31 38.636 s 0 34.773 ms 40 ms 1061 ms
10 1000000 1000 25560.24 39.123 s 0 39.123 ms 45 ms 255 ms
11 1000000 1100 25346.98 39.452 s 1152 43.398 ms 50 ms 263 ms
12 1000000 1200 25960.62 38.520 s 7680 46.224 ms 53 ms 263 ms
13 1000000 1300 34338.41 29.122 s 3008 37.858 ms 53 ms 260 ms
14 1000000 1400 25442.11 39.305 s 102336 55.027 ms 65 ms 276 ms
15 1000000 1500 26970.63 37.077 s 126565 55.616 ms 68 ms 1122 ms

  • Pod副本数10

 

序号 总请求数 并发数 Requests per second(QPS) Time taken for tests Failed requests Time per request P99 P100
1 1000000 100 23902.80 41.836 s 0 4.184 ms 5 ms 13 ms
2 1000000 200 23637.22 42.306 s 0 8.461 ms 10 ms 29 ms
3 1000000 300 23396.11 42.742 s 0 12.823 ms 14 ms 28 ms
4 1000000 400 23930.52 41.788 s 0 16.715 ms 18 ms 24 ms
5 1000000 500 23362.24 42.804 s 0 21.402 ms 23 ms 28 ms
6 1000000 600 31987.30 31.262 s 0 18.757 ms 21 ms 31 ms
7 1000000 700 31812.36 31.434 s 0 22.004 ms 24 ms 34 ms
8 1000000 800 23346.49 42.833 s 0 34.266 ms 37 ms 50 ms
9 1000000 900 31396.92 31.850 s 0 28.665 ms 36 ms 50 ms
10 1000000 1000 23541.75 42.478 s 0 42.478 ms 46 ms 55 ms
11 1000000 1100 31111.62 32.142 s 0 35.357 ms 38 ms 54 ms
12 1000000 1200 30877.27 32.386 s 0 38.864 ms 52 ms 57 ms
13 1000000 1300 31612.70 31.633 s 0 41.123 ms 44 ms 69 ms
14 1000000 1400 30513.07 32.773 s 0 45.882 ms 62 ms 70 ms
15 1000000 1500 30752.16 32.518 s 0 48.777 ms 52 ms 60 ms
16 1000000 2000 23408.74 42.719 s 0 85.438 ms 91 ms 1140 ms
17 1000000 2500 29810.78 33.545 s 0 83.862 ms 88 ms 104 ms
18 1000000 5000 27419.79 36.470 s 0 182.350 ms 232 ms 449 ms
19 1000000 7500 23122.18 43.249 s 0 324.364 ms 349 ms 378 ms
20 1000000 10000 23001.37 43.476 s 3840 434.757 ms 471 ms 643 ms
21 1000000 12500 25904.69 38.603 s 22656 482.538 ms 604 ms 867 ms
22 1000000 15000 5797.20 172.497 s 151869 2587.456 9959 ms 10529 ms

结论:

从上述测试结果中可以看出当Pod副本数增加时可以显著提升压测的并发值,即生产环境中可以通过增加副本数的方式来提升服务的性能。

文章来自个人专栏
知识分享
6 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0