CPU使用率过高的问题怎么排查?

你好,我是风一样的树懒,一个工作十多年的后端开发,曾就职京东、阿里等多家互联网头部企业。

点击下方👇关注公众号,带你一起复习后端技术,看看面试考点,补充积累技术知识,每天都为面试准备积累

文章可能会比较长,主要解析的非常详解,或涉及一些底层知识,供面试高阶难度用。可以根据自己实际理解情况合理取舍阅读


当遇到CPU使用率过高的问题时,可以按照以下 阶梯式排查流程 逐步定位问题根源:



01
全局资源定位(1分钟)


1. 快速定位高负载进程

# 按CPU使用率排序(Linux)top -c -o %CPU          # 交互式查看ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head  # 静态快照

2. 容器环境定位

docker stats            # Docker容器资源统计kubectl top pods       # Kubernetes Pod资源监控


02
进程级深度分析(3分钟)


1. 监控进程资源细节

# 按进程ID监控(每2秒刷新)pidstat -p <PID> 2 -u   # CPU使用详情pidstat -t -p <PID> 2   # 线程级分解


2. 火焰图快速定位

# 生成CPU火焰图(需安装perf)perf record -F 99 -p <PID> -g -- sleep 30perf script > out.perfFlameGraph/stackcollapse-perf.pl out.perf | FlameGraph/flamegraph.pl > flame.svg


03
线程级诊断(Java专项)


1. Java线程堆栈分析

# 生成线程快照jstack <PID> > thread_dump.txt# 结合top定位线程top -H -p <PID>        # 显示线程级CPUprintf "%x\n" <TID>    # 将线程ID转为十六进制grep 'nid=0x<hex>' thread_dump.txt  # 查找对应线程

2. Arthas实时诊断

# 安装并附加到Java进程curl -O https://arthas.aliyun.com/arthas-boot.jarjava -jar arthas-boot.jar# 监控热点方法dashboard              # 实时监控面板thread -n 3            # 最忙线程Top3profiler start         # 开始采样profiler stop          # 生成火焰图

04
系统级问题排查


1. 上下文切换分析

vmstat 2 5            # 查看cs字段(上下文切换)pidstat -w -p <PID> 2 # 特定进程上下文切换


2. 中断监控

cat /proc/interrupts         # 硬件中断分布cat /proc/softirqs           # 软中断统计sar -q 1 3                   # 队列长度监控


05
代码级优化建议


常见问题模式与解决方案

问题模式解决方案检测方法
死循环添加循环退出条件/Thread.sleep线程堆栈显示RUNNABLE状态循环
频繁GC调整JVM参数/优化对象创建jstat -gcutil
锁竞争激烈减小锁粒度/改用CAS操作jstack显示大量BLOCKED线程
正则表达式回溯优化正则表达式CPU消耗集中在Pattern匹配
算法复杂度高优化算法/引入缓存火焰图显示核心算法函数

06
应急处理方案


1. 临时降级

复制renice 19 <PID>        # 降低进程优先级kill -STOP <PID>       # 暂停进程(慎用)


2. 限流保护

// 使用Guava RateLimiter限流RateLimiter limiter = RateLimiter.create(100); // 100 QPSif (limiter.tryAcquire()) {    processRequest();}


排查流程图解

graph TD    A[CPU飙升告警] --> B{定位问题进程}    B -->|top/pidstat| C[确定目标PID]    C --> D{是否Java进程?}    D -->|是| E[jstack/Arthas分析]    D -->|否| F[perf/strace分析]    E --> G[定位热点线程/方法]    F --> G    G --> H{问题类型}    H --> I[死循环/GC/锁竞争...]    I --> J[具体优化方案]


07
总结


通过以上步骤,90%的CPU过高问题都能快速定位。建议将关键命令封装为排查脚本,例如:

#!/bin/bashecho "===== 系统负载 ====="uptimeecho "\n===== 进程Top5 ====="ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -6echo "\n===== 网络连接 ====="ss -s

今天的内容就分享到这儿,喜欢的朋友可以关注,点赞。有什么不足的地方欢迎留言指出,您的关注是我前进的动力!

END


扫码关注

一起积累后端知识
不积跬步,无以至千里
不积小流,无以成江海

喜欢此内容的人还喜欢

《Java面试题指南》回归啦~


一个阿里二面面试官必问的问题


Lambda表达式说爱你不容易


分享面试:mysql数据库索引失效的情况


Spring-Boot中一个不起眼的好工具StopWatch