服务器的 CPU 使用率 是衡量服务器性能的重要指标之一。它表示 CPU 在某个时间段内被用于执行任务的程度,通常以百分比(%)表示。
一、CPU 使用率的基本概念
CPU 使用率 = (CPU 实际工作时间 / 总时间) × 100%
例如:在 1 秒内,CPU 工作了 0.6 秒,空闲 0.4 秒,则使用率为 60%。
二、Linux 系统中 CPU 使用率的计算原理
Linux 系统通过 /proc/stat 文件提供 CPU 使用情况的统计信息。
1. /proc/stat 中的数据示例:
cat /proc/stat
cpu 123456 1234 56789 1234567 12345 1234 1234 0
这行数据代表的是自系统启动以来 CPU 的累计使用时间(单位是 jiffies,即时钟滴答数),各字段含义如下:
| 字段名 | 含义 |
|---|---|
| user | 用户态时间 |
| nice | 低优先级用户态时间 |
| system | 内核态时间 |
| idle | 空闲时间 |
| iowait | 等待 I/O 完成的时间 |
| irq | 处理硬中断的时间 |
| softirq | 处理软中断的时间 |
| steal | 被其他操作系统偷走的时间(虚拟化环境) |
注意:
idle和iowait都是“非使用”状态,但有些监控工具会将iowait视为“使用”。
2. 计算公式(两个时间点之间的差值)
假设我们获取两次 CPU 时间:
-
第一次读取:
prev_total = user + nice + system + idle + iowait + irq + softirq + steal prev_work = user + nice + system + irq + softirq + steal -
第二次读取:
curr_total = ... curr_work = ...
则 CPU 使用率计算公式为:
$$
text{CPU Usage} = frac{(curr_work – prev_work)}{(curr_total – prev_total)} times 100%
$$
三、多核 CPU 的处理方式
对于多核 CPU,有两种常见方式:
- 每个核心单独计算:适用于分析单个核心负载。
- 整体平均计算:把所有核心的使用时间加总后计算平均使用率。
四、实际监控工具中的实现
常见的监控工具如:
- top/htop
- mpstat
- sar
- nmon
- Prometheus + node_exporter
它们内部都基于上述 /proc/stat 的机制进行采样和计算。
五、举例说明
假设我们第一次读取 /proc/stat 得到:
user=100, nice=0, system=50, idle=800, iowait=10, irq=5, softirq=5, steal=0
第二次读取得到:
user=110, nice=0, system=60, idle=810, iowait=10, irq=5, softirq=5, steal=0
那么:
- prev_work = 100 + 0 + 50 + 5 + 5 + 0 = 160
- curr_work = 110 + 0 + 60 + 5 + 5 + 0 = 180
- prev_total = 100+0+50+800+10+5+5+0 = 970
- curr_total = 110+0+60+810+10+5+5+0 = 990
所以:
$$
text{CPU Usage} = frac{180 – 160}{990 – 970} times 100% = frac{20}{20} times 100% = 100%
$$
这个结果意味着在这段时间里 CPU 完全被占用。
六、注意事项
- 采样间隔很重要:太短可能导致误差大;一般推荐间隔为 1 秒或以上。
- 虚拟机与容器环境:可能需要考虑
steal时间。 - iowait 是否计入使用率:取决于具体监控工具,默认不计入。
七、总结
| 项目 | 内容 |
|---|---|
| 数据来源 | /proc/stat |
| 基本公式 | (工作时间差 / 总时间差) × 100% |
| 多核支持 | 支持 |
| 可视化工具 | top, htop, mpstat, Prometheus 等 |
| 影响因素 | 采样间隔、iowait 是否计入、是否包含 idle 状态等 |
如果你有具体的场景(比如用 Python 或 Shell 脚本实现 CPU 使用率监控),我也可以提供代码示例。欢迎继续提问!
云计算HECS