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:相较于
top
,htop
提供了更友好的用户界面和额外功能。 - 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。
补充:
- 查看 cpu 信息:
cat /proc/cpuinfo
。 - 直接获取 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使用率监测命令
系统自带:ps
、top
。
第三方安装:mpstat
、pidstat
。
安装对应的命令:apt install stress sysstat
。
其中sysstat
包括了mpstat
和pidstat
。
mpstat
是一个常用的多核 CPU 性能分析工具,用来实时查看每个 CPU 的性能指标,以及所有 CPU 的平均指标。pidstat
是一个常用的进程性能分析工具,用来实时查看进程的 CPU、内存、I/O 以及上下文切换等性能指标。
压测命令:stress
,一个 Linux 系统压力测试工具,这里我们用作异常进程模拟平均负载升高的场景。
4.1、ps查找进程信息
ps
和top
命令不用搞得太复杂,只需要记住常用的几个选项就够了。比如ps
使用比较多的参数是-ef
。
ps
(Process Status)命令用一于显示系统内的所有进程,是 Linux 系统中用于查看当前运行的进程的一个非常重要的命令。它提供了关于进程状态的信息,包括进程ID、占用的CPU和内存等资源。
基本用法:
ps [options]
-l
或-l
采用详细的格式来显示进程状况。
查看帮助:ps --help all
或使用 man ps
命令查看本地手册。
常用方式:
ps -elf
和ps -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) |
-p | pid 进程使用 CPU 的时间 |
-u | uid 或 username 选择有效的用户 ID 或者是用户名 |
-g | gid 或 groupname 显示组的所有进程。 |
-U | username 显示该用户下的所有进程,且显示各个命令的详细路径(如:ps U zhang )(utility) |
-f | 全部列出,通常和其他选项联用(如:ps -fa 或 ps -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 | 共享页的数量 |
t | tty 次要设备号 |
T | 进程启动的时间 |
U | UID |
u | 用户名 |
v | 总的虚拟内存数量(字节) |
y | 内核调度优先级 |
实践:
-
检测是否有活动进程:
sudo ps -ef |grep "nginx: master process" |grep -v grep
-
检测有几个同样的活动进程:
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 |
%gnice | gnice/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 | 命令的名字 | |
上下文切换 | ||
PID | PID 号 | |
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 负载过高、进程等待资源等。