性能测试-微服务性能压测监控和调优【重点】【杭州多测师_王sir】【杭州多测师】...

news2024/11/17 5:24:57
0
本文主要内容
一、何为压力测试
1.1、 大白话解释
  • 性能压测是什么:就是考察当前
软件和硬件环境下,系统所能承受的最大负荷,并帮助找出系统的瓶颈所在。
  • 性能压测的目的:为了系统在线上的
处理能力和稳定性维持在一个标准范围内,做到知己知彼,百战不殆。还可以发现内存泄漏、并发与同步的问题。
1.2、性能指标
  • RepsonseTime - RT:响应时间,用户从客户端发起一个请求开始计算,到客户端接收到服务端的响应结束,整个过程所耗费的时间。
  • Hits Per Second - HPS:用户每秒点击次数,也就是每秒向后台发送的请求次数。
  • QPS:系统每秒内处理查询的次数。
  • MaxRT:最大响应时间,指用户发出请求到服务端返回响应的最大时间。
  • MiniRT:最少响应时间,指用户发出请求到服务端返回响应的最少时间。
  • 90%响应时间:将所有用户的响应时间进行升序排序,取 90 % 的位置。
  • 性能测试关注点:
    • 吞吐量:每秒钟系统能处理的请求数、任务数。
    • 响应时间:服务处理一个请求或一个任务的耗时。
    • 错误率:一批请求中结果出过错的请求所占比例。
二、Jmeter 压测工具
1、Jmeter 工具
  • 下载和安装 Jmeter 工具
下载地址:
https://jmeter.apache.org/download_jmeter.cgi
我下载的版本是 apache-jmeter-5.3
0
  • 运行 JMeter 程序
打开批处理文件:\apache-jmeter-5.3\bin\jmeter.bat。如下图所示:
0
  • 添加线程组,如下图所示:
0
添加线程组
  • 1s 内启动 200 个线程,循环次数 100 次。2 w 个请求。如下图所示:
0
  • 测试 HTTP 请求,如下图所示:
0
配置要测试的协议、服务器地址、端口号。配置信息如下:
协议:使用 http 协议。
服务器名称或 IP: www.baidu.com (只是为了演示)。
端口号:80 端口。
如下图所示:
0
  • 添加查看结果树、汇总报告和聚合报告。如下图所示:
0
  • 开始压力测试。
点击播放按钮就开始启动了。注意启动之前需要先设置线程组的参数配置和 HTTP 请求的配置。如下图所示:
0
  • 查看每个请求结果,如下图所示:
0
  • 查看汇总报告。
主要关心平均值和吞吐量。
200 个线程,每个线程调用 100 次,总共 2 w 次,可以看到下图中表格中的样本列也是 2 w,请求所耗费的时间是 151 ms,吞吐量是 880 个请求每秒。如下图所示:
0
  • 查看聚合报告。
主要看中位数和90%百分位,
中位数是 59 ms,说明大部分请求的响应时间是 59 ms。
90 % 的请求 都是在 271 ms 以内响应完成的。
异常 0.41% 说明 2 w 个请求中有 82 个请求异常(20000 * 0.0041 = 82 )。
吞吐量 880.2/sec 说明百度这个网站每秒能处理 880 个请求,性能一般(可能跟本地机器性能有关)。
如下图所示:
0
  • 查看汇总图。
