一、CPU告警时的第一反应
当收到云服务器CPU使用率持续超过80%的告警时,许多运维人员的第一反应是立即重启服务。但这种方法就像用退烧药治疗不明原因的发热,可能掩盖真正的问题。正确做法应该是:
- 保持冷静:高CPU不一定意味着系统即将崩溃
- 记录时间点:精确记录问题开始时间和持续时长
- 收集基线数据:对比正常时期的CPU使用曲线
二、诊断五步法详解
第一步:快速定位异常进程
在Linux系统中,最有效的命令组合是:
top -c -o %CPU ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head -n 10
关键观察点:
- 是否某个特定进程独占CPU
- 是否有大量同类型进程堆积
- 异常进程的运行时间(TIME+字段)
第二步:线程级分析
使用以下命令查看线程级别的CPU消耗:
top -H -p [PID] pidstat -t -p [PID] 1 5
典型案例:某电商系统因一个商品搜索接口的线程死循环,导致单个线程占用200%CPU(双核环境下)
第三步:性能剖析(Profiling)
针对Java应用:
jstack -l [PID] > thread_dump.log jstat -gcutil [PID] 1000 5
针对Python应用:
py-spy top --pid [PID]
分析重点:
- 锁竞争情况
- GC频率和耗时
- 热点调用栈
三、经典案例分析
案例1:MySQL连接风暴
现象:CPU持续100%,大量sleep状态的MySQL进程
排查:
SHOW PROCESSLIST; SHOW STATUS LIKE 'Threads_connected';
解决:优化连接池配置,添加连接数限制
案例2:日志循环打印
现象:凌晨3点突然CPU飙升,持续2小时后自动恢复
排查:通过sar日志发现与日志切割时间吻合
根本原因:错误配置的logrotate导致日志文件被频繁创建和删除
四、长期监控策略
预防胜于治疗,建议部署:
| 工具 | 监控指标 | 报警阈值 |
|---|---|---|
| Prometheus | node_cpu_seconds_total | 85%持续5分钟 |
| ELK | 应用日志错误频率 | 每分钟10次以上 |
五、常见问题解答
Q:云监控显示CPU高但服务器上查不到高占用进程?
A:可能是云平台的监控数据延迟或采样误差,建议:
- 直接登录服务器运行top确认
- 检查是否有短时爆发的进程(使用atop工具)
- 可能是邻居虚拟机噪音(在公有云较常见)
CPU高负载排查的关键在于方法论+工具链+经验积累的结合。建议运维团队:
- 建立标准化的排查流程
- 定期进行故障演练
- 保存历史案例库
