服务器 CPU 使用率的计算规则,本质上是操作系统通过统计 CPU 在一段时间内用于不同任务的时间比例来得出的。下面是详细的计算规则和原理:
🧠 一、CPU 使用率的基本定义
CPU 使用率(CPU Utilization) 是指在某个时间段内,CPU 被用于执行任务(用户进程、系统进程等)的时间占总时间的百分比。
单位通常是:%(百分比)
📊 二、Linux 系统中 CPU 使用率的计算方式
在 Linux 中,CPU 使用情况可以从 /proc/stat 文件中获取。这个文件记录了 CPU 各个状态的时间累计值(以 时钟滴答 tick 为单位,通常每秒有 100 或 1000 个 tick)。
示例 /proc/stat 内容:
cpu 123456 7890 23456 345678 9876 1234 5678 0 0 0
字段含义如下:
| 字段 | 描述 |
|---|---|
| user | 用户态时间(不包括 nice) |
| nice | 用户态低优先级进程时间 |
| system | 内核态时间 |
| idle | 空闲时间 |
| iowait | 等待 I/O 完成时间 |
| irq | 硬中断服务时间 |
| softirq | 软中断服务时间 |
| steal | 被其他操作系统偷走的时间(虚拟化环境) |
| guest | 运行虚拟客户机所花时间 |
| guest_nice | 运行低优先级虚拟客户机时间 |
注意:前 8 个字段是最常见的,后续两个可选。
🧮 三、CPU 使用率计算公式(两时刻差值法)
要计算 CPU 使用率,需要两次读取 /proc/stat 的值,间隔一定时间(如 1 秒),然后根据差值进行计算。
步骤如下:
- 第一次读取
cpu行数据:total1, idle1 - 等待一段时间(比如 1s)
- 第二次读取
cpu行数据:total2, idle2 - 计算使用率:
# 总时间 = 所有非空闲时间之和
total = user + nice + system + irq + softirq + steal + guest + guest_nice
idle = idle + iowait
# 两次采样之间的总时间和空闲时间
total_diff = total2 - total1
idle_diff = idle2 - idle1
# CPU 使用率 = (总使用时间 / 总时间) * 100%
cpu_usage = (total_diff - idle_diff) / total_diff * 100
📈 四、实际示例(Python 伪代码)
def get_cpu_usage():
with open('/proc/stat', 'r') as f:
line = f.readline()
parts = list(map(int, line.split()[1:]))
user, nice, system, idle, iowait, irq, softirq, steal, _, _ = parts
total = user + nice + system + irq + softirq + steal
idle_total = idle + iowait
# 上次采集的数据
global last_total, last_idle
if last_total is None:
last_total, last_idle = total, idle_total
return 0
delta_total = total - last_total
delta_idle = idle_total - last_idle
cpu_usage = (delta_total - delta_idle) / delta_total * 100
last_total, last_idle = total, idle_total
return cpu_usage
📌 五、注意点
- 采样间隔不能太短或太长:建议 0.5~1 秒之间。
- 多核处理:每个核心都有自己的
cpu0,cpu1, … 条目。可以分别计算,也可以汇总平均。 - 虚拟化影响:在虚拟机中,
steal时间也会影响 CPU 使用率。 - 工具依赖:top、htop、mpstat、vmstat、sar 等命令底层也是基于
/proc/stat实现的。
✅ 六、总结
| 项目 | 说明 |
|---|---|
| 数据来源 | /proc/stat |
| 单位 | 百分比 % |
| 核心公式 | (总使用时间 - 空闲时间) / 总时间 × 100% |
| 采样方法 | 两次读取差值法 |
| 多核支持 | 可单独统计每个核心 |
| 工具实现 | top/htop/mpstat 等均基于此机制 |
如果你是在写监控程序或者想理解监控系统的 CPU 指标,掌握这些内容就足够了。
如需我提供一个完整的 Python 获取 CPU 使用率的脚本,请告诉我 😄
CLOUD技术博