一、 CPU 使用率
这是最基础的指标,反映了 CPU 时间片被不同类型任务占用的比例。理解不同状态的占用是定位问题的关键。
1.1 核心指标详解
命令:top, mpstat -P ALL, sar -u
- 指标含义:
| 指标名称 | 对应字段 (top) | 含义详解 | 作用与分析 |
|---|---|---|---|
| User | %us | 用户态使用率。应用程序(如 Java, Nginx, Python)代码逻辑消耗的 CPU 时间。 | 如果此值高,说明业务繁忙或程序算法复杂(如正在进行加密、压缩、循环计算)。一般情况下这是“健康”的高负载。 |
| System | %sy | 内核态使用率。操作系统内核执行系统调用(如读写文件、网络包处理、分配内存)消耗的时间。 | 警示信号。正常情况下不应超过 30%。如果过高,说明进程频繁请求系统资源,或驱动程序有 Bug。 |
| IOWait | %wa | IO 等待时间。CPU 空闲,但因为此时有进程在等待磁盘 I/O 完成,CPU 处于“无所事事但不得不等”的状态。 | 瓶颈信号。虽然它计入 CPU 使用率,但根源是磁盘太慢。说明存储子系统是瓶颈。 |
| Idle | %id | 空闲率。CPU 完全无事可做的时间。 | 反映资源是否富余。注意:高 Idle 并不代表系统一定快(可能卡在 I/O)。 |
| Softirq | %si | 软中断。CPU 处理软中断(主要是网络收发包)的时间。 | 网络信号。如果此值单核飙高,通常意味着由于网络流量极大(如 DDoS 攻击或高频 RPC 调用)导致网卡中断处理不过来。 |
| Steal | %st | 被窃取时间。仅在虚拟机中出现,表示宿主机(Hypervisor)把 CPU 时间分给了其他虚拟机,当前 VM 等待物理 CPU 的时间。 | 环境信号。如果此值高,说明你的云服务器所在的物理宿主机“超卖”严重,邻居在抢资源。 |
作用:快速定位是业务代码慢(User)、系统开销大(Sys)、磁盘慢(IOWait)还是底层宿主机慢(Steal)。
1.2 警报与判断
-
警报阈值:
- 警告 (Warning) :单核或总使用率 > 75%
- 严重 (Critical) :单核或总使用率 > 90%
- 异常 (System) :
%sy> 30% 或%wa> 20%
-
典型场景:
- User 高:程序死循环、复杂的序列化/反序列化、机器学习计算。
- Sys 高:频繁的线程创建/销毁、过多的上下文切换、糟糕的锁竞争。
- IOWait 高:数据库全表扫描、日志写入过快、磁盘故障。
二、 平均负载
Load Average 是衡量系统“繁忙程度”的趋势指标,它和 CPU 使用率不同,它包含正在运行和等待运行(含等待磁盘)的任务。
2.1 核心指标详解
命令:uptime, top, w
- 指标含义:
| 指标名称 | 含义详解 | 作用与分析 |
|---|---|---|
| Load 1/5/15 | 分别代表过去 1分钟、5分钟、15分钟的平均负载。即:运行队列中(Running)+ 不可中断睡眠中(Uninterruptible Sleep/Disk Wait)的进程数平均值。 | 判断趋势。如果不看核数,Load 没有任何意义。标准线 = CPU 逻辑核数。Load < 核数:系统空闲。Load > 核数:系统过载,任务需要排队。 |
2.2 警报与判断
-
警报阈值:
- Load (15min) > CPU核数 * 0.7 (作为预警)。
- Load (1min) > CPU核数 * 1.5 (说明爆发性拥堵)。
-
场景分析:
- Load 高,CPU User 高:计算密集型任务堆积,CPU 确实不够用了。
- Load 高,CPU Idle 高 (关键) :这是由于大量进程处于
D状态(Disk Sleep),通常是因为磁盘 I/O 极其缓慢或 NFS 挂死,导致进程卡在队列里算作 Load,但 CPU 其实是闲着的。
三、 上下文切换与中断 (Context Switches)
CPU 在不同进程/线程之间切换是需要成本的(保存寄存器、刷新缓存等)。
3.1 指标详解
命令:vmstat 1, pidstat -w
| 指标名称 | 对应字段 | 含义详解 | 作用与分析 |
|---|---|---|---|
| cs | system -> cs | 上下文切换总数。每秒 CPU 切换任务的次数。 | 数值取决于业务类型。如果 cs 飙升到几十万/秒,且 CPU %sy 升高,说明程序并发设计不合理(如频繁唤醒线程)。 |
| cswch | pidstat -> cswch | 自愿上下文切换。进程因为等待资源(如 IO、锁)而主动让出 CPU。 | 说明进程资源不足(如等待数据库返回、等待读盘)。 |
| nvcswch | pidstat -> nvcswch | 非自愿上下文切换。进程时间片用完,被系统强制调度走。 | CPU 瓶颈实锤。说明争抢 CPU 的进程太多,都在排队抢时间片。 |
| in | system -> in | 中断次数。每秒硬件中断的次数。 | 正常情况会波动。如果异常飙高,检查网卡流量或 USB 等外设驱动。 |
四、 运行队列 (Process Queue)
这是最直接反映 CPU 是否“排队”的指标。
4.1 指标详解
命令:vmstat 1
| 指标名称 | 对应字段 | 含义详解 | 作用与分析 |
|---|---|---|---|
| r (Running) | procs -> r | 就绪队列长度。正在运行或等待 CPU 时间片的进程数量。 | 判定饱和度的金标准。如果 r 持续大于 CPU 核数,说明 CPU 资源完全不够分,系统严重卡顿。 |
| b (Blocked) | procs -> b | 阻塞队列长度。处于不可中断睡眠(等待 I/O)的进程数量。 | 如果 b 值高,不要查 CPU,去查磁盘或网络存储(NFS/iSCSI)。 |
五、 总结与排查速查表
| 现象 | 可能原因 | 建议排查工具 | 解决思路 |
|---|---|---|---|
| User 高,Load 高 | 业务代码计算量大,死循环 | top (按 P 排序), perf | 优化代码算法,扩容 CPU,分析 Java 线程栈。 |
| Sys 高,Context Switch 高 | 线程切换频繁,锁竞争激烈 | pidstat -w, vmstat | 检查程序并发模型,是否线程池设置过大,减少不必要的系统调用。 |
| Load 高,CPU 使用率低 | 磁盘 I/O 阻塞 (D状态进程) | iotop, dmesg | 检查磁盘读写延迟,检查 NFS/存储挂载情况。 |
| Softirq (si) 高 | 网络包量过大 (PPS高) | ethtool, nicstat, sar -n DEV | 检查是否遭受攻击,开启网卡多队列,优化网络内核参数。 |
| Steal (st) 高 | 宿主机超卖,邻居抢资源 | 无(需联系云厂商) | 迁移实例,或者扩容。 |
| Wait (wa) 高 | 内存不足导致频繁 Swap | free -h, vmstat | 注意关联:内存不足引起 Swap 换入换出,会直接体现为 CPU 的 IOWait 升高。优先解决内存问题。 |