CPU短暂飙升的排查需要结合系统监控、进程分析和场景还原等多个维度进行。以下为系统化的排查方法:
1. 实时监控工具分析
- 使用`top -H -p
- `pidstat -u 1 5`可采样特定进程的CPU使用率,短时间间隔(如1秒)能捕捉瞬时高峰。
- `perf top -g`通过性能计数器分析热点函数,适用于内核态/用户态代码分析。
2. 历史数据追溯
- 检查`/var/log/sa/saXX`(sysstat历史数据),使用`sar -u -f /var/log/sa/saXX`分析历史CPU利用率。
- 对于K8s环境,需排查Prometheus中对应容器的CPU Throttling指标和Limits配置。
3. 进程级深度诊断
- 对可疑进程执行`strace -p
- `jstack
4. 内核事件关联
- `perf record -ag`捕获上下文切换(context switch)和调度延迟,配合`perf script`分析。
- `dmesg -T| grep -i 'throttle'`检查是否触发cgroup CPU限制或内核soft lockup。
5. 外部因素排查
- 检查相邻进程的CPU亲和性(`taskset -pc
- 存储I/O等待(`iostat -x 1`)或网络中断(`cat /proc/interrupts`)可能导致CPU间接飙升。
6. 进阶手段
- 使用eBPF工具如`cpudist`(BCC工具包)统计任务在CPU上的时间分布。
- 对Go程序可用`go tool pprof`抓取性能剖析样本,分析GC或协程调度问题。
典型场景示例:某Java应用短暂CPU 100%可能由CMS GC并发标记阶段引起,通过`jstat -gcutil
注意:虚拟机环境需排除宿主机资源争抢,检查`/proc/vmstat`中的steal时间占比;云环境还需确认是否遭遇邻租户噪声干扰(noisy neighbor)