
上篇我们简要谈了CPU的平均负载和使用率,它们之间是不一样的,代表了CPU不同的观察维度。今天我们来详细聊下CPU的使用率,看一下这个使用率指标是怎么来的,以及它是如何反映CPU的性能问题。
1、CPU使用率的计算
在计算CPU使用率之前,我们要先了解一下一个叫Jiffies的东西,它是Linux
内核中的时钟滴答计数器,是以系统启动开始计算,以单位时间HZ为间隔,不断地累积计数。
这里的HZ是单位时间,一般以ms计算,分内核空间HZ和用户空间HZ。内核空间HZ可以在系统内查看,并且可以修改。
bash
root@node:~# grep 'CONFIG_HZ=' /boot/config-$(uname -r)
CONFIG_HZ=250
这里的250就是1000ms内计250次,也就是4ms为一个单位时间。用户空间HZ一般是一个固定值10ms。
你可能疑问内核和用户空间HZ怎么还不一样,这个一方面是早期Linux内核被设置成了10ms,用户空间也跟着使用了10ms。再就是后来使用场景发生了差异化,一般桌面系统为了体验更好,系统内核希望HZ增大,但也增加了功耗,而一些服务器为了减少功耗则不希望太高的HZ一般4ms就可以了。在后期内核设计时,内核HZ就可以兼容的向用户HZ进行转换。
我们一般在/proc/stat 中查看Jiffies累计值。
bash
root@node:~# cat /proc/stat
cpu 1549370658 9 1805063913 174156780720 9707711 0 216981980 0 725037436 0
cpu0 14624038 0 12618687 2715504522 206472 0 193511845 0 7216830 0
cpu1 12030579 0 11686870 2751300042 180759 0 10469844 0 4488307 0
cpu2 11639548 0 11156338 2752924400 140756 0 2195205 0 4473860 0
cpu3 12235160 0 11439675 2751463622 361104 0 892799 0 4916428 0
这里面的数值含义如下,第一列表示的是 CPU 编号,如 cpu0、cpu1 ,而第一行没有编号的 cpu ,表示的是所有 CPU 的累加。
我们以第二行数值为例,分别做一下说明。
14624038: user(通常缩写为 us),表示用户态CPU时间,并且包含guest时间。
0: nice(通常缩写为 ni),表示低优先级用户态 CPU 时间。
12618687: system(通常缩写为 sys),表示内核态CPU时间。
2715504522: idle(通常缩写为 id),表示空闲时间。
206472: iowait(通常缩写为 wa),表示等待 I/O执行 的 CPU 时间。
0: irq(通常缩写为 hi),表示处理硬中断的 CPU 时间。
193511845: softirq(通常缩写为 si),表示处理软中断的 CPU 时间。
0: steal(通常缩写为 st),表示虚拟化环境中,当前虚拟机被物理机 "抢占" CPU 资源的时间占比,物理机环境下通常为 0。
7216830: guest(通常缩写为 guest),表示运行虚拟机的CPU时间。
0: guest_nice(通常缩写为 gnice),表示以低优先级运行虚拟机的时间。
了解了上面的信息,我们再来看怎么计算CPU使用率。
还记得我们用top查看CPU使用率时,它的值一般是动态的,这是因为top命令是3s统计一次,显示的值其实是一个3s平均使用值。所以我看到的这个CPU使用率的计算公式是:当前此刻的(总时间-
空闲时间)与3s前的(总时间-空闲时间)除以 3s内(总CPU时间的差值)。这个计算方法也是各种监测工具的计算方法。
2、查看CPU使用率
观察CPU使用率,top和ps是最常用的工具。
top 显示了系统总体的 CPU 和内存使用情况,以及各个进程的资源使用情况。ps 则显示了每个进程的资源使用情况。
bash
top
- 20:12:00 up 70 days, 3:49, 1 user, load average: 0.10, 0.18, 0.14
Tasks: 2229 total, 1 running, 332 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni, 99.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 52468537+total, 47777491+free, 36061900 used, 10848532 buff/cache
KiB Swap: 31250428 total, 31250428 free, 0 used. 48045312+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
29973 root 20 0 42728 5972 3136 R 0.7 0.0 0:00.16 top
9 root 20 0 0 0 0 I 0.3 0.0 43:13.52 rcu_sched
22809 root 20 0 1024352 88780 19280 S 0.3 0.0 56:53.22 zk_proxy
第三行 %Cpu 就是系统的 CPU 使用率,其他字段的含义在上一篇中都讲过了,不再重复。
除了上面的两个工具,一般我们还需要用到pidstat工具来实时观察进程的CPU使用率。例如使用 pidstat 1 5 查看。
bash
#每隔1秒输出一组数据,共输出5组
root@node:~# pidstat 1 5
Linux 4.15.0-58-generic (cs1ahyper01n07) 12/06/2025 _x86_64_ (64 CPU)
10:41:09 AM UID PID %usr %system %guest %CPU CPU Command
10:41:10 AM 0 65 0.00 0.95 0.00 0.95 9 ksoftirqd/9
10:41:10 AM 0 3565 26.67 0.00 0.00 26.67 18 telegraf
10:41:10 AM 0 8788 1.90 0.00 0.00 1.90 47 mq_proxy
每个字段的含义
用户态 CPU 使用率 (%usr)
内核态 CPU 使用率(%system)
运行虚拟机 CPU 使用率(%guest)
总的 CPU 使用率(%CPU)
最后的 Average 部分,还计算了 5 组数据的平均值。