查看汇总图时,需要先勾选想要查看的信息,如下图所示:
0
然后查看图形汇总:
0
可以看到勾选的几列在图表中是用不同颜色表示的,比如绿色的柱状条就是 90 % 百分位。
我们来测试下 PassJava(佳必过)的管理后台的性能,吞吐量接近 2000/s。如下图所示:
0
三、性能监控之 jconsole
jconsole 和 jvisualvm 是 Java JDK 的两个小工具,用来监控内存泄漏、跟踪垃圾回收、执行时的内存情况、对 CPU 进行分析、线程的分析。都可以通过命令行启动,而且可以监控本地和远程应用。而 jvisualvm 是升级版的 jconsole。我们先来看下 jconsole 的使用。
首先用 cmd 命令行的方式启动 jconsole。
启动 jconsole‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍
0
命令行启动 jconsole
选择监控哪个应用
然后选择 passjava 项目的 question 服务。
0
选择 passjava-question 微服务
对应的就是下面这个微服务:passjava-question。
0
对应 passjava-question 微服务
概览
从监控界面上有 6 个菜单,首先看到的是概览功能,上面有堆内存使用量、线程数、类的使用情况、CPU 占用率,都是用趋势图来表示的,能很方便的看出当前性能的概览。注意:这些监控都是实时的。
0
概览
内存
下面是内存的使用情况,可以从下图中看到有个下拉框,里面可以选择不同的内存维度,然后下面的图标和柱状图也会跟着选择的维度而展示不同。
0
内存
下面是线程的使用情况,可以看到线程峰值和活动线程的总数量,目前看到的峰值是59,活动线程数是 57。下半部分可以看到具体是哪些线程,以及线程的堆栈信息,非常详细。
0
线程使用情况
下面是类的加载和卸载情况,已加载类总数是 10679,而已卸载的类是 1 个,所以当前已加装当前类的总数是 10679 - 1 = 10678 个。
0
类的加载和卸载情况
VM 概要
我们再来看下VM(虚拟机)的情况。如下图所示,可以看到虚拟机情况,线程、类、堆的概要信息,以及 VM 的参数,是不是很方便呀~
0
VM 概要
MBean 信息
接下来我们来看下 MBean 信息。对于 MBean,可能很多同学不知道是啥,下面做个解释:
MBean就是一种规范的JavaBean,通过集成和实现一套标准的Bean接口,这种叫MBean。MBean可以用来干嘛?就是可以有一套JDK级别的对外的服务接口。比如,你写了一个JVM允许状态辅助查询的Bean,你希望别人下载一个Jconsole就可以看到你写的杰作。那你就可以考虑用MBean规范来实现。很多垃圾收集器算法Bean就这么干的(说的就是这个类sun.management.MemoryImpl)。
0
MBean 信息
四、性能监控之 jvisualvm
jvisualvm 比 jconsole 更强大,界面展示的信息更丰富。还可以安装插件,太赞了。
启动 jvisualvm 和概述
启动方式和 jconsole 一样,也是通过 cmd 命令行启动。还是选择 passjava-question 微服务,然后选择第一个菜单栏:概述。可以看到 JVM 的版本,启动参数等信息。
0
启动jvisualvm
监视
监视 CPU、堆、类、线程的情况。整体显示的效果比 jconsole 更美观。
0
监视
线程
再来查下线程的情况。可以看到有 5 种状态的线程:
  • 运行:正在运行的线程。
  • 休眠:休眠状态的线程。
  • 等待:等待执行的线程。
  • 驻留:线程里面的空闲线程。
  • 监视:阻塞的线程,正在等待锁。
