CPU性能监控:平均负载和CPU使用率

在这里插入图片描述

一、平均负载基础

平均负载是指单位时间内,系统处于可运行状态不可中断状态的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。

  • 可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。
  • 不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。

平均负载其实就是平均活跃进程数。平均活跃进程数,直观上的理解就是单位时间内的活跃进程数。

CPU性能监控中的“平均负载”是衡量系统负载的一种常用指标,通常由操作系统提供,它反映了一段时间内系统中正在运行或等待运行的进程数。以下是一些关于平均负载的基本概念:

平均负载通常以一段时间内的平均值表示,常见的时间段为1分钟、5分钟和15分钟。这三个数值通常以三个数字的形式显示,例如:1.00, 0.75, 0.50。这表示最近1分钟、5分钟和15分钟的平均负载。

负载值的含义:

  • 负载小于CPU核心数:表示系统处于良好的状态,CPU资源未完全被占用。
  • 负载等于CPU核心数:表示系统负载较高,资源可能相对紧张。
  • 负载大于CPU核心数:表示系统可能过载,一些进程可能在排队等待CPU资源,从而导致性能下降。

常见的可以使用多种工具来监控平均负载工具:

  • top命令:在Linux系统上,可以使用top命令查看实时负载。
  • htop:相较于tophtop提供了更友好的用户界面和额外功能。
  • vmstat、iostat等:这些命令可以提供更详细的性能数据。

一般情况下,平均负载是根据系统的进程调度队列、运行队列和睡眠队列等状态进行计算的。负载值并非直接等于运行中的进程数量,可能会根据不同操作系统的实现有所差异。

二、使用 uptime 命令分析平均负载

uptime通常用于查看机器的启动时间、登录用户、平均负载等情况,通常用于在线上应急或者技术攻关中,确定操作系统的重启时间。

[root@ubuntusrc]# uptime
 13:01:52 up 46 days, 22:03,  4 users,  load average: 0.13, 0.08, 0.05

从上面的输出可以看到如下信息:

  • 当前时间: 13:01:52
  • 系统已经运行的时间:43天22小时3分钟。
  • 当前在线用户:4个用户,是总连接数量,不是不同用户数量(开一个终端连接就算一个用户)。
  • 系统平均负载:0.13 , 0.08, 0.05,为最近1分钟、5分钟、15分钟的系统负载情况。

比如当平均负载为 2 时,意味着什么呢?

  • 在只有 2 个 CPU 的系统上,意味着所有的 CPU 都刚好被完全占用。
  • 在 4 个 CPU 的系统上,意味着 CPU 有 50% 的空闲。
  • 而在只有 1 个 CPU 的系统中,则意味着有一半的进程竞争不到 CPU。

补充:

  1. 查看 cpu 信息:cat /proc/cpuinfo
  2. 直接获取 cpu 核数:grep 'model name' /proc/cpuinfo | wc -l

负载说明(现针对单核情况,不是单核时则乘以核数):

  • load < 1:没有等待。
  • load == 1:系统已无额外的资源跑更多的进程了。
  • load > 1:进程都堵着等待资源。

注意:

  • load < 0.7时:系统很闲,要考虑多部署一些服务。
  • 0.7 < load < 1时:系统状态不错。
  • load == 1时:系统马上要处理不多来了,赶紧找一下原因。
  • load > 5时:系统已经非常繁忙了。

不同load值说明的问题:

  • 1分钟负载 > 5,5分钟负载 < 3,15分钟负载 < 1:系统在短期内表现出较高的忙碌状态(繁忙),但在中长期内则显得相对空闲。初步判断可能存在短时的抖动或拥塞前兆,但整体情况良好。

  • 1分钟负载 > 5,5分钟负载 > 3,15分钟负载 < 1:短期负载高繁忙)且中期负载也变得紧张,这说明系统可能开始受到拥塞的影响。监控应加强,以防表现进一步恶化。

  • 1分钟负载 > 5,5分钟负载 > 5,15分钟负载 > 5:系统在短、中长期内均处于忙碌状态,显然已经出现拥塞。此时需要立即诊断和优化资源配置,以恢复系统性能。

  • 1分钟负载 < 1,5分钟负载 > 3,15分钟负载 > 5:短期内系统负载较低,但中长期的高负载表明系统之前经历过高压力。目前不需要紧张,系统的拥塞状况正在逐步好转。

