Kubernetes下web服务的性能测试三部曲之一:准备工作

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
性能测试 PTS,5000VUM额度
简介: 用Apache bench和JMeter对kubernetes环境中的web服务做性能测试,再对横向扩容和纵向扩容的效果做测试,本篇是准备篇

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码): https://github.com/zq2599/blog_demos

本篇概览

  • 大家好,从本章开始,我们用Apache bench和JMeter对kubernetes环境中的web服务做性能测试,经历过一系列实战后,对我们有以下帮助:
  1. 了解apache bench工具的使用;
  2. 了解JMeter工具的使用;
  3. 了解kubernetes的纵向扩容;
  4. 了解kubernetes的横向扩容;

章节介绍

  • 《Kubernetes下web服务的性能测试》由以下三篇组成:
  1. 即本章的工作:准备实战环境,包括apache bench和JMeter的安装配置,kubernetes环境,部署tomcat服务;
  2. 实战纵向扩容,增强单个Pod的配置,用apache bench和JMeter验证扩容效果;
  3. 实战横向扩容,增加Pod数量,用apache bench和JMeter验证扩容效果;

实战步骤

  • 本章我们要做以下事情:
  1. 规划环境;
  2. 准备Tomcat服务的镜像;
  3. 在kubernetes创建Tomcat服务的deployment和service;
  4. 安装Apache bench;
  5. 用Apache bench测试Tomcat服务的性能;
  6. 安装JMeter;
  7. 用JMeter测试Tomcat服务的性能;

环境规划

  • 整个实战需要四台机器,分别是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

准备Tomcat服务的镜像

  • 用于测试的是个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) git@github.com:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议
  • 这个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命令的机器:
  1. 创建文件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的内存;
  1. 在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端口访问到此服务了;
  1. 在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
  1. 在dashboard页面可以看到此Pod情况如下图,资源符合配置中的限制:

这里写图片描述

  1. 我的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服务的性能

  1. 执行以下命令可以立即开始ab测试:
ab -n 20000 -c 100 http://192.168.119.153:30008/getserverinfo
  • 上述命令的意思一百个并发用户进行共计两万次请求,请求地址是http://192.168.119.153:30008/getserverinfo
  1. 等待执行完成结果如下:
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 服务器平均请求等待时间;
它是吞吐率的倒数;
它也等于"用户平均请求等待时间"除以"并发用户数"

注意JIT的影响

  • 有一点请特别注意:刚启动的Tomcat服务,Controller的代码还没有触发JIT,所以理论上性能是低于生产环境的,请先执行一次AB测试使其完成JIT(JIT导致的CPU飙高也会在此时发生,后面就不会了),这此的测试结果直接丢弃,然后再重新做一次AB测试,取这次的结果;
  • 基本的Apache bench操做已经熟悉了,接下来我们开始安装和使用JMeter吧;

安装JMeter

  • 为了使用图形化界面,我的Jemeter是安装在win10电脑上的;
  1. 确保本地已装好JDK,并且JAVA_HOME环境变量也已配好,JMeter4需要JDK8或者JDK9;
  2. 去官网下载安装包,地址:http://jmeter.apache.org/download_jmeter.cgi ,安装包如下图红框中所示:

这里写图片描述

  1. 将安装包解压后,鼠标双击apache-jmeter-4.0\bin\jmeter.bat文件,即可启动JMeter,如下图:

这里写图片描述

  1. 把语言改成中文吧,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配置就上面这些了,点击下图红框中的绿色三角形图标,开始测试:

这里写图片描述

  • 点击左侧的"聚合报告",可以看到一个简易的图表,测试过程中是不断更新的,测试完成后停止更新,如下所示:
# 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 每秒发出字节数

小结

  • 至此,咱们第一阶段的目标已经完成了,小结如下:
  1. 压测所需的服务端环境准备完毕;
  2. 压测所需的AB和JMeter工具准备完毕;
  3. 针对单个Tomcat容器的场景,用AB和JMeter完成了压测,吞吐量为30左右,单个请求等待时间为3秒左右(AB和JMeter数据是有差异的);
  • 接下来的两篇文章,我们会在kubernetes环境做不同类型的扩容,再继续做压测,然后对比扩容效果;

