从Jmeter入门到JVM调优实战

1. 相关文档

2. Jmeter UI功能介绍

1)创建线程组 2)创建HTTP请求 加个请求头 3)添加监听器-查看结果树 4)安装Jemeter插件:3 Basic Graphs、5 Additional Graphs 和 PerfMon(服务器性能监控插件) 5)运行服务端的监控程序:PerfMon Server Agent 6)Run起来 7)scene1:上个接口的返参作为下个接口入参 8)scene2:单接口下用户访问商品AB的比例控制 or 读写接口混合压测模式下,28原则比例分配 9)对HTTP响应结果进行JSON断言 10)读取CSV文件中的用户账号,密码,cookie等(每个线程执行一次都会取一个新的UID!)

3. 常见压测问题

线程池

  • 核心线程和最大线程数设置太小,导致任务大量排队等待,RT升高; (IO密集型保守设置:corePoolSize=CPU核数*2)
  • 通过实际压测结果调整线程池配置;dubbo默认核心线程数=最大线程数=200、队列长度0、拒绝策略;

代码逻辑复杂度

  • for循环中嵌套bigList.contains(value)方法,复杂度过高,导致CPU飙升;
  • for循环操作DB,和DB交互次数变多,导致RT升高;

数据库DB

  • 查询时没有命中索引,或无索引,导致RT较高;
  • 并发更新单条纪录,导致大量锁等待,RT增加;(MySQL热点key更新最大支持qps1k,实际业务500左右)

缓存Cache

  • Redis和Caffeine中查询缓存为null时,没有放empty值导致缓存穿透,RT增加;

RPC

  • 下游服务性能较差,导致耗时太多;
  • 下游服务dubbo线程池满了,导致大量异常;

JVM

  • OOM(内存泄漏、导出数据时未加锁、异步打印大对象日志)
  • CPU飙高(代码复杂度过高、频繁GC、锁竞争等)

4.JVM调优实战场景

1)CPU飙高:代码复杂度过高

测试demo: jmeter进行压测此接口:

按此步骤进行排查cpu飙高原因排查:

scss 复制代码
top               // 查看各个进程cpu使用情况
top -Hp 11391     // 查看该java进程下所有线程cpu使用情况
printf %x 11405   // 线程ID转换16进制
jstack 11391(进程ID) | grep 2c80(十六进制线程Id)    // 查看堆栈信息
jstack 11391 > out.txt      // 输出thread dump文件
fastthread.io               // 在线分析dump文件

fastthread在线分析dump文件,如下: Refer:jstack命令解析(分析死锁、CPU过高)、包教包会 jstack分析性能问题

2)OOM:一次性申请对象太多

项目配置jvm参数: 测试demo: 异常日志: dump文件分析:找内存占用过大的对象->这个对象被谁引用(GC Root)->具体所在的代码

markdown 复制代码
OOM问题有两类最常见的GC Root:
1. 静态变量类,特征为GC Root可追踪到某个静态变量。这类问题有较大概率是缓慢泄漏,
   在发生OOM的时刻没有对大对象进行写入操作的话,无法从线程上找到对应代码。
2. 方法局部变量类,特征为GC Root可追踪到某个线程。
   这类问题发生OOM的时刻大概率可追踪到问题根因的线程。

总结,OOM问题定位思路:

lua 复制代码
配置Jvm参数:PrintGCDetails(打印gc日志)、 HeapDumpOnOutOfMemoryError(生成dump文件)
获取dump文件;
使用内存分析工具对dump文件进行分析:Visualvm、Mat、Arthas等工具;
   // dump文件分析:找内存占用过大的对象->这个对象被谁引用(GC Root)->具体所在的代码
修改验证。

Refer:如何快速定位OOM问题-徐庶、FullGC和OOM排查思路、结合MAT工具分析OOM问题

相关推荐
刚入门的大一新生21 小时前
Linux-线程概念
linux·jvm
eleven_4u1 天前
QPS如何计算,如何部署架构
java·linux·运维·jvm·中间件
qq_452396231 天前
第八篇:《VACUUM、自动清理与膨胀治理》
jvm·数据库·oracle
甜到心里的蛋糕1 天前
抖音评论自动回复机器人部署实践:无头 Chrome + DeepSeek + NapCat(2C2G 云主机)
java·jvm·chrome·python·抖音·deepseek
香蕉大香蕉(06敬畏市场)1 天前
高频八股 · JVM(7):方法区、元空间与字符串常量池
java·jvm·ai·博客·八股·大厂实习
wangchunyu1142 天前
JAVA JVM内存结构与运行时数据区
java·开发语言·jvm
骑着蜗牛撵大象3272 天前
AI Agent 工程化开发实战(三):用 StateGraph 给智能体搭一条可回放的状态流水线
java·开发语言·jvm·ai·状态管理·langgraph·stategraph
lambo mercy2 天前
持久化01——线程级持久化
java·开发语言·jvm
Pniubi2 天前
JVM的构成精讲
jvm
今天的砖头有点烫手啊3 天前
Java 对象内存布局:压缩指针、对齐填充与 JOL 实测
java·jvm