Linux CPU 告警排查
现象
监控在业务高峰期持续触发 CPU 告警,top 看到 CPU 使用率很高,甚至达到 100% 以上。部分机器告警明显,但同一业务下其他机器没有告警。
常见影响:
- 服务响应变慢。
- 业务高峰期告警频繁。
- 容量评估不准确。
- 容易误判为应用异常或流量攻击。
环境
- 系统:Linux
- 组件:业务服务、监控系统
- 常用命令:
top,mpstat,mpstat -P ALL
排查过程
- 先用
top看实时 CPU 占用,确认是整体 CPU 高,还是某个进程异常。
top- 查看 CPU 细分指标,判断 CPU 时间主要消耗在哪里。
mpstat 2 5重点看这些字段:
| 字段 | 含义 | 排查方向 |
|---|---|---|
%usr | 用户态 CPU 占比 | 应用计算、业务逻辑、压测流量 |
%sys | 内核态 CPU 占比 | 系统调用、网络、文件 IO |
%iowait | 等待 IO 的 CPU 占比 | 磁盘或网络 IO 瓶颈 |
%idle | 空闲 CPU 占比 | 越低说明越忙 |
%steal | 虚拟化环境被宿主机抢占的时间 | 云主机资源争抢 |
- 查看每个 CPU 核心的负载,判断是否单核打满。
mpstat -P ALL 2 5- 对比不同机器的 CPU 核心数和规格。
lscpu
nproc如果只有部分机器告警,要重点比较机器规格、流量分配、实例数量和部署角色。
根因
常见根因包括:
- 告警机器规格较低,比如只有 2 核,而其他机器是 16 核。
- 业务流量分配不均,少数机器承担更多请求。
- 应用线程或进程绑定导致单核压力高。
- 程序进入异常循环,持续消耗 CPU。
- IO 等待、虚拟化抢占等问题被误认为单纯 CPU 不足。
在原始记录中,CPU 告警的关键发现是:告警机器 CPU 核心数比其他机器少,高峰期承接流量时更容易触发 CPU 告警。
解决方法
确认是否规格不一致
lscpu
nproc
mpstat -P ALL 2 5如果发现告警机器核心数明显更少,优先处理容量和调度问题:
- 调整负载均衡权重。
- 将低规格机器移出高峰流量池。
- 扩容机器规格。
- 增加同规格实例。
确认是否进程异常
top
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head如果某个进程 CPU 异常高,再继续看线程级别。
top -H -p <pid>确认是否 IO 等待
mpstat 2 5
iostat -x 2 5如果 %iowait 很高,CPU 告警可能只是表象,根因更可能在磁盘 IO 或网络 IO。
验证结果
mpstat 2 5
mpstat -P ALL 2 5
top确认点:
- CPU 告警恢复或明显下降。
- 高峰期
%idle不再长期接近 0。 - 不同机器负载更均衡。
- 服务响应时间恢复正常。
预防措施
- 同一服务池尽量保持机器规格一致。
- 负载均衡权重要和机器规格匹配。
- 监控里同时看 CPU 使用率、核心数、负载、QPS 和响应时间。
- 高峰期前做容量评估,不只看平均 CPU。
- 对单核打满、IO wait 高、steal 高分别设置排查路径。