举个例子,假设在一个单CPU系统中,平均负载为1.73(1分钟)0.60(5分钟)7.98(15分钟)。可以分析出以下信息:

  • 1分钟负载1.73:在过去1分钟内,系统处于轻度超负载状态(约73%的利用率相对于1个CPU)。
  • 5分钟负载0.60:最近5分钟内,系统负载相对较低,表明系统的空闲时间较多。
  • 15分钟负载7.98:在过去15分钟内,系统经历了较严重的超负载(约698%),这可能表示有持续的高负载任务。
  • 总体趋势显示,在短期内负载有所降低,尽管15分钟的历史数据指向过去存在明显的超负载问题,但当前的状况渐趋改善。建议继续监控后续负载变化,确保系统恢复到健康状态。

三、平均负载与 CPU 使用率

平均负载是指单位时间内,处于可运行状态和不可中断状态的进程数。所以,它不仅包括了正在使用 CPU 的进程,还包括等待 CPU 和等待 I/O 的进程。

CPU 使用率是单位时间内 CPU 繁忙情况的统计,跟平均负载并不一定完全对应。比如:

  • CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者是一致的;
  • I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
  • 大量等待 CPU 的进程调度也会导致平均负载升高,此时的 CPU 使用率也会比较高。比如线程池,线程池的线程数量不能开启过多(一般不会去开启超过CPU核心数的线程数量),假设CPU核心数是 4 ,如果线程池开启 100 个线程,就会导致有 96 个线程要等待系统去调度,从而导致资源被浪费在线程间的上下文切换上。

四、 CPU使用率监测命令

系统自带:pstop

第三方安装:mpstat pidstat

安装对应的命令:apt install stress sysstat

其中sysstat 包括了mpstatpidstat

  • mpstat 是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。
  • pidstat 是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。

压测命令:stress ,一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。

4.1、ps查找进程信息

pstop命令不用搞得太复杂,只需要记住常用的几个选项就够了。比如ps使用比较多的参数是-ef
ps(Process Status)命令用一于显示系统内的所有进程,是 Linux 系统中用于查看当前运行的进程的一个非常重要的命令。它提供了关于进程状态的信息,包括进程ID、占用的CPU和内存等资源。

基本用法:

ps [options]

-l-l 采用详细的格式来显示进程状况。

查看帮助:ps --help all或使用 man ps 命令查看本地手册。

常用方式:

  • ps -elfps -ef,以完整格式显示所有进程,包括父进程ID。
  • ps -aux显示所有进程及其使用的资源。

输出:

fly@LAPTOP-V34UPA81:~$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  2 22:06 ?        00:00:02 /sbin/init
root           2       1  0 22:06 ?        00:00:00 /init
syslog       202       1  0 22:06 ?        00:00:00 /usr/sbin/rsyslogd -n -iNONE
root         210       1  0 22:06 ?        00:00:00 /usr/lib/snapd/snapd
root         211       1  0 22:06 ?        00:00:00 /lib/systemd/systemd-logind
root         347       2  0 22:06 ?        00:00:00 /init
root         348     347  0 22:06 ?        00:00:00 /init
fly          349     348  0 22:06 pts/0    00:00:00 -bash
root         350       2  0 22:06 pts/1    00:00:00 /bin/login -f
fly          407       1  0 22:06 ?        00:00:00 /lib/systemd/systemd --user
fly          408     407  0 22:06 ?        00:00:00 (sd-pam)
fly          413     350  0 22:07 pts/1    00:00:00 -bash
fly          714     349  0 22:08 pts/0    00:00:00 ps -ef

