Kubernetes 下 web 服务的性能测试三部曲之一:准备工作
欢迎访问我的 GitHub
这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos
本篇概览
-
大家好,从本章开始,我们用 Apache bench 和 JMeter 对 kubernetes 环境中的 web 服务做性能测试,经历过一系列实战后,对我们有以下帮助:
-
了解 apache bench 工具的使用;
-
了解 JMeter 工具的使用;
-
了解 kubernetes 的纵向扩容;
-
了解 kubernetes 的横向扩容;
章节介绍
-
《Kubernetes 下 web 服务的性能测试》由以下三篇组成:
-
即本章的工作:准备实战环境,包括 apache bench 和 JMeter 的安装配置,kubernetes 环境,部署 tomcat 服务;
-
实战纵向扩容,增强单个 Pod 的配置,用 apache bench 和 JMeter 验证扩容效果;
-
实战横向扩容,增加 Pod 数量,用 apache bench 和 JMeter 验证扩容效果;
实战步骤
-
本章我们要做以下事情:
-
规划环境;
-
准备 Tomcat 服务的镜像;
-
在 kubernetes 创建 Tomcat 服务的 deployment 和 service;
-
安装 Apache bench;
-
用 Apache bench 测试 Tomcat 服务的性能;
-
安装 JMeter;
-
用 JMeter 测试 Tomcat 服务的性能;
环境规划
-
整个实战需要四台机器,分别是 k8s master、k8s node、Apache bench 所在机器,JMeter 所在机器(win10),如下图:

-
整理信息列表如下:

准备 Tomcat 服务的镜像
-
用于测试的是个 springboot 的 web 服务,我们要将此 springboot 工程构建成 docker 镜像,这样 kubernetes 环境才能创建此服务的 Pod;
-
镜像名称:bolingcavalry/k8stomcatdemo:0.0.5,已经上传到 hub.docker.com,您可以直接使用这个镜像;
-
如果您想自己开发一个 web 镜像,请参考文章 《kubernetes下的Nginx加Tomcat三部曲之二:细说开发》 ,参考源码在 GitHub 可以下载,如下表所示:

-
这个 git 项目中有多个目录,本次的 web 工程源码放在 k8stomcatdemo,如下图红框所示:

-
有个细节请注意:Apache bench 在测试的时候,如果 server 每次返回内容的长度都不一样,会被算作失败,因此最好将返回内容长度固定,如下代码,使用"%15s"将 IP 地址的字符串固定为 15 位,不足 15 位就用空格补全:
@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 创建 Tomcat 服务的 deployment 和 service
-
接下来我们要在 kubernetes 创建 deployment 和 service 了,请登录可以执行 kubectl 命令的机器:
-
创建文件 tomcat.yaml,内容如下:
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 的内存;
-
在 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 端口访问到此服务了;
-
在 tomcat.yaml 所在目录执行命令 kubectl create -f tomcat.yaml,tomcat-svc.yaml ,即可创建 deployment 和 service:
[email protected]:/usr/local/work/ab# kubectl create -f tomcat.yaml,tomcat-svc.yaml
deployment "tomcathost" created
service "tomcathost" created
[email protected]:/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
复制代码
-
在 dashboard 页面可以看到此 Pod 情况如下图,资源符合配置中的限制:
-
-
我的 kubernetes 节点 1 的 IP 地址是 192.168.119.153:,所以在浏览器访问:http://192.168.119.153:30008/getserverinfo ,可以在浏览器页面看到服务端的响应,如下图:
-
-
服务端已经 OK,接下来我们开始准备测试吧;
安装 Apache bench;
-
在 ubuntu16 的电脑上,执行以下命令即可安装 apache bench:
apt-get install -y apache2-utils
复制代码
用 Apache bench 测试 Tomcat 服务的性能
-
执行以下命令可以立即开始 ab 测试:
ab -n 20000 -c 100 http://192.168.119.153:30008/getserverinfo
复制代码
-
上述命令的意思一百个并发用户进行共计两万次请求,请求地址是 http://192.168.119.153:30008/getserverinfo
-
等待执行完成结果如下:
[email protected]:/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)
复制代码
-
以上是测试结果,有三个参数需要重点关注:

