服务器cpu使用率计算规则?

服务器

服务器 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}%")

四、注意事项

  1. iowait 是否计入空闲?

    • 是的,iowait 属于 CPU 等待 I/O 的空闲状态,所以一般计入 idle。
    • 但它反映的是 I/O 压力,高 iowait 可能表示磁盘瓶颈。
  2. 多核 CPU 如何处理?

    • /proc/statcpu 是所有核心的汇总。
    • 每个 cpu0, cpu1… 表示单个核心,可单独计算每个核心的使用率。
  3. 虚拟化环境中的 steal

    • 如果 steal 高,表示宿主机资源紧张,影响了你的虚拟机性能。
  4. 工具实现差异

    • tophtopsarvmstat 等工具底层都基于 /proc/stat,但展示方式略有不同。

五、总结

CPU使用率核心公式:

CPU使用率 = (总活跃时间差) / (总时间差) × 100%
其中:
活跃时间 = user + nice + system + irq + softirq + steal
或等价为:
= (总时间 – idle – iowait) / 总时间 × 100%

这个计算方法广泛应用于监控系统(如Zabbix、Prometheus、Grafana等)中对服务器性能的评估。


如果你使用的是特定平台(如Windows、AWS云服务器、Docker容器等),计算方式可能略有调整,欢迎补充场景进一步探讨。

未经允许不得转载:CDNK博客 » 服务器cpu使用率计算规则?