fly@LAPTOP-V34UPA81:~$ ps -aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  2.5  0.2 165888 11060 ?        Ss   22:06   0:03 /sbin/init
root           2  0.0  0.0   2476  1436 ?        Sl   22:06   0:00 /init
syslog       202  0.0  0.1 222404  7232 ?        Ssl  22:06   0:00 /usr/sbin/rsyslogd -n -iNONE
root         210  0.4  0.8 1689904 33868 ?       Ssl  22:06   0:00 /usr/lib/snapd/snapd
root         211  0.0  0.1  15332  7436 ?        Ss   22:06   0:00 /lib/systemd/systemd-logind
root         347  0.0  0.0   2480   116 ?        Ss   22:06   0:00 /init
root         348  0.0  0.0   2496   120 ?        S    22:06   0:00 /init
fly          349  0.0  0.1   6212  5108 pts/0    Ss   22:06   0:00 -bash
root         350  0.0  0.1   7524  4976 pts/1    Ss   22:06   0:00 /bin/login -f
fly          407  0.0  0.2  16916  8816 ?        Ss   22:06   0:00 /lib/systemd/systemd --user
fly          408  0.0  0.0 103244  3384 ?        S    22:06   0:00 (sd-pam)
fly          413  0.0  0.1   6124  4924 pts/1    S+   22:07   0:00 -bash
fly          965  0.0  0.0   7752  3440 pts/0    R+   22:09   0:00 ps -aux

输出字段说明:

  • PID:进程ID。
  • TTY:进程关联的终端。
  • TIME:进程占用的 CPU 时间。
  • CMD:执行的命令。
  • %CPU:进程使用的 CPU 百分比。
  • %MEM:进程使用的内存百分比。
  • USER:进程所属用户。

常用参数:

参数描述
-A显示所有进程(等价于 -e)(utility)
-a显示一个终端的所有进程,除了会话引线
-N忽略选择。
-d显示所有进程,但省略所有的会话引线(utility)
-x显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用(utility)
-ppid 进程使用 CPU 的时间
-uuid 或 username 选择有效的用户 ID 或者是用户名
-ggid 或 groupname 显示组的所有进程。
-Uusername 显示该用户下的所有进程,且显示各个命令的详细路径(如:ps U zhang)(utility)
-f全部列出,通常和其他选项联用(如:ps -faps -fx 等等)
-l长格式(有 F, wchan, C 等字段)
-j作业格式
-o用户自定义格式
-v以虚拟存储器格式显示
-s以信号格式显示
-m显示所有的线程
-H显示进程的层次(和其他的命令合用,如:ps -Ha)(utility)
-e命令之后显示环境(如:ps -d e; ps -a e)(utility)
-h不显示第一行

ps 的参数说明:

参数描述
-l长格式输出
-u按用户名和启动时间的顺序显示进程
-j用任务格式显示进程
-f用树形格式显示进程
-a显示所有用户的所有进程(包括其他用户的进程)
-x显示无控制终端的进程
-r显示运行中的进程
-ww避免详细参数被截断
-A列出所有的进程
-w显示加宽,可以显示较多的信息
-au显示较详细的信息
-aux显示所有进程,包括其他用户的进程
-e显示所有进程,环境变量
-f全格式
-h不显示标题
-l长格式
-w宽输出
-a显示终端上的所有进程,包括其他用户的进程
-r只显示正在运行的进程
-x显示没有控制终端的进程

常用选项组合:

组合描述
aux显示所有进程
lax显示相同结果
-f应用在输出中

pids 只列出进程标识符,之间运用逗号分隔,该进程列表必须在命令行参数地最后一个选项后面紧接着给出,中间不能插入空格。比如:ps -f1,4,5 显示的是进程ID为1,4,5的进程。

长命令行选项:

