服务器 CPU 使用率的计算规则通常基于操作系统采集的 CPU 时间片统计数据,通过一段时间内的采样来计算 CPU 的使用情况。以下是常见的计算规则和原理:
一、CPU时间分类(以Linux为例)
在 Linux 系统中,CPU 时间被划分为多个类别,常见包括:
| 类别 | 说明 |
|---|---|
user |
用户态运行进程所占用的 CPU 时间 |
nice |
运行低优先级(nice值>0)用户进程的时间 |
system |
内核态执行系统调用所占用的时间 |
idle |
CPU 空闲时间 |
iowait |
等待 I/O 完成的空闲时间(但 CPU 可运行) |
irq |
处理硬件中断的时间 |
softirq |
处理软中断的时间 |
steal |
虚拟化环境中,被其他虚拟机“偷走”的时间 |
这些数据通常可以从 /proc/stat 文件中读取。
二、CPU使用率计算公式
1. 基本思路
CPU 使用率 = 非空闲时间 / 总时间
即:
CPU使用率 = (总CPU时间 - 空闲时间) / 总CPU时间 × 100%
更精确地,是通过两次采样之间的差值来计算:
2. 计算步骤
步骤1:第一次采样
从 /proc/stat 读取某一行(如 cpu 行)的各时间累加值:
cpu 1000 50 300 8000 200 40 50 0
分别对应:user, nice, system, idle, iowait, irq, softirq, steal
计算第一次的总时间和空闲时间:
- total1 = user + nice + system + idle + iowait + irq + softirq + steal
- idle1 = idle + iowait
注意:有时 iowait 被计入“空闲”部分,但严格意义上它不是真正空闲。
步骤2:等待一段时间(如1秒)后第二次采样
得到 total2 和 idle2
步骤3:计算差值
- total_diff = total2 – total1
- idle_diff = idle2 – idle1
步骤4:计算使用率
CPU使用率 = (total_diff - idle_diff) / total_diff × 100%
三、示例代码(Python伪代码)
import time
def get_cpu_usage():
with open('/proc/stat', 'r') as f:
line = f.readline()
values = list(map(int, line.split()[1:]))
# 提取各项时间
user, nice, system, idle, iowait, irq, softirq, steal = values
total = user + nice + system + idle + iowait + irq + softirq + steal
# 通常 idle 包括 idle 和 iowait
idle_time = idle + iowait
return total, idle_time
# 第一次采样
total1, idle1 = get_cpu_usage()
time.sleep(1)
# 第二次采样
total2, idle2 = get_cpu_usage()
total_diff = total2 - total1
idle_diff = idle2 - idle1
cpu_usage = (total_diff - idle_diff) / total_diff * 100
print(f"CPU使用率: {cpu_usage:.2f}%")
四、注意事项
-
iowait 是否计入空闲?
- 是的,iowait 属于 CPU 等待 I/O 的空闲状态,所以一般计入 idle。
- 但它反映的是 I/O 压力,高 iowait 可能表示磁盘瓶颈。
-
多核 CPU 如何处理?
/proc/stat中cpu是所有核心的汇总。- 每个
cpu0,cpu1… 表示单个核心,可单独计算每个核心的使用率。
-
虚拟化环境中的
steal- 如果
steal高,表示宿主机资源紧张,影响了你的虚拟机性能。
- 如果
-
工具实现差异
top、htop、sar、vmstat等工具底层都基于/proc/stat,但展示方式略有不同。
五、总结
✅ CPU使用率核心公式:
CPU使用率 = (总活跃时间差) / (总时间差) × 100%
其中:
活跃时间 = user + nice + system + irq + softirq + steal
或等价为:
= (总时间 – idle – iowait) / 总时间 × 100%
这个计算方法广泛应用于监控系统(如Zabbix、Prometheus、Grafana等)中对服务器性能的评估。
如果你使用的是特定平台(如Windows、AWS云服务器、Docker容器等),计算方式可能略有调整,欢迎补充场景进一步探讨。
CDNK博客