Linux性能调优:理解CPU中的平均负载和使用率

今天谈下CPU中两个重要的指标:平均负载和使用率。

1、CPU常见指标说明

我们先看一下常用的CPU指标有哪些,可以快速的了解到CPU的使用情况。top命令可以查看CPU的指标信息如下:

复制代码
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

第一行和第二行

load average:1分钟、5分钟、15分钟平均负载信息

Tasks:任务数量,就是总的进程数

running:正在运行的进程数

sleeping:睡眠状态的进程数

stopped:停止状态进程数

zombie:僵尸进程数量
第三行

us:用户空间程序CPU使用率

sy:内核空间CPU使用率

id:CPU空闲率

wa:等待I/O的CPU时间

hi:硬件中断CPU占用率

si:软件中断CPU占用率
最下面一行

PID:进程ID

PR:进程执行的优先级

%CPU:CPU使用率

可以通过ps aux查看单个进程的进程ID、内存使用率、cpu使用率、状态等指标信息。

复制代码
root@node:~# ps aux|head -n10
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  38604  6648 ?        Ss   Sep17   5:05 /sbin/init nopti
root         2  0.0  0.0      0     0 ?        S    Sep17   0:09 [kthreadd]
root         7  0.0  0.0      0     0 ?        I<   Sep17   0:00 [mm_percpu_wq]
root         8  0.0  0.0      0     0 ?        S    Sep17   1:14 [ksoftirqd/0]
root         9  0.0  0.0      0     0 ?        I    Sep17  43:14 [rcu_sched]
root        10  0.0  0.0      0     0 ?        I    Sep17   0:00 [rcu_bh]
root        11  0.0  0.0      0     0 ?        S    Sep17   0:00 [migration/0]
root        12  0.0  0.0      0     0 ?        S    Sep17   0:09 [watchdog/0]
root        13  0.0  0.0      0     0 ?        S    Sep17   0:00 [cpuhp/0]

其中进程常见状态有:

R:运行中(占用 CPU)或就绪(等待 CPU 调度)

S:可中断,等待资源或者信息,被唤醒

D:不可中断,例如等在读写数据

T:暂停状态

Z:僵尸进程

I:多线程进程

<:高优先级别进程,可以组合成S<、I<等

+:前台进程组,可组合R+等

2、CPU平均负载

我们通常使用uptime来快速查看系统负载信息。

复制代码
root@node:~# uptime
 21:58:50 up 321 days, 12:10,  1 user,  load average: 4.25, 4.98, 4.73

几个指标含义:

21:58:50 #当前系统时间

321 days #系统运行时间

1 user #当前登录用户

load average: 4.25, 4.98, 4.73 #1分钟、5分钟、15分钟负载

根据uptime给出的load average定义,平均负债是指单位时间内处于可运行状态(runnable)或不可中断状态(uninterruptable)的进程平均数量。

可运行状态是指ps查看的R状态进程,也就是正在使用CPU或者等待使用CPU的进程。

不可中断状态是指进程正处于内核执行中,且等待设备响应,不可中断否则可能丢失数据。

我们前面文章谈到过,一个cpu同一时间只能处理一个进程,这里的负载数据一般跟cpu数量有比较大的关系,单位时间一旦进程数量超过核数,就会出现竞争cpu的情况,导致负载快速升高。

平均负载一般要取1分钟、5分钟、15分钟等维度,主要反映负载的变化趋势,例如当1分钟很高时,5分钟和15分钟较低,表明负载趋势可能正在恶化。相反1分钟较低,而5分钟较高,表明负载正在降低。

3、CPU使用率

CPU使用率跟平均负载一定要区分开,它们两者有关系但没有强联系,不是说负载高了,使用率一定就高。

CPU使用率一般是指单位时间内CPU的使用占比,也就是繁忙程度。

我们可以从前面的top和ps命令查看系统整体CPU使用率和进程的使用率,同时我们还可以使用mpstat实时查看每个CPU的使用情况。

复制代码
# -P ALL 表示监控所有CPU,后面数字5表示间隔5秒后输出一组数据
root@node:~# mpstat -P ALL 5
Linux 4.15.0-58-generic (cs1ahyper01n07)        12/04/2025      _x86_64_        (64 CPU)

10:41:46 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
10:41:51 PM  all    1.10    0.00    1.82    0.01    0.00    0.40    0.00    0.93    0.00   95.74
10:41:51 PM    0    0.49    0.00    1.78    0.00    0.00   20.06    0.00    0.00    0.00   77.67
10:41:51 PM    1    0.20    0.00    0.20    0.00    0.00    0.60    0.00    0.00    0.00   99.00
10:41:51 PM    2    0.20    0.00    2.01    0.00    0.00    0.00    0.00    0.00    0.00   97.79
10:41:51 PM    3    0.40    0.00    1.41    0.00    0.00    0.00    0.00    0.20    0.00   97.99
10:41:51 PM    4    0.40    0.00    0.40    0.00    0.00    0.00    0.00    0.40    0.00   98.80
10:41:51 PM    5    0.40    0.00    0.20    0.00    0.00    0.00    0.00    0.20    0.00   99.20
10:41:51 PM    6    0.20    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.80
10:41:51 PM    7    0.40    0.00    0.40    0.00    0.00    0.00    0.00    0.00    0.00   99.19

这里几个重要指标:

CPU:CPU核心,all是整体数据

%usr:用户态进程占用 CPU 的时间占比,大部分是应用程序

%sys:内核态进程占用 CPU 的时间占比,内核操作

%iowait:CPU 等待 I/O 操作的占比,与前面说的不可中断进程有很大关系。

%idle,CPU空闲使用率

我们在对比平均负载和CPU使用率时,可以从几个维度来看。

  • 大量进程的应用,导致CPU被大量占用,负载和使用率都会升高。
  • 如果应用有大量I/O操作,导致不可中断进程增加,负载会升高,CPU使用率不一定很高。这时候应该重点关注%iowait指标。
相关推荐
aixingkong9214 小时前
Nvidia为例 XPU的Multi-Host、Socket Direct 、GPUDirect、RDMA 技术点分析
服务器·网络·硬件架构·硬件工程
雯宝6 小时前
mnt_init 函数
linux
律宏阔12 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔12 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴12 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千12 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3712 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3712 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3712 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh12 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker