线上CPU 100% 全流程排查步骤
一、第一步服务器层面定位Linux命令先确认是系统/应用占用1. 整机CPU概览top# 实时查看整机CPU、进程占用shiftp按CPU排序uptime# 看1/5/15分钟负载判断瞬时冲高还是持续满载重点%Cpu(s) us用户态、sy内核态、id空闲us高应用代码逻辑耗CPUJava业务死循环、密集计算sy高系统调用频繁、内核问题、频繁GC/IO阻塞、线程上下文切换爆炸id≈0CPU打满id高但负载高IO等待高wa高2. 定位占用CPU最高的进程PIDtop-H# 显示进程所有线程线程维度看CPUpidstat-u1# 每秒输出进程CPU占用记下占用CPU最高PID假设PID1234Java进程。二、第二步Java进程内部 → 哪个线程耗CPU核心经典步骤1. 导出Java进程所有线程栈拿到高CPU进程PIDjps -l列出所有Java进程top -Hp 1234查看该进程下CPU最高的线程TID十进制十进制TID转十六进制printf %x\n 线程TID例12345 → 0x3039打印线程堆栈jstack1234jstack.log# 或arthas一键thread -n 5在jstack.log搜索十六进制0x3039找到对应线程栈直接定位代码行。高频问题死循环、无限while、大数据量循环遍历、正则回溯、频繁创建对象。三、第三步区分是【代码业务耗CPU】还是【GC疯狂消耗CPU】1. 查看GC指标jstat-gcPID1000# 每秒打印GCS0/S1/Eden/O/MYGC/FGC次数与耗时判断YGC频繁暴涨、FGC频繁、Full GC耗时高 → GC导致CPU100%原因内存泄漏、大对象频繁创建、堆太小、不合理大内存分配。GC次数正常 → 业务代码逻辑占用CPU死循环/密集运算2. 堆快照排查内存泄漏jmap-dump:formatb,fileheap.hprof PIDheap文件下载后用MAT/JProfiler分析大对象、泄漏对象、不合理缓存。四、第四步Arthas一键排查线上首选不用重启服务# 1. 安装启动curl-Ohttps://arthas.aliyun.com/arthas-boot.jarjava-jararthas-boot.jar# 2. 找出CPU最高5个线程thread-n5# 3. 查看方法耗时定位热点方法profiler start;sleep30;profiler stop--formathtmlprofiler生成火焰图横向越长代表CPU占用越高直接定位耗CPU方法。五、第五步补充系统侧异常排查上下文切换过高vmstat 1cs列飙升 → 大量线程频繁切换线程池不合理、自旋锁滥用软中断高cat /proc/softirqs网卡中断暴高 → 网络流量打满、大量连接磁盘IO拉高CPUiostat -x 1 %iowait高大量同步刷盘、频繁落库。六、常见根因汇总业务代码死循环、嵌套循环、全表循环遍历、低效正则、大数循环计算GC问题内存泄漏、超大对象、堆参数过小、频繁创建短命大对象框架/中间件连接池参数不合理、死锁自旋、定时任务密集调度系统大量TCP连接、磁盘爆满刷盘、内核bug七、应急临时处理紧急下线定时任务/流量降级切流量临时重启实例集群环境优先一台重启保可用临时调大堆参数缓解GC。