CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标。
为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。
为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。
节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同数值,每发生一次时间中断,Jiffies 的值就加 1。例如,我们测试机上
adb pull /proc/config.gz .
gzip -C config.gz
cat config | grep CONFIG_HZ
# CONFIG_HZ_PERIODIC is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
CONFIG_HZ_300=y
# CONFIG_HZ_1000 is not set
CONFIG_HZ=300
同时,正因为节拍率 HZ 是内核选项,所以用户空间程序并不能直接访问。
为了方便用户空间程序,内核还提供了一个用户空间节拍率 USER_HZ,它总是固定为 100,也就是 1/100 秒。这样,用户空间程序并不需要关心内核中 HZ 被设置成了多少,因为它看到的总是固定值 USER_HZ。
getconf CLK_TCK
100
单位时间内 CPU 使用情况的统计,以百分比的方式展示繁忙百分比。
Linux 通过 /proc 虚拟文件系统,向用户空间提供了系统内部状态的信息,而 /proc/stat 提供的就是系统的 CPU 和任务统计信息。比方说,如果你只关注 CPU 的话,可以执行下面的命令:
# cat /proc/stat | grep ^cpu
cpu 234216 27933 319655 17408210 4562 55507 27548 0 0 0
cpu0 49539 7960 70000 2095840 766 17747 6814 0 0 0
cpu1 46158 7493 69829 2102226 919 14273 6062 0 0 0
cpu2 34898 2226 74222 2118598 778 12061 5720 0 0 0
cpu3 33398 2343 72419 2119606 904 9585 8048 0 0 0
cpu4 21543 1631 9387 2238443 136 437 189 0 0 0
cpu5 22054 1652 10093 2237259 127 434 203 0 0 0
cpu6 22313 1711 10588 2236524 129 420 185 0 0 0
cpu7 4308 2914 3114 2259711 798 547 323 0 0 0
这里的输出结果是一个表格。其中,第一列表示的是 CPU 编号,如 cpu0、cpu1 ,而第一行没有编号的 cpu ,表示的是所有 CPU 的累加。其他列则表示不同场景下 CPU 的累加节拍数,它的单位是 USER_HZ,也就是 10 ms(1/100 秒),所以这其实就是不同场景下的 CPU 时间。当然,这里每一列的顺序并不需要背下来。有需要的时候,查询 man proc 就可以。下面,来依次解读一下。
CPU 使用率,就是除了空闲时间外的其他时间占总 CPU 时间的百分比,用公式来表示就是:
根据这个公式,我们就可以从 /proc/stat 中的数据,很容易地计算出 CPU 使用率。当然,也可以用每一个场景的 CPU 时间,除以总的 CPU 时间,计算出每个场景的 CPU 使用率。
不过先不要着急计算,直接用 /proc/stat 的数据,算的是什么时间段的 CPU 使用率吗?这是开机以来的节拍数累加值,所以直接算出来的,是开机以来的平均 CPU 使用率,一般没啥参考价值。
事实上,为了计算 CPU 使用率,性能工具一般都会取间隔一段时间(比如 3 秒)的两次值,作差后,再计算出这段时间内的平均 CPU 使用率,即:
本文系作者在时代Java发表,未经许可,不得转载。
如有侵权,请联系nowjava@qq.com删除。