CPU利用率达到100%时,需通过系统化方法定位问题根源。以下为详细步骤及扩展知识:
1. 系统级监控工具
- top/htop命令:实时查看各进程CPU占用,关注`%CPU`列及`TIME+`累计运行时间。僵尸进程(状态为Z)可能因父进程未回收资源导致。
- vmstat 1:观察`r`(运行队列长度)和`us`(用户态CPU占比),若`r`值持续超过逻辑CPU核数,说明存在CPU竞争。
2. 进程深度分析
- strace -p [PID] -T:高负载进程的系统调用,关注`nanosleep`等阻塞调用是否异常。
- perf top:采样函数级热点,特别关注内核符号(如`[kernel.kallsyms]`)占比过高可能暗示驱动或中断问题。
3. 线程级排查
- ps -eLf | grep [PID]:查看线程数,线程爆炸(如Java应用未配置线程池)会导致上下文切换暴增。
- pidstat -t -p [PID] 1:细分线程CPU占用,配合`jstack`(Java)或`gdb`(C++)获取堆栈。
4. 内核参数诊断
- sar -q:检查`runq-sz`和`plist-sz`,若伴随`%sys`过高需排查自旋锁争用。
- dmesg:查看OOM或硬件错误(如CPU温度导致的throttling)。
5. 应用层优化
- JVM应用:检查GC日志是否频繁Full GC,ParallelGC线程数是否过高。
- 数据库:慢查询(如MySQL的`slow_query_log`)或缺失索引可能导致计算浪费。
6. 硬件关联
- irqbalance服务:确保中断均匀分配,否则单核软中断(如网卡`ksoftirqd`)可能满载。
- CPU C-states:电源管理策略不当会导致从深睡眠唤醒延迟,可通过`cpupower`调整。
补充知识点:Linux的CFS调度器会公平分配CPU时间片,但实时进程(`SCHED_FIFO`)或CPU亲和性设置错误可能导致核间负载不均。容器环境中还需检查cgroup的cpu.shares限制。长期100%负载可能触发thermal throttling,此时需检查散热或考虑负载均衡架构优化。