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副本数增加时可以显著提升压测的并发值,即生产环境中可以通过增加副本数的方式来提升服务的性能。