如何有效排查和解决CPU使用率高的问题?
CPU 使用率高可能是由软件、硬件或系统配置问题引起的,以下是一套系统的排查和解决方法:
1. 确认高负载现象
- 查看实时状态:
top # 实时进程监控(按P按CPU排序)
htop # 增强版top(更直观)
glances # 综合监控工具
- 检查系统负载:
uptime # 查看1/5/15分钟的平均负载
sar -u 1 5 # 历史CPU使用率(需安装sysstat)
2. 定位占用CPU的进程
- 找出高CPU进程:
ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head # 按CPU排序
pidstat 1 5 # 监控进程的CPU使用(需安装sysstat)
- 分析进程行为:
- 如果是已知进程(如Java/Python),检查其日志和配置。
- 如果是未知进程,用
strace
或perf
跟踪系统调用:strace -p
# 跟踪进程系统调用
perf top -p
# 分析进程性能热点
3. 针对性优化
3.1 应用程序优化
- 代码级优化:
- 使用性能分析工具(如
gprof
、Valgrind
、py-spy
)定位代码瓶颈。 - 优化算法复杂度(如减少循环嵌套、缓存重复计算结果)。
- 使用性能分析工具(如
- 配置调整:
- 调整线程池大小(如Web服务器的
worker_processes
)。 - 限制任务并发数(如数据库连接池大小)。
- 调整线程池大小(如Web服务器的
3.2 系统级优化
- 调整调度策略:
chrt -f -p 99
# 将进程调度为实时优先级(谨慎使用)
- 限制资源使用:
cpulimit -l 50 -p
# 限制进程CPU使用率不超过50%
- 使用
cgroups
精细化控制:cgcreate -g cpu:/limit_group
cgset -r cpu.cfs_quota_us=50000 limit_group # 限制50% CPU
cgexec -g cpu:limit_group
- 使用
3.3 系统配置检查
- 内核参数调优:
- 修改
/etc/sysctl.conf
:kernel.nmi_watchdog=0 # 关闭NMI看门狗(减少开销)
vm.stat_interval=60 # 延长统计信息刷新间隔
- 修改
- 关闭不必要的服务:
systemctl list-unit-files --state=enabled # 查看已启用的服务
systemctl disable
# 禁用非关键服务
4. 硬件与外部因素排查
- 检查硬件状态:
sensors # 查看CPU温度(需安装lm-sensors)
dmesg | grep thermal # 检查是否因过热降频
- 升级硬件:
- 更换更高主频或多核CPU。
- 使用SSD减少I/O等待时间(间接降低CPU负载)。
5. 高级诊断工具
- 性能剖析:
perf record -F 99 -g -p
# 采样进程性能
perf report # 生成火焰图
- 动态跟踪:
bpftrace -e 'profile:hz:99 { @[ustack] = count(); }' # 捕获用户态堆栈
6. 常见场景示例
- Web服务器CPU飙高:
- 检查是否遭遇CC攻击:用
netstat
分析异常IP。 - 优化数据库慢查询:启用MySQL慢查询日志。
- 检查是否遭遇CC攻击:用
- Java进程CPU 100%:
- 生成线程转储:
jstack
。> thread_dump.log - 检查死锁或无限循环(如
while(true)
)。
- 生成线程转储:
- 内核态CPU占用高:
- 检查系统调用频率:
strace -c -p
。 - 减少频繁的上下文切换(如调整线程模型)。
- 检查系统调用频率:
7. 自动化处理
- 设置监控告警(如Prometheus + Grafana)。
- 使用弹性伸缩(如Kubernetes HPA根据CPU自动扩缩容)。
通过以上步骤,多数CPU高负载问题可定位并解决。若仍无法解决,需结合具体日志和性能分析数据深入排查。