欢迎关注阿里云开发者社区博客:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
18天前
|
安全 前端开发 API
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
|
13天前
|
测试技术
基于LangChain手工测试用例转Web自动化测试生成工具
该方案探索了利用大模型自动生成Web自动化测试用例的方法,替代传统的手动编写或录制方式。通过清晰定义功能测试步骤,结合LangChain的Agent和工具包,实现了从功能测试到自动化测试的转换,极大提升了效率。不仅减少了人工干预,还提高了测试用例的可维护性和实用性。
25 4
|
12天前
|
Web App开发 测试技术 API
自动化测试之美:使用Selenium和Python进行Web应用测试
【8月更文挑战第31天】在软件开发的快节奏世界中,自动化测试如同一束明灯,照亮了质量保证之路。本文将引导你通过Selenium和Python的强大组合,探索如何构建高效的Web应用测试框架。我们不仅会讨论理论,还会深入代码,从一个简单的示例开始,逐步扩展至更复杂的场景。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。让我们一同揭开自动化测试的神秘面纱,体验它的魅力所在。
|
13天前
|
JSON 定位技术 数据格式
web GIS神器,一行命令快捷构建精灵图服务
web GIS神器,一行命令快捷构建精灵图服务
|
18天前
|
人工智能 Java 测试技术
自动化测试之美:如何用Selenium提升Web应用的质量保证
【8月更文挑战第24天】 在软件开发的海洋里,自动化测试如同一艘救生艇,帮助开发团队保持代码质量的同时,还能确保他们不会淹没在功能的迭代和bug修复中。Selenium,作为一个用于Web应用程序测试的工具,它的强大之处在于模拟真实用户操作的能力。本文将通过浅显易懂的语言和实际代码示例,引导读者理解Selenium的魅力所在,以及如何有效利用它来提升Web应用的测试效率和覆盖率。
|
20天前
|
XML JavaScript 测试技术
Web自动化测试框架(基础篇)--HTML页面元素和DOM对象
本文为Web自动化测试入门指南,介绍了HTML页面元素和DOM对象的基础知识,以及如何使用Python中的Selenium WebDriver进行元素定位、操作和等待机制,旨在帮助初学者理解Web自动化测试中的关键概念和操作技巧。
33 1
|
11天前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
35 0
|
11天前
|
Java 网络架构 数据格式
Struts 2 携手 RESTful:颠覆传统,重塑Web服务新纪元的史诗级组合!
【8月更文挑战第31天】《Struts 2 与 RESTful 设计:构建现代 Web 服务》介绍如何结合 Struts 2 框架与 RESTful 设计理念,构建高效、可扩展的 Web 服务。Struts 2 的 REST 插件提供简洁的 API 和约定,使开发者能快速创建符合 REST 规范的服务接口。通过在 `struts.xml` 中配置 `&lt;rest&gt;` 命名空间并使用注解如 `@Action`、`@GET` 等,可轻松定义服务路径及 HTTP 方法。
27 0
|
11天前
|
测试技术 Java
揭秘Struts 2测试的秘密:如何打造无懈可击的Web应用?
【8月更文挑战第31天】在软件开发中,确保代码质量的关键在于全面测试。对于基于Struts 2框架的应用,结合单元测试与集成测试是一种有效的策略。单元测试聚焦于独立组件的功能验证,如Action类的执行逻辑;而集成测试则关注组件间的交互,确保框架各部分协同工作。使用JUnit进行单元测试,可通过简单示例验证Action类的返回值;利用Struts 2 Testing插件进行集成测试,则可模拟HTTP请求,确保Action方法正确处理请求并返回预期结果。这种结合测试的方法不仅提高了代码质量和可靠性,还保证了系统各部分按需协作。
8 0
|
11天前
|
前端开发 API 开发者
JSF与RESTful服务的完美邂逅:如何打造符合现代Web潮流的数据交互新体验
【8月更文挑战第31天】随着互联网技术的发展,RESTful架构风格因其实现简便与无状态特性而在Web服务构建中日益流行。本文探讨如何结合JavaServer Faces (JSF) 和 JAX-RS 构建RESTful API,展示从前端到后端分离的完整解决方案。通过定义资源类、配置 `web.xml` 文件以及使用依赖注入等步骤,演示了在JSF项目中实现RESTful服务的具体过程,为Java开发者提供了实用指南。
23 0