↑↑↑ 欢迎 点赞、关注、收藏!!!,10 年 IT 行业老鸟,持续分享更多 IT 干货
目录
11-应用重启后,CPU和Load飙升的问题分析与解决方案
参考:https://www.yuque.com/hollis666/go2k1v/uq7bul
问题表现
-
现象特征
-
问题仅在发布后短暂出现,随后自动恢复
-
与流量高峰相关,请求量大时现象更显著
-
-
核心表现
-
触发场景:应用重启后几分钟内
-
指标异常:
CPU 利用率飙升至70%
Load 值达11(持续数分钟后恢复)
-
业务影响:接口响应时间(RT)升高,调用方超时频发
-
排查过程
1、排查方向
排查阶段 | 怀疑对象 | 验证结果 | 关键工具 |
---|---|---|---|
初步排查 | 应用代码缺陷 | 无异常(堆栈/Dump/火焰图) | Arthas、JProfiler |
基础设施排查 | 虚拟机/容器/宿主机问题 | 无变化(更换配置/镜像) | Docker、宿主机监控 |
JVM参数排查 | JDK版本/GC配置 | 无异常(堆内存/收集器) | GC日志、JVM参数分析 |
最终定位 | JIT编译延迟 | 热点代码未及时优化 | JDK Flight Recorder (JFR) |
2、分析
常规执行过程
java 文件 -- 通过javac --> 编译成 class文件,
class 字节码 -- 再通过解释器 --> 翻译成机器指令,
JIT 机制分析
JIT 优化器会基于热点代码检测,把热点代码直接翻译成机器语言。
方便后续直接执行。这样,大大提升了效率。
问题根源分析
-
应用刚刚重启后,并未触发 JIT。这时,所有请求依赖解释执行,CPU资源消耗很高。
-
当请求量大时,解释器持续工作导致 CPU/Load 飙升,直至JIT完成优化。
解决问题
这种问题的两种解决思路
-
提升JIT优化的效率
-
降低瞬时请求量
1、优化 JIT 编译效率
方案名称 | 技术原理 | 实现案例 | 效果 |
---|---|---|---|
JWarmUp | 记录上次运行编译信息,启动时预加载机器码 | Dragonwell JDK | 跳过解释阶段,启动性能提升 |
2、流量控制
策略名称 | 实现方式 | 核心逻辑 |
---|---|---|
渐进式流量 | 通过负载均衡分阶段放量 | 小流量触发JIT优化,再逐步扩容 |
3、配置修改
# 开启JWarmUp(Dragonwell JDK) -XX:+UseJWarmUp -XX:JWarmUpLogPath=/path/to/jwarmup.log # 调整JIT编译阈值(降低热点代码识别门槛) -XX:CompileThreshold=1000
↑↑↑ 欢迎 点赞、关注、收藏!!!,10 年 IT 行业老鸟,持续分享更多 IT 干货