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 组数据的平均值。

🔥运维干货分享

相关推荐
爱签AI电子合同36 分钟前
电子合同上手成本怎么测?易用性维度专项测评
服务器·人工智能·智能合约·企业微信
aixingkong9213 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝5 小时前
mnt_init 函数
linux
律宏阔11 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔11 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴11 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千12 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3712 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3712 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3712 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化