参数描述
--sort`X[+
--help显示帮助信息
--version显示该命令的版本信息

在前面地选项说明中提到了排序键,接下来对排序键作进一步说明。需要注意的是排序中运用的值是ps运用地内部值,并非仅用于某些输出格式地伪值。排序键列表见下表:

描述
c可执行的简单名称
C完整命令行
f长模式标志
g进程的组ID
G控制 tty 进程组 ID
j累计用户时间
J累计系统时间
k用户时间
K系统时间
m次要页错误的数量
M重点页错误的数量
n累计次要页错误
N累计重点页错误
o会话 ID
p进程 ID
P父进程 ID
r驻留大小
R驻留页
s内存大小(千字节)
S共享页的数量
ttty 次要设备号
T进程启动的时间
UUID
u用户名
v总的虚拟内存数量(字节)
y内核调度优先级

实践:

  1. 检测是否有活动进程:

    sudo ps -ef |grep "nginx: master process" |grep -v grep
    
  2. 检测有几个同样的活动进程:

    sudo ps -ef |grep "nginx: master process" |grep -v grep |wc -l
    

4.2、top命令查询进程的 CPU、内存信息

top命令用于查看活动进程的CPU和内存信息,能够实时显示系统中各个进程的资源占用情况,可以按照CPU、内存的使用情况和执行时间对进程进行排序。它提供了一个动态更新的视图,通常用于性能监控和故障排查。top 命令会定期更新显示的信息,默认每隔 3 秒刷新一次。

使用方式:

top

命令输出:

Tasks: 280 total,   1 running, 199 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.4 us,  0.1 sy,  0.0 ni, 99.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  6143776 total,  1103656 free,  1211704 used,  3828416 buff/cache
KiB Swap:   998396 total,   998384 free,       12 used.  4461984 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                        
     1 root      20   0  185308   5828   3844 S   0.0  0.1   0:05.00 systemd                                        
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.04 kthreadd                                       
     4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H  
     ...

从输出可以看到整体的CPU占用率、CPU负载,以及进程占用CPU和内存等资源的情况。
top 界面中可以使用键盘命令进行交互操作,例如:

操作说明
M按内存使用率排序。
P按 CPU 使用率排序。
k杀死一个进程(需要输入进程 ID)。
q退出 top 界面。按 Ctrl + C 也能推出 top 界面。
t切换报示进程和 CPU 状态信息。
n切换显示内存信息。
r重新设置一个进程的优先级。系统提示用户输入需要改变的进程 PID 及需要设置的进程优先级,然后输入个正数值使优先级降低,反之则可以使该进程拥有更高的优先级,即是在原有基础上进行相加,默认优先级的值是 100。
s改变刷新的时间间隔。
u查看指定用户的进程。
H切换到线程模式,显示所有进程的所有线程。

实践:top 命令查找 cpu 占用率最高的程序,找到对应的PID。

在 top 界面中,通常会默认按 CPU 使用率排序。如果不是,请按 P 键(大写的 P)来按 CPU 使用率排序。

查看具体进程下的线程:

top -Hp pid

4.3、mpstat 命令

mpstat 命令用于实时监控系统CPU的一些统计信息。它可以提供有关多处理器系统中各个 CPU 的性能信息,包括每个 CPU 的使用率、空闲时间、硬件中断、上下文切换等重要指标。这些信息存放在/proc/stat文件中,在多核CPU系统里,不但能查看所有CPU的平均使用信息,还能查看某个特定CPU的信息。

安装命令:

apt install  sysstat

主要功能:

  • CPU 使用率:显示每个 CPU 的利用率,包括用户态、系统态、空闲时间等。
  • 时间间隔监控:可以设置时间间隔,定期显示 CPU 性能数据。
  • 多核处理器支持:在多核心系统中,可以分别显示每个核心的使用情况。

常用语法:

mpstat [选项] [间隔] [次数]

常用选项:

  • -u:显示 CPU 使用率(默认行为)。
  • -P ALL:显示所有 CPU 的统计信息,默认只显示主 CPU。
  • -l:显示 CPU 负载的信息。
  • interval:指定时间间隔(秒),例如 1 表示每秒刷新一次。
  • count:指定显示次数,例如 5 表示显示 5 次后的停止。

使用方式:

mpstat [-P {cpu|ALL}] [internal [count]]

mpstat不带参数时,输出为从系统启动以来的平均值。​

# mpstat -P ALL
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_ubuntu)     08/22/2019  x86_64    (1 CPU)
05:00:44 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:00:44 PM  all    1.67    0.00    1.65    4.21    0.00    0.02    0.00    0.00    0.00   92.45
05:00:44 PM    0    1.67    0.00    1.65    4.21    0.00    0.02    0.00    0.00    0.00   92.45

我们可以看到每个CPU核心的占用率、I/O等待、软中断、硬中断等。
输出各参数含义:

参数含义
-P {cpu l ALL}表示监控哪个CPU, CPU 在[0, CPU个数-1]中取值
internal相邻的两次采样的间隔时间
count采样的次数,count只能和internal一起使用

使用mpstat -P ALL 5 2命令,表示每5秒产生一个报告,总共产生2个。

# mpstat -P ALL 5 2
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_ubuntu)     08/22/2019  x86_64    (1 CPU)
05:04:39 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:04:44 PM  all    1.41    0.00    1.21    3.42    0.00    0.00    0.00    0.00    0.00   93.96
05:04:44 PM    0    1.41    0.00    1.21    3.42    0.00    0.00    0.00    0.00    0.00   93.96
05:04:44 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
05:04:49 PM  all    1.21    0.00    0.80    3.02    0.00    0.00    0.00    0.00    0.00   94.97
05:04:49 PM    0    1.21    0.00    0.80    3.02    0.00    0.00    0.00    0.00    0.00   94.97
Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    1.31    0.00    1.01    3.22    0.00    0.00    0.00    0.00    0.00   94.47
Average:       0    1.31    0.00    1.01    3.22    0.00    0.00    0.00    0.00    0.00   94.47

输出参数含义 :
当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。从第二行开始,输出为前一个interval时间段的平均信息。 输出各参数含义

参数释义/proc/stat获得数据
CPU显示 CPU 的ID,all 表示所有 CPU 的总和。
%usr在internal时间段里,用户态的CPU时间(%),不包含 nice值为负进程usr/total*100
%nice在internal时间段里,nice值为负进程的CPU时间(%)nice/total*100
%sys在internal时间段里,核心时间(%)system/total*100
%iowait在internal时间段里,硬盘IO等待时间(%)iowait/total*100
%irq在internal时间段里,硬中断时间(%)irq/total*100
%soft在internal时间段里,软中断时间(%)softirq/total*100
%steal显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比steal/total*100
%guest显示运行虚拟处理器时CPU花费时间的百分比guest/total*100
%gnicegnice/total*100
%idle在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%)idle/total*100

重点关注%usr%sys%irq%idle这几个参数。

4.4、pidstat 命令

pidstat 主要用于监视和报告全部或特定进程占用系统资源的情况,包括 CPU、内存、I/O 、进程切换、线程数等资源的情况。它是 sysstat 工具包的一部分,适用于分析和调试进程性能问题。

安装命令:

apt install  sysstat

常用语法:

pidstat [选项] [间隔] [次数]

使用方式:

pidstat [option] interval [count]

常用选项:

选项描述
-u表示查看 CPU 相关的性能指标。
-r显示内存使用情况。
-d显示 I/O 使用情况,展示磁盘 I/O 统计数据。
-p [pid]监控特定进程的 PID。若不指定 PID 则监控所有进程。
-h以较短形式显示数值。
-w查看上下文切换情况,要想查看每个进程的详细情况,必须加上。
-t查看线程相关的信息,默认是进程的。常与 -w 结合使用。

使用范例:pidstat -urd -p 进程号

# pidstat -urd -p 24615
Linux 3.10.0-957.5.1.el7.x86_64 (VM_0_ubuntu)     08/22/2019  x86_64    (1 CPU)

# 输出CPU的使用信息 -u

03:48:12 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:48:12 PM     0     24615    0.00    0.00    0.00    0.00     0  nginx

# 输出内存的使用信息 -r

03:48:12 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
03:48:12 PM     0     24615      0.00      0.00   58252  24940   1.32  nginx

# 输出磁盘I/O的使用信息 -d

03:48:12 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
03:48:12 PM     0     24615      0.07      0.00      0.00  nginx
03:20:54 PM   UID       PID   cswch/s nvcswch/s  Command
03:20:54 PM     0     24615      0.03      0.00  nginx
类别指标描述
CPU信息
%usr用户层任务正在使用的 CPU 百分比(with or without nice priority,NOT include time spent running a virtual processor)
%system系统层正在执行的任务的 CPU 使用百分比
%guest运行虚拟机的 CPU 占用百分比
%CPU所有的使用的 CPU 的时间百分比
CPU处理器数量
Command命令
内存信息
PID进程号
minflt/s每秒次缺页错误次数(minor page faults)
majflt/s每秒主缺页错误次数(major page faults)
VSZ该进程使用的虚拟内存(以 kB 为单位)
RSS该进程使用的物理内存(以 kB 为单位)
%MEM当前任务使用的有效内存的百分比
Command任务的命令名
磁盘I/O
PID进程号
kB_rd/s每秒此进程从磁盘读取的千字节数
kB_wr/s此进程已经或者将要写入磁盘的每秒千字节数
kB_ccwr/s由任务取消的写入磁盘的千字节数
Command命令的名字
上下文切换
PIDPID 号
cswch/s每秒自动上下文切换
nvcswch/s每秒非自愿的上下文切换
Command命令

示例:

# 每隔5秒输出1组数据
$ pidstat -w 5
Linux 4.15.0 (ubuntu)  09/23/18  _x86_64_  (2 CPU)

08:18:26      UID       PID   cswch/s nvcswch/s  Command
08:18:31        0         1      0.20      0.00  systemd
08:18:31        0         8      5.40      0.00  rcu_sched
...

这个结果中有两列内容是我们的重点关注对象。一个是 cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数,另一个则是 nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数。

这两个概念一定要牢牢记住,因为它们意味着不同的性能问题:

  • 所谓自愿上下文切换,是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。
  • 而非自愿上下文切换,则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换。

命令的输出包含以下列:

  • PID:进程 ID。
  • UID:用户 ID(拥有该进程的用户)。
  • %usr:用户模式下的 CPU 使用百分比。
  • %system:系统模式下的 CPU 使用百分比。
  • %idle:CPU 空闲时间百分比。
  • kB_r:每次读取的字节数(I/O)。
  • kB_w:每次写入的字节数(I/O)。
  • %mem:进程使用的内存百分比。
  • swpd:进程的交换区使用情况。

五、使用场景

5.1、CPU 密集型进程

模拟一个 CPU 使用率 100% 的场景

stress --cpu 1 --timeout 600

在第二个终端运行 uptime 查看平均负载的变化情况

$ uptime
 16:01:48 up 1 day, 28 min,  4 users,  load average: 0.61, 0.19, 0.06

第三个终端运行 mpstat 查看 CPU 使用率的变化情况:

$ mpstat -P ALL 5
Linux 4.15.0-142-generic (ubuntu)   11/02/2021  _x86_64_    (4 CPU)

04:02:14 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
04:02:19 PM  all   25.03    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   74.97
04:02:19 PM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
04:02:19 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:02:19 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
04:02:19 PM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

正好有一个 CPU 的使用率为 100%,但它的 iowait 只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。

查看是哪个进程导致了cpu使用率为100%

$ pidstat -u 5 1
Linux 4.15.0-142-generic (ubuntu)   11/02/2021  _x86_64_    (4 CPU)

04:05:44 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
04:05:49 PM   122      1236    0.00    0.20    0.00    0.20     3  mysqld
04:05:49 PM   999      3098    0.20    0.00    0.00    0.20     1  redis-server
04:05:49 PM  1000    103642  100.00    0.00    0.00  100.00     2  stress

Average:      UID       PID    %usr %system  %guest    %CPU   CPU  Command
Average:      122      1236    0.00    0.20    0.00    0.20     -  mysqld
Average:      999      3098    0.20    0.00    0.00    0.20     -  redis-server
Average:     1000    103642  100.00    0.00    0.00  100.00     -  stress

5.2、I/O 密集型进程

第一个终端运行 stress 命令模拟 I/O 压力

stress -i 1 --timeout 600

第二个终端运行 uptime 查看平均负载的变化情况

uptime

第三个终端运行 mpstat 查看 CPU 使用率的变化情况

mpstat -P ALL 5 1

查看是哪个进程,导致 iowait较高:

pidstat -u 5 1

5.3、大量进程的场景

第一个终端模拟8个进程:

stress -c 8 --timeout 600

第二个终端uptime

uptime

使用pidstat查看进程情况:

$ pidstat -u 5 1
Linux 4.15.0-142-generic (ubuntu)   11/02/2021  _x86_64_    (4 CPU)

04:13:57 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
04:14:02 PM  1000      3748    0.00    0.20    0.00    0.20     3  unity-panel-ser
04:14:02 PM  1000    103715   50.00    0.00    0.00   50.00     3  stress
04:14:02 PM  1000    103716   49.80    0.00    0.00   49.80     2  stress
04:14:02 PM  1000    103717   49.80    0.00    0.00   49.80     2  stress
04:14:02 PM  1000    103718   49.80    0.00    0.00   49.80     1  stress
04:14:02 PM  1000    103719   49.60    0.00    0.00   49.60     3  stress
04:14:02 PM  1000    103720   49.80    0.00    0.00   49.80     0  stress
04:14:02 PM  1000    103721   49.80    0.00    0.00   49.80     1  stress
04:14:02 PM  1000    103722   49.80    0.00    0.00   49.80     0  stress

Average:      UID       PID    %usr %system  %guest    %CPU   CPU  Command
Average:     1000      3748    0.00    0.20    0.00    0.20     -  unity-panel-ser
Average:     1000    103715   50.00    0.00    0.00   50.00     -  stress
Average:     1000    103716   49.80    0.00    0.00   49.80     -  stress
Average:     1000    103717   49.80    0.00    0.00   49.80     -  stress
Average:     1000    103718   49.80    0.00    0.00   49.80     -  stress
Average:     1000    103719   49.60    0.00    0.00   49.60     -  stress
Average:     1000    103720   49.80    0.00    0.00   49.80     -  stress
Average:     1000    103721   49.80    0.00    0.00   49.80     -  stress
Average:     1000    103722   49.80    0.00    0.00   49.80     -  stress

可以看出,8 个进程在争抢 4 个 CPU,这些超出 CPU 计算能力的进程,最终导致 CPU 过载。

六、总结

本文详细介绍了 CPU 性能监控中常用的指标:平均负载和 CPU 使用率,并探讨了二者之间的关系。

  • 平均负载反映的是系统中处于可运行状态和不可中断状态的进程数,它包括正在使用 CPU 的进程、等待 CPU 的进程以及等待 I/O 的进程。
  • CPU 使用率反映的是 CPU 繁忙情况,表示 CPU 处于工作状态的时间比例。
  • 平均负载和 CPU 使用率并不完全一致,例如 I/O 密集型进程会导致平均负载升高,但 CPU 使用率不一定很高。
  • 监控平均负载和 CPU 使用率,可以帮助我们诊断系统性能问题,例如 CPU 负载过高、进程等待资源等。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lion Long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值