0
抽样器
另外我们也可以抽样器对 CPU 或内存进行抽样。如下图所示,对内存进行抽样。
0
抽样
插件的使用
安装Visual GC 插件
安装步骤:工具->插件->可用插件->Visual GC->安装。安装完成后,重启就可以使用插件功能了。
0
安装完成后,就可以看到
0
Visual GC 插件
下图是实时监控垃圾回收的情况。
0
Visual GC
五、对网关的性能测试
现在我想对 Passjava 系统的 question 微服务的接口进行一个压测,该如何进行呢?
首先我们来看下 passjava 的架构是怎么样的,如下图所示:
0
客户端分为手机端和 PC 端,http 请求先经过 API Gateway,然后再转发到 question 微服务。其中涉及到了中间件:Gateway 网关。
我们来对 Gateway 网关进行压力测试。
网关的端口号是 8060,我们配置下 JMeter。如下图所示:
0
配置每秒发送 200 个请求,一直循环执行,直到手动停止压测。如下图所示:
0
可以看下执行结果,吞吐量在 2422 个每秒,还是比较高的。
吞吐量:2422/s 。
90% 响应时间:142 毫秒。
99% 响应时间:281 毫秒。
0
我们再来看看垃圾回收的情况,Eden 区垃圾回收用时 2.7 s,用时太长了吧,看看这里怎么能优化下。
通常的优化方向是增大新生代堆内存配置。
0
六、对微服务的性能测试
根据上面的架构原理图,我们知道客户端请求都是经过 Gateway 转发了一次的,如果我们想单独看下微服务的性能该怎么测试呢?下面我来演示下如何测试 passjava-question 微服务的性能。
首先需要在 passjava-question 微服务中添加一个测试方法:
0
测试方法
有两种方式测试这个 api 是否添加正确。
第一种用 postman 测试下这个请求是否能正确响应,返回 “test” 则表示响应正确。
0
test api 是否能正确响应
第二种通过浏览器进行测试。浏览器地址栏输入以下链接后,回车,看下浏览器窗口是否显示 “test”,是则表示响应正确。
然后我们需要用 Jmeter 压测工具来测试这个微服务下的 api 的性能究竟如何。
0
单独压测微服务的 api的结果
吞吐量:3542/s 。
90% 响应时间:100 毫秒。
99% 响应时间:152 毫秒。
七、对网关+微服务的性能测试
如果我们想对这个整个请求链路进行性能测试该怎么做?
首先请求需要先经过网关,然后由网关转发到微服务。在之前的文章中,我已经将网关配置好了,所以要想通过网关转发到 test 请求,只需要对请求路径稍作修改即可,如下所示:
http://localhost:8060/api/question/v1/admin/question/test
然后在浏览器输入该网址,返回 “test” 即表示响应正确。
然后我们还是用 Jmeter 压测工具测试下 test api 的性能。测试结果如下图所示:
0
网关+微服务的压力测试结果
从结果可以看到:
吞吐量:982/s 。
90% 响应时间:437 毫秒。
99% 响应时间:790毫秒。
这里做个横向对比:
0
横向对比
说明微服务 api 经过网关转发一次后,性能至少下降了一半。可以得出结果:中间件越多,性能损失越大,大部分损失都是网络交互导致的。可以通过增强网络通信质量来减少网络的延迟。
八、对数据库查询进行优化
一般情况下,出现性能问题更多的是业务中查询数据库的耗时。接下来看下如何优化数据的查询。
下面是一个查询问题列表的 api:通过问题类型 type 字段过滤问题列表。api 路径如下:
http://localhost:11000/question/v1/admin/question/list?type=5
这个 api 的代码如下,很容易看懂。
0
查询问题列表的 api
我们加些测试代码:统计查询数据库的耗时。如下所示:
0
耗时统计
然后重启 passjava-question 服务,再次测试这个 api,耗时 43 ms
0
怎么对查询进行优化呢?很容易想到加索引,我们来试下加在 question 表加索引后的效果。给 type 字段加上普通索引,如下图所示:
0
添加索引
我们再来看下加了索引后的耗时情况:耗时 18 ms,确实比之前的 43 ms 快了很多。
0
加了索引后的情况
九、优化垃圾回收
我们可以通过 jvisulavm工具查看垃圾回收的情况,Eden 区频繁发生 GC,短时间(1分钟)内共造成了 480 次 stop the world。另外从压测工具中也可以看到,吞吐量为 275/s。
原因是 Eden 区的内存分配得太小了,只有 32 M,我们来调大一点。
0
32M Eden 区频繁进行垃圾回收
增大 Eden 区大小
通过在 IDEA 工具中配置以下参数,调整堆内存最大为 1024 M,新生代内存为 512 M。
-Xmx1024m -Xms1024m -Xmn512m
然后可以观察到在相当长的短时间(1分钟)内只进行了 92 次垃圾回收,说明垃圾回收的频率降低了。应用程序的性能也提升了。另外从压测工具中也可以看到,吞吐量为 347/s,吞吐量也有较大提升。
0
十、总结
本文通过压测工具 Jmeter 讲解压测如何实施,然后用性能监控工具 jconsole 和 jvisualvm 来监控 Java 应用程序的性能,以及如何用工具来优化开源项目 passjava 的性能,并且非常详细地介绍了每一步以及执行结果,通过对比的方式,更加清晰地知道如何做性能优化。
下面是对系统性能的常规优化手段:
  • 中间件较多时,优化网络通信质量。
  • 数据库查询耗时时,需要对查询进行优化,比如添加索引。
  • 模板的渲染速度,可以通过设置模板缓存。
  • 静态资源的获取,可以通过 Nginx 动静分离来解决。(下期再讲)
  • 日志太多,需要减少不必要的打 log 操作。
本文转载于如下链接:
https://jishuin.proginn.com/p/763bfbd5ca33
https://blog.csdn.net/u010833547/article/details/92806510
https://www.bilibili.com/video/BV1np4y1C7Yf
https://github.com/Jackson0714/PassJava-Platform
www.passjava.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MySQL】MySQL存储过程与存储函数实战(MySQL专栏启动)

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

LeetCode题解 二叉树(九):106 中序和后序遍历序列构造二叉树;105 从前序与中序遍历序列构造二叉树

下面要讲的两道题,从二叉树的角度来讲,是非常重要的,此前一直是遍历二叉树,现在就要根据数组,构造二叉树 106 从中序与后序遍历序列构造二叉树 medium 示例:中序遍历 inorder [9,3,15,20,7] 后序遍历 po…

SpringBoot做个埋点监控

JVM应用度量框架Micrometer实战 前提 spring-actuator做度量统计收集,使用Prometheus(普罗米修斯)进行数据收集,Grafana(增强ui)进行数据展示,用于监控生成环境机器的性能指标和业务数据指标。…

Three.js一学就会系列:04 炫酷3D文字

系列文章目录 Three.js一学就会系列:01 第一个3D网站 Three.js一学就会系列:02 画线 Three.js一学就会系列:03 炫酷3D划线 文章目录系列文章目录前言一、创建一个vue项目二、安装及使用安装创建一个dom元素三、核心代码讲解场景处理“雾”光…

83.【JQuery.Ajax】

