1、工具简介
mpstat
用来查看系统每个 CPU 的性能指标,以及所有 CPU 的平均指标。
vmstat
可以查看系统上下文切换、内存。
前两个只给出了系统总体的情况,要想查看每个进程的详细情况,就需要使用 pidstat
。
pidstat
用来查看具体进程的 CPU、内存、I/O 以及上下文切换等性能指标。
pidstat
默认显示进程的数据,加 -t
参数可以输出线程的数据。加 -w
参数可以输出上下文切换情况。
2、平均负载
$ uptime
12:49:05 up 2 days, 10:26, 2 users, load average: 0.11, 0.08, 0.02
12:49:05
是当前时间;
up 2 days, 10:26
是系统运行时间;
2 users
是正在登录用户数(因为我开了 2 个ssh终端,所以是 2);
load average
三个值分别是过去 1、5、15
分钟的平均负载(top
命令的第一行也有输出)。平均负载是平均活跃进程数,如果这三个值相差不大,说明系统负载很平稳。
获取 CPU 数量可以用命令:
$ grep 'model name' /proc/cpuinfo | wc -l
1
最理想的情况是每个 CPU 上都刚好运行着一个进程,每个 CPU 都得到了充分利用。
当平均负载比 CPU 个数大的时候,系统已经出现了过载。
当平均负载高于 CPU 数量 70% 的时候,就应该分析排查负载高的问题了。
下面用 stress 命令模拟一个 CPU 压力的场景,先安装 stress
:
sudo apt install stress
stress --cpu 1 --timeout 600
--cpu 1
是产生 1 个进程不停的计算随机数的平方根, --timeout 600
是在 600 秒之后结束。
在另一个终端查看 uptime
输出,平均负载很快就接近 1
了。
$ uptime
13:07:39 up 2 days, 10:45, 2 users, load average: 0.01, 0.01, 0.00
$ uptime
13:10:49 up 2 days, 10:48, 2 users, load average: 0.94, 0.40, 0.15
$ uptime
13:12:33 up 2 days, 10:50, 2 users, load average: 0.99, 0.58, 0.25
或者用 watch -d -n 1 uptime
可以自动刷新,也可以观测到平均负载在变高。
-d
表示变化的部分可以高亮显示,
-n
是刷新间隔,这里选每 1 秒刷新,
用 mpstat
也可以观察到,%usr
在升高:
$ mpstat
Linux 4.15.0-117-generic (uu) 09/14/2020 _x86_64_ (1 CPU)
01:09:57 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
01:09:57 PM all 0.27 0.01 0.34 0.09 0.00 0.01 0.00 0.00 0.00 99.28
$ mpstat
Linux 4.15.0-117-generic (uu) 09/14/2020 _x86_64_ (1 CPU)
01:13:44 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
01:13:44 PM all 0.38 0.01 0.34 0.09 0.00 0.01 0.00 0.00 0.00 99.17
$ mpstat
Linux 4.15.0-117-generic (uu) 09/14/2020 _x86_64_ (1 CPU)
01:14:54 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
01:14:54 PM all 0.42 0.01 0.34 0.09 0.00 0.01 0.00 0.00 0.00 99.14
用 pidstat
可以查看具体哪个进程的 %usr
在变高。
3、上下文切换
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 268 550080 108920 1077896 0 0 1677 26 86 127 1 1 99 0 0
指标含义:
cs
(context switch)是每秒 上下文切换的次数。
r
(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
in
(interrupt)则是每秒 中断的次数,可以从 /proc/interrupts
文件中读取。
pidstat -w -t
指标含义:
cswch
表示每秒自愿上下文切换(voluntary context switches)的次数,比如 I/O、内存 等资源不足时,就会发生自愿上下文切换。
nvcswch
表示每秒非自愿上下文切换(non voluntary context switches)的次数。比如大量进程在争抢 CPU。
sudo apt install -y sysbench
下面用 sysbench
做实验,模拟系统多线程调度,--threads=2
是 2 个线程,--max-time=60
是运行60秒的基准测试:
sysbench --threads=2 --max-time=60 threads run
可以看到 vmstat
的 cs
升高了:
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
12 0 268 470996 110748 1154896 0 0 1669 26 86 128 1 1 99 0 0
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 0 268 469180 110756 1155052 0 0 1669 26 86 196 1 1 99 0 0
再用 pidstat -w -t
可以看到具体是 __sysbench 线程的上下文切换比较多。