48 张图 | 实战详解微服务性能监控、Jmeter压测、JVM调优

发布时间:2026/5/19 20:17:33

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

相关新闻