Linux性能调优:详解CPU使用率计算方式

上篇我们简要谈了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 组数据的平均值。

🔥运维干货分享

相关推荐
秋深枫叶红2 小时前
嵌入式第三十四篇——linux系统编程——进程
linux·服务器·数据库·学习
普通网友3 小时前
深入探讨Linux驱动开发:字符设备驱动开发与测试_linux 驱动开发设备号(2)
java·linux·驱动开发
hakuii3 小时前
linux中的一些配置
linux·运维·服务器
测试人社区-千羽3 小时前
生物识别系统的测试安全性与漏洞防护实践
运维·人工智能·opencv·安全·数据挖掘·自动化·边缘计算
时光の尘3 小时前
嵌入式面试八股文(十九)·裸机开发与RTOS开发的区别
linux·stm32·单片机·iic·rtos·spi
一点事3 小时前
centos7:离线安装docker
运维·docker·容器
瑾珮3 小时前
nmcli命令网络配置
linux·网络
qq_420443273 小时前
AMD显卡在windows中通过WSL安装使用stable diffusion(WebUI和ComfyUI)
linux·windows·ubuntu·stable diffusion·wsl
无事好时节3 小时前
Linux 进程管理
linux