Ajax(一)、Ajax简介1.什么是Ajax2.jQuery.ajax介绍(二)、环境搭建1.创建Model并添加web框架2.配置Artifacts的lib文件3.配置web框架下的web.xml4.配置spring-mvc.xml配置文件5.配置汇总文件applicationContexe.xml6.进行测试(三)、伪造Ajax1.iframe内敛框架伪造Ajax(四)、使用真…

【阶段二】Python数据分析NumPy工具使用01篇:NumPy工具介绍、NumPy工具安装与数组的创建

本篇的思维导图: NumPy工具介绍 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,这个包封装了多个可以用于数组间计算的函数供你直接调用,是一个运行速度非常快的数学库。 NumPy工具安装 代码 结果

从输入URL到渲染的过程中到底发生了什么?

CDN缓存DNSTCP三次握手、四次挥手浏览器渲染过程输入URL到页面渲染过程的一些优化 下面我将“从输入URL到渲染的全过程”大概的描述出来,再对其过程加以解释,了解过程中可以做哪些优化。文章内容有点长,需要有足够的耐心看完哟!&…

MySQL数据库高级面试题(2)

✅作者简介:热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:Java面试题…

【自学Java】Java if else-if else语句

Java else if Java else if教程 在 Java 语言 中,关键字 if 是用于测试某个条件(布尔型 或逻辑型)的语句是否满足一定的条件,如果满足特定的条件,则会执行 if 后由大括号 {} 括起来的代码块,否则就忽略该…

利用Dlib 实现人脸68个特征点的标定

系列文章目录 文章目录系列文章目录前言1. 开发环境依赖2. 设计流程68个特征点提取:OpenCv 绘图:3. 源码OpenCv 的画图函数1. 画圆2. 写字符3.关于 颜色数组:前言 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进…

【C语言 数据结构】树

文章目录树一、树的概念二、树的应用1)树可表示具有分枝结构关系的对象2)树是常用的数据组织形式三、树的表示四、树的基本术语五、树的四种表示方法5.1 双亲表示法5.2 孩子表示法5.3 双亲孩子表示法5.4 孩子兄弟表示法树 一、树的概念 树形结构是一种…

Git基础知识学习

1. Git工作机制 Workspace: 工作区,就是你平时存放项目代码的地方Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息Repository: 仓库区&#xff0…

CleanMyMac4.12.3全新版本Mac清理优化工具

CleanMyMac X是一款超好用的Mac清理优化工具,可以帮助用户删除系统垃圾、不需要的应用程序和恶意软件,并调整您的 Mac 以获得最大速度! CleanMyMac X作为一款知名的系统清理软件,深受广大用户们的喜爱。它操作简洁,能够…

Mycat2(三)mycat2搭建读写分离

文章目录一、mycat一主一从读写分离原理二、搭建MySQL主从复制三、配置mycat2一主一从读写分离四、配置Mycat2双主双从读写分离4.1 Mysql 双主双从搭建步骤1、创建MySQL数据库与MySQL 机器信息2、双柱双从配置2.1 master1配置2.2 master2配置2.3 Slave1、Slave2 配置3、在两台主…

程序员如何在职场上走得更远一些?

一. 工作心态 首先第一个要聊的啊就是这个心态的问题,我觉得有时候可以改变一下自己的心态,可以尝试把工作当成一种投资,或者说呢把工作当成一种自己的产品来经营,把目光多多的聚焦在这个收获和成长上面啊这样一个心态来应对&…

KV数据分片和分布

KV数据分片和分布 KV存储数据组织方式 Hash:对于Hash方式,键值对数据的存储位置由预定义的Hash函数确定,因此所有键值对数据不是有序排列。Hash方式的优点是通过Hash函数计算存储位置的效率高,因此处理插入、删除、更新、单点查…

MySQL之事务

引入事务: 一个事务其实就是一个完整的业务逻辑,它是一个最小的工作单元,是不可再分的。 那么什么是一个完整的业务逻辑呢? 拿现实生活中的银行业务举例,假设转账,从A账户向B账户中转账10000&#xff0c…

Redis:一、简介

Redis 1. redis的简介 1.1 NoSQL的介绍 在介绍redis之前,我们先来了解一下NoSQL(Not only SQL),不仅仅是SQL。 NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别…

Cache(缓存)基本概念

cache的概念在计算机中被广泛应用,包括TLB等都使用了它的理念,因此对其进行总结。Cache——位于CPU上,处于寄存器和内存之间的存储单元。 Cache Hit & Miss在写入cache的时候,有hit(命中)和miss&#x…

基于ros1的 apollo 7.0.0规划控制算法

apollo.ros-7.0.0 上次给大家带来了之前学习apollo时开发的内容apollo.ros-1.0.0和apollo.ros-3.0.0,主要是针对apollo 1.0.0和3.0.0版本进行了ros1下的移植和规划控制算法的学习。本次在之前工作的基础上,针对apollo 7.0.0版本,进行了ros1下…