注意 JIT 的影响
-
有一点请特别注意:刚启动的 Tomcat 服务,Controller 的代码还没有触发 JIT,所以理论上性能是低于生产环境的,请先执行一次 AB 测试使其完成 JIT(JIT 导致的 CPU 飙高也会在此时发生,后面就不会了),这此的测试结果直接丢弃,然后再重新做一次 AB 测试,取这次的结果;
-
基本的 Apache bench 操做已经熟悉了,接下来我们开始安装和使用 JMeter 吧;
安装 JMeter
-
为了使用图形化界面,我的 Jemeter 是安装在 win10 电脑上的;
-
确保本地已装好 JDK,并且 JAVA_HOME 环境变量也已配好,JMeter4 需要 JDK8 或者 JDK9;
-
去官网下载安装包,地址:http://jmeter.apache.org/download_jmeter.cgi ,安装包如下图红框中所示:
-
-
将安装包解压后,鼠标双击 apache-jmeter-4.0\bin\jmeter.bat 文件,即可启动 JMeter,如下图:
-
-
把语言改成中文吧, Options -> Choose Language -> Chinese (Simplified) ,如下图:
-
-
JMeter 安装成功了,接下来我们发起一次性能测试吧;
用 JMeter 测试 Tomcat 服务的性能
-
在"测试计划"上点击右键,选择"添加" -> "Threads(Users)" -> "线程组",如下所示:
-
-
在右侧窗口配置新创建的“线程组”的参数,如下图:
-
-
将上图四个红框中的参数分别介绍如下:
-
红框 1 中的名称随便填写;
-
红框 2 中的"线程数"表示并发数,这里填写 100,和前面的 AB 测试保持一致;
-
红框 3 中的"Ram-Up Period(in seconds)"表示经过多少秒并发数才达到 100;
-
红框 4 中的“循环次数”表示每个线程执行多少次请求,填写 200,这样总数就有 20000,和 AB 测试一致了;
-
在"k8s_tomcat_性能测试"上右键点击,选择"添加" -> "Sampler" -> "Http 请求",如下图:
-
-
在 Http 请求的参数配置页面上填写配置信息,如下图所示
-
-
将上图六个红框中的参数分别介绍如下:
-
红框 1 中的"协议"填写"http";
-
红框 2 中的"服务器名称或 IP"填写"192.168.119.153",就是 kubernetes 节点 IP;
-
红框 3 中的"端口号"填写"30008";
-
红框 4 中的"方法"选择"GET";
-
红框 5 中的"路径"填写"/getserverinfo", 注意要带上斜杠 ;
-
填写完毕后,记得点击红框 6 中的"保存"按钮;
-
配置测试结果输出信息,在"HTTP 请求"上点击右键,选择"添加" -> "监听器" -> "聚合报告",如下图:
-
-
这里没有需要配置的,直接点击上面的保存按钮即可;
-
JMeter 配置就上面这些了,点击下图红框中的绿色三角形图标,开始测试:
-
-
点击左侧的"聚合报告",可以看到一个简易的图表,测试过程中是不断更新的,测试完成后停止更新,如下所示:

-
这里简单说一下几个数据指标的含义:

小结
-
至此,咱们第一阶段的目标已经完成了,小结如下:
-
压测所需的服务端环境准备完毕;
-
压测所需的 AB 和 JMeter 工具准备完毕;
-
针对单个 Tomcat 容器的场景,用 AB 和 JMeter 完成了压测,吞吐量为 30 左右,单个请求等待时间为 3 秒左右(AB 和 JMeter 数据是有差异的);
-
接下来的两篇文章,我们会在 kubernetes 环境做不同类型的扩容,再继续做压测,然后对比扩容效果;
欢迎关注 InfoQ:程序员欣宸
- flutter 系列之:flutter 中的 flow
- Eureka 注册信息配置备忘
- 巧用 redis 实现点赞功能,它不比 mysql 香吗?
- Linux 开发 _ 摄像头编程 (实现拍照、网页监控功能)
- Electron 在作业帮直播课 PC 学生端的实践
- 物联网协议的王者:MQTT
- 解密安卓微信聊天信息存储
- 首都在线龚宏绩:用生态赋能企业出海 实现多方共赢 | TGO 专访
- GPT-4 都快出来了, GPT-3 的一些缺陷仍然被诟病
- 实战监听 Eureka client 的缓存更新
- 初识 ElastricSearch
- InfoQ 2022 年趋势报告:DevOps 与云计算篇
- 拒绝八股文!这篇图解动态路由分分钟爱了
- 从使用者走向引领者,如何加速国产开源生态建设?
- Docker 实践经验(二)镜像的构建、镜像仓库、压缩、导入
- 云原生之 Ansible 篇(一)
- ElastricSearch 第二弹之分片原理
- 超视频时代音视频架构建设与演进
- 腾讯内容结算下一代系统探索实践
- 10 分钟,带你了解 3 篇 SIGMOD、WWW 等数据库顶会论文的研究成果