admin 管理员组

文章数量: 1184232

CPU 使用率是最常用来描述系统CPU 性能的指标

CPU 使用率是 单位时间内 CPU 使用情况的统计,以百分比的方式展示 。那么 **CPU 使用率到底是怎么算出来的吗? 再有 %user、%nice、 %system、%iowait 、%steal 等等,它们之间有什么不同吗?

CPU 使用率

Linux 作为一个多任务操作系统,将 每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉

为了维护 CPU 时间, Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数 每发生一次时间中断,Jiffies 的值就加 1

节拍率 HZ 是内核的可配选项, 可以设置为 100、250、1000 等 。不同的系统可能设置不同数值,你 可以通过查询 /boot/config 内核选项来查看它的配置值 。示例如下:

$ grep'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=250

正因为节拍率 HZ 是内核选项 ,所以用户空间程序并不能直接访问。为了方便用户空间程序, 内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒 。这样,用 户空间程序并不需要关心内核中 HZ 被设置成了多少,因为它看到的总是固定值 USER_HZ

Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息 。比方说,如果 只关注 CPU 的话 可以执行下面的命令

# 只保留各个CPU的数据
$ cat /proc/stat |grep ^cpu
cpu  280580 7407 286084 172900810 83602 0 583 0 0 0
cpu0 144745 4181 176701 86423902 52076 0 301 0 0 0
cpu1 135834 3226 109383 86476907 31525 0 282 0 0 0

这里的输出结果是一个表格。其中, 第一列表示的是 CPU 编号 ,如 cpu0、cpu1 ,而第一行没有编号的 cpu ,表示的是所有 CPU 的累加。 其他列则表示不同场景下 CPU 的累加节拍数 它的单位是 USER_HZ,也就是 10 ms(1/100 秒),所以这其实就是不同场景下的 CPU 时间

具体含义可以 man proc 了解具体指标含义,这里着重介绍下面这些指标的含义:

  • user(通常缩写为 us),代表 用户态 CPU 时间 。注意,它 不包括下面的 nice 时间 ,但 包括了 guest 时间
  • nice(通常缩写为 ni),

本文标签: 使用率是 使用率 编程