大家好,从本章开始,我们用Apache bench和JMeter对kubernetes环境中的web服务做性能测试,经历过一系列实战后,对我们有以下帮助:
原文地址:http://blog.csdn.net/boling_cavalry/article/details/79321518
《Kubernetes下web服务的性能测试》由以下三篇组成:
关于kubernetes环境的搭建和kubectl工具的安装,您可以参照以下三篇文章:
本章我们要做以下事情:
整个实战需要四台机器,分别是k8s master、k8s node、Apache bench所在机器,JMeter所在机器(win10),如下图:
整理信息列表如下:
IP地址 | 身份 | 操作系统 | 备注 |
---|---|---|---|
192.168.119.148 | kubernetes的master | ubuntu16 | 内存不小于2G |
192.168.119.153 | kubernetes的节点1 | ubuntu16 | 内存8G |
192.168.119.1 | 安装了Jemter的机器 | win10 | |
192.168.119.153 | 安装了Apache bench的机器 | ubuntu16 |
用于测试的是个springboot的web服务,我们要将此springboot工程构建成docker镜像,这样kubernetes环境才能创建此服务的Pod;
镜像名称:bolingcavalry/k8stomcatdemo:0.0.5,已经上传到hub.docker.com,您可以直接使用这个镜像;
如果您想自己开发一个web镜像,请参考文章《kubernetes下的Nginx加Tomcat三部曲之二:细说开发》,参考源码在GitHub可以下载,如下表所示:
名称 | 链接 | 备注 |
---|---|---|
项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
git仓库地址(ssh) | [email protected]:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET)
public String getUserInfoWithRequestParam(){
return String.format("server : %15s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
接下来我们要在kubernetes创建deployment和service了,请登录可以执行kubectl命令的机器:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcathost
spec:
replicas: 1
template:
metadata:
labels:
name: tomcathost
spec:
containers:
- name: tomcathost
image: bolingcavalry/k8stomcatdemo:0.0.5
tty: true
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "100m"
如上所示,web服务的镜像是bolingcavalry/k8stomcatdemo:0.0.5,Pod数量为1,使用了0.1的CPU和256M的内存;
2. 在tomcat.yaml所在目录下创建文件tomcat-svc.yaml,内容如下:
apiVersion: v1
kind: Service
metadata:
name: tomcathost
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30008
selector:
name: tomcathost
如上所示,使用了NodePort,这样就能通过节点机器的IP地址和30008端口访问到此服务了;
3. 在tomcat.yaml所在目录执行命令kubectl create -f tomcat.yaml,tomcat-svc.yaml,即可创建deployment和service:
root@maven:/usr/local/work/ab# kubectl create -f tomcat.yaml,tomcat-svc.yaml
deployment "tomcathost" created
service "tomcathost" created
root@maven:/usr/local/work/ab# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 64d
tomcathost NodePort 10.43.131.61 <none> 8080:30008/TCP 5m
4. 在dashboard页面可以看到此Pod情况如下图,资源符合配置中的限制:
5. 我的kubernetes节点1的IP地址是192.168.119.153:,所以在浏览器访问:http://192.168.119.153:30008/getserverinfo,可以在浏览器页面看到服务端的响应,如下图:
服务端已经OK,接下来我们开始准备测试吧;
在ubuntu16的电脑上,执行以下命令即可安装apache bench:
apt-get install -y apache2-utils
ab -n 20000 -c 100 http://192.168.119.153:30008/getserverinfo
上述命令的意思一百个并发用户进行共计两万次请求,请求地址是http://192.168.119.153:30008/getserverinfo
root@maven:/usr/local/work/ab# ab -n 20000 -c 100 http://192.168.119.153:30008/getserverinfo
This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.119.153 (be patient)
Completed 2000 requests
Completed 4000 requests
Completed 6000 requests
Completed 8000 requests
Completed 10000 requests
Completed 12000 requests
Completed 14000 requests
Completed 16000 requests
Completed 18000 requests
Completed 20000 requests
Finished 20000 requests
Server Software:
Server Hostname: 192.168.119.153
Server Port: 30008
Document Path: /getserverinfo
Document Length: 52 bytes
Concurrency Level: 100
Time taken for tests: 573.587 seconds
Complete requests: 20000
Failed requests: 0
Total transferred: 3700000 bytes
HTML transferred: 1040000 bytes
Requests per second: 34.87 [#/sec] (mean)
Time per request: 2867.934 [ms] (mean)
Time per request: 28.679 [ms] (mean, across all concurrent requests)
Transfer rate: 6.30 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 1.1 1 43
Processing: 3 2860 2641.7 2369 29799
Waiting: 3 2725 2553.1 2256 29799
Total: 3 2861 2641.6 2370 29800
Percentage of the requests served within a certain time (ms)
50% 2370
66% 2999
75% 3416
80% 3802
90% 5072
95% 6410
98% 8801
99% 16683
100% 29800 (longest request)
以上是测试结果,有三个参数需要重点关注:
名称 | 数值 | 含义 |
---|---|---|
Requests per second | 34.87 | 每秒吞吐率,单位时间内能处理的最大请求数 |
Time per request | 2867.934 | 用户平均请求等待时间 |
Time per request (mean, across all concurrent requests) |
28.679 | 服务器平均请求等待时间; 它是吞吐率的倒数; 它也等于"用户平均请求等待时间"除以"并发用户数" |
有一点请特别注意:刚启动的Tomcat服务,Controller的代码还没有触发JIT,所以理论上性能是低于生产环境的,请先执行一次AB测试使其完成JIT(JIT导致的CPU飙高也会在此时发生,后面就不会了),这此的测试结果直接丢弃,然后再重新做一次AB测试,取这次的结果;
基本的Apache bench操做已经熟悉了,接下来我们开始安装和使用JMeter吧;
为了使用图形化界面,我的Jemeter是安装在win10电脑上的;
JMeter安装成功了,接下来我们发起一次性能测试吧;
# Samples | Average | Median | 90% Line | 95% Line | 99% Line | Min | Max | Error % | Throughput | Received KB/sec | Sent KB/sec |
---|---|---|---|---|---|---|---|---|---|---|---|
20000 | 3318 | 2399 | 6197 | 8300 | 34500 | 1 | 52694 | 0.00% | 27.4/sec | 4.44 | 3.69 |
这里简单说一下几个数据指标的含义:
名称 | 含义 |
---|---|
Samples | 请求总数 |
Average | 单个请求平均响应时间 |
Median | 50%用户的响应时间 |
90% Line | 90%用户的响应时间 |
95% Line | 95%用户的响应时间 |
99% Line | 99%用户的响应时间 |
Min | 最短响应时间 |
Max | 最长响应时间 |
Error % | 错误率 |
Throughput | 吞吐量 |
Received KB/sec | 每秒收到字节数 |
Sent KB/sec | 每秒发出字节数 |
至此,咱们第一阶段的目标已经完成了,小结如下:
接下来的两篇文章,我们会在kubernetes环境做不同类型的扩容,再继续做压测,然后对比扩容效果;