CPU 占用高怎么定位
CPU 高要先分清是用户态、内核态还是中断导致的:用户态高通常对应应用自身计算密集或死循环;内核态高常见于频繁系统调用;软中断高则与网络或磁盘中断处理相关。排查路径是先看整体与进程排行,再下钻到线程级别,必要时结合系统调用追踪查看具体行为。处置前先留证据,重启会丢掉现场。
基本信息
| 整体快照 | top 的批处理模式或 ps 按 CPU 排序 |
|---|---|
| 趋势观察 | pidstat 观察单进程一段时间内的占用 |
| 线程视图 | top -H 或按线程维度查看占用 |
| 中断信息 | /proc/softirqs 与 top 中的中断占比 |
| 依赖工具 | sysstat 包提供 mpstat、pidstat 等命令 |
典型使用场景
- 服务响应变慢,需要确认是否由 CPU 饱和引起
- 监控告警提示 CPU 使用率持续偏高,需要定位到具体进程
- 单核跑满导致延迟上升,需要判断是中断亲和还是单线程热点
- 排查系统调用密集场景,确认是否存在频繁轮询
- 压测前后对比 CPU 分布,评估优化是否有效
- 多个业务共用一个实例时,评估资源竞争与隔离需求
快速定位与下钻
快速定位与下钻
top -b -n1 -o %CPU | head -15 # 按 CPU 排序的单次快照
ps aux --sort=-%cpu | head -10 # 进程级占用排行
mpstat -P ALL 1 3 2>/dev/null || echo 'sysstat 未安装'
pidstat -p <PID> 1 5 2>/dev/null # 单进程 CPU 趋势
top -H -p <PID> # 线程级占用(关注热点线程)
cat /proc/softirqs | head -20 # 内核态高时看软中断分布
pidstat -w -p <PID> 1 5 2>/dev/null # 上下文切换情况
uptime # 负载均值与运行时长占用类型与方向
| 类型 | 典型特征 | 处理方向 |
|---|---|---|
| 用户态高 | 进程自身 CPU 占用高 | 优化算法或扩容,检查死循环 |
| 内核态高 | 系统调用时间占比高 | 结合调用追踪看具体行为 |
| 软中断高 | 中断占比明显 | 检查网络与磁盘中断分布 |
| 单核跑满 | 整体未满但延迟升高 | 确认是否单线程热点或亲和问题 |
| 负载高但 CPU 低 | 等待 IO 或锁竞争 | 转查 IO 与阻塞点 |
先看整体再看线程:整体跑满与单核跑满的处理方向不同,前者可能是并发量问题,后者往往是单线程热点或中断绑定不均衡。
处置前先留证据:抓一份进程与线程快照,必要时保存线程栈;直接重启会让热点行为无从查证,同类问题还会再出现。