线上CPU 100% 全流程排查步骤

一、第一步:服务器层面定位(Linux命令,先确认是系统/应用占用)

1. 整机CPU概览

shell 复制代码
top           # 实时查看整机CPU、进程占用,shift+p按CPU排序
uptime        # 看1/5/15分钟负载,判断瞬时冲高还是持续满载
  • 重点:%Cpu(s) us用户态、sy内核态、id空闲
    • us高:应用代码逻辑耗CPU(Java业务死循环、密集计算)
    • sy高:系统调用频繁、内核问题、频繁GC/IO阻塞、线程上下文切换爆炸
    • id≈0:CPU打满;id高但负载高:IO等待高(wa高)

2. 定位占用CPU最高的进程PID

shell 复制代码
top -H        # 显示进程+所有线程,线程维度看CPU
pidstat -u 1  # 每秒输出进程CPU占用

记下占用CPU最高PID(假设PID=1234,Java进程)。

二、第二步:Java进程内部 → 哪个线程耗CPU(核心经典步骤)

1. 导出Java进程所有线程栈

  1. 拿到高CPU进程PID:jps -l 列出所有Java进程
  2. top -Hp 1234 查看该进程下CPU最高的线程TID(十进制)
  3. 十进制TID转十六进制:printf "%x\n 线程TID"(例:12345 → 0x3039)
  4. 打印线程堆栈:
shell 复制代码
jstack 1234 > jstack.log
# 或arthas一键:thread -n 5
  1. 在jstack.log搜索十六进制0x3039,找到对应线程栈,直接定位代码行。

高频问题:死循环、无限while、大数据量循环遍历、正则回溯、频繁创建对象。

三、第三步:区分是【代码业务耗CPU】还是【GC疯狂消耗CPU】

1. 查看GC指标

shell 复制代码
jstat -gc PID 1000  # 每秒打印GC,S0/S1/Eden/O/M,YGC/FGC次数与耗时

判断:

  1. YGC频繁暴涨、FGC频繁、Full GC耗时高 → GC导致CPU100%
    原因:内存泄漏、大对象频繁创建、堆太小、不合理大内存分配。
  2. GC次数正常 → 业务代码逻辑占用CPU(死循环/密集运算)

2. 堆快照排查内存泄漏

shell 复制代码
jmap -dump:format=b,file=heap.hprof PID

heap文件下载后用MAT/JProfiler分析:大对象、泄漏对象、不合理缓存。

四、第四步:Arthas一键排查(线上首选,不用重启服务)

shell 复制代码
# 1. 安装启动
curl -O https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar
# 2. 找出CPU最高5个线程
thread -n 5
# 3. 查看方法耗时(定位热点方法)
profiler start; sleep 30; profiler stop --format html

profiler生成火焰图:横向越长代表CPU占用越高,直接定位耗CPU方法。

五、第五步:补充系统侧异常排查

  1. 上下文切换过高 :vmstat 1 cs列飙升 → 大量线程频繁切换(线程池不合理、自旋锁滥用)
  2. 软中断高 :cat /proc/softirqs 网卡中断暴高 → 网络流量打满、大量连接
  3. 磁盘IO拉高CPU :iostat -x 1 %iowait高,大量同步刷盘、频繁落库。

六、常见根因汇总

  1. 业务代码:死循环、嵌套循环、全表循环遍历、低效正则、大数循环计算
  2. GC问题:内存泄漏、超大对象、堆参数过小、频繁创建短命大对象
  3. 框架/中间件:连接池参数不合理、死锁自旋、定时任务密集调度
  4. 系统:大量TCP连接、磁盘爆满刷盘、内核bug

七、应急临时处理

  1. 紧急下线定时任务/流量降级,切流量;
  2. 临时重启实例(集群环境优先一台重启保可用);
  3. 临时调大堆参数缓解GC。
相关推荐
panxianren10 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
sunshine22 girl12 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs12 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang12 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl13 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat13 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
泡茶喝茶写代码15 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
\光辉岁月/16 小时前
7.javase-面向对象
java·开发语言
weixin_5310946916 小时前
heap_4内存管理
java·开发语言·算法
程序员南飞16 小时前
win系统安装minio
java·数据结构·算法