pidstat

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

可以看到 vmstatcs 升高了:

$ 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 线程的上下文切换比较多。

你可能感兴趣的:(pidstat)