sar`(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘 I/O、CPU 效率、内存使用状况、进程活动及 IPC 有关的活动等。

我们可以使用sar命令来获得整个系统性能的报告。这有助于我们定位系统性能的瓶颈,并且有助于我们找出这些烦人的性能问题的解决方法。

Linux 内核维护着一些内部计数器,这些计数器包含了所有的请求及其完成时间和 I/O 块数等信息,sar命令从所有的这些信息中计算出请求的利用率和比例,以便找出瓶颈所在。

sar命令主要的用途是生成某段时间内所有活动的报告,因此必需确保sar`命令在适当的时间进行数据采集(而不是在午餐时间或者周末)

命令参数

用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ]

主选项和报告:
    -b  I/O 和传输速率信息状况
    -B  分页状况
    -d  块设备状况
    -I { <中断> | SUM | ALL | XALL }
        中断信息状况
    -m  电源管理信息状况
    -n { <关键词> [,...] | ALL }
        网络统计信息
        关键词可以是:
        DEV  网卡
        EDEV     网卡 (错误)
        NFS  NFS 客户端
        NFSD     NFS 服务器
        SOCK     Sockets (套接字)  (v4)
        IP  IP  流         (v4)
        EIP  IP 流      (v4) (错误)
        ICMP     ICMP 流 (v4)
        EICMP    ICMP 流 (v4) (错误)
        TCP  TCP 流  (v4)
        ETCP     TCP 流  (v4) (错误)
        UDP  UDP 流  (v4)
        SOCK6    Sockets (套接字)  (v6)
        IP6  IP 流      (v6)
        EIP6     IP 流      (v6) (错误)
        ICMP6    ICMP 流 (v6)
        EICMP6 ICMP 流 (v6) (错误)
        UDP6    UDP 流       (v6)
    -q  队列长度和平均负载
    -r  内存利用率
    -R  内存状况
    -S  交换空间利用率
    -u [ ALL ]
        CPU 利用率
    -v  Kernel table 状况
    -w  任务创建与系统转换统计信息
    -W  交换信息
    -y  TTY 设备状况
    -o {<文件路径>}
       将命令结果以二进制格式存放在指定文件中

常用命令

网络统计信息

sar -n <关键词> [ <时间间隔> [ <次数> ] ]

示例:

命令中 1 5 表示每一秒钟取 1 次值,一共取 5 次。

命令执行后会列出每个网卡这 5 次取值的平均数据,根据实际情况来确定带宽跑满的网卡名称,

CPU 利用率

sar -u [ <时间间隔> [ <次数> ] ]

示例:

root@ubuntu:~# sar -u  1 3
Linux 4.15.0-20-generic (ubuntu)    09/18/2019  _x86_64_    (2 CPU)
01:44:59 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
01:45:00 AM     all      0.50      0.00      2.50      0.00      0.00     97.00
01:45:01 AM     all      1.02      0.00      1.53      0.00      0.00     97.45
01:45:02 AM     all      2.01      0.00      3.52     11.56      0.00     82.91
Average:        all      1.18      0.00      2.52      3.87      0.00     92.44
root@ubuntu:~# 

命令中 1 3 表示每一秒钟取 1 次值,一共取 3 次。

输出项说明:

CPU:all 表示统计信息为所有 CPU 的平均值。

%user:显示在用户级别(application)运行使用 CPU 总时间的百分比

%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比
     即:用户进程空间内改变过优先级的进程占用CPU百分比

%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比

%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比

%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比

%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比

    1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈

    2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量

    3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU

索引节点,文件和其他内核表的状态

sar -v [ <时间间隔> [ <次数> ] ]

示例:

root@ubuntu:~# sar -v 1 3
Linux 4.15.0-20-generic (ubuntu)    09/18/2019  _x86_64_    (2 CPU)

01:50:30 AM dentunusd   file-nr  inode-nr    pty-nr
01:50:31 AM     10487      7104     28040         2
01:50:32 AM     10487      7104     28040         2
01:50:33 AM     10487      7104     28040         2
Average:        10487      7104     28040         2
root@ubuntu:~# 

输出项说明:

dentunusd:目录高速缓存中未被使用的条目数量

file-nr:文件句柄(file handle)的使用数量

inode-nr:索引节点句柄(inode handle)的使用数量

pty-nr:使用的 pty 数量

内存利用率

sar -r [ <时间间隔> [ <次数> ] ]

示例:

root@ubuntu:~# sar -r 1 3
Linux 4.15.0-20-generic (ubuntu)    09/18/2019  _x86_64_    (2 CPU)

01:51:59 AM kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
01:52:00 AM   6829576   7191212   1314884     16.14     77508    494124   2902068     16.58    409396    587336       920
01:52:01 AM   6829576   7191212   1314884     16.14     77508    494124   2902068     16.58    409396    587336       920
01:52:02 AM   6829576   7191212   1314884     16.14     77508    494124   2902068     16.58    409396    587336       932
Average:      6829576   7191212   1314884     16.14     77508    494124   2902068     16.58    409396    587336       924
root@ubuntu:~#

输出项说明:

kbmemfree:这个值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空间

kbmemused:这个值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空间

%memused:这个值是 kbmemused 和内存总量(不包括 swap)的一个百分比

kbbuffers 和 kbcached:这两个值就是 free 命令中的 buffer 和 cache

kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM + swap)

%commit:这个值是 kbcommit 与内存总量(包括 swap)的一个百分比

Kbactive:活动内存量(以千字节计算)(最近使用的内存,通常不会被收回,除非绝对必要)

kbinact:不活动内存量(以千字节计算的内存(最近使用的内存),更有资格被用于其他目的)。

kbdirty:以KB为单位的内存量等待写入磁盘

内存分页状况

sar -B [ <时间间隔> [ <次数> ] ]

示例:

root@ubuntu:~# sar -B 1 3
Linux 4.15.0-20-generic (ubuntu)    09/18/2019  _x86_64_    (2 CPU)

01:57:43 AM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
01:57:44 AM      0.00      0.00     18.00      0.00      4.00      0.00      0.00      0.00      0.00
01:57:45 AM      0.00      0.00      2.00      0.00      2.00      0.00      0.00      0.00      0.00
01:57:46 AM      0.00      0.00      0.00      0.00      3.00      0.00      0.00      0.00      0.00
Average:         0.00      0.00      6.67      0.00      3.00      0.00      0.00      0.00      0.00
root@ubuntu:~# 

输出项说明:

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB) 换入

pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB) 换出

fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)

majflt/s:每秒钟产生的主缺页数.

pgfree/s:每秒被放入空闲队列中的页个数

pgscank/s:每秒被kswapd扫描的页个数

pgscand/s:每秒直接被扫描的页个数

pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数

%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

I/O 和传输速率信息状况

sar -b [ <时间间隔> [ <次数> ] ]

示例:

root@ubuntu:~# sar -b 1 3
Linux 4.15.0-20-generic (ubuntu)    09/18/2019  _x86_64_    (2 CPU)

01:59:58 AM       tps      rtps      wtps   bread/s   bwrtn/s
01:59:59 AM      2.00      0.00      2.00      0.00    128.00
02:00:00 AM      0.00      0.00      0.00      0.00      0.00
02:00:01 AM      0.00      0.00      0.00      0.00      0.00
Average:         0.67      0.00      0.67      0.00     42.67
root@ubuntu:~# 

输出项说明:

tps:每秒钟物理设备的 I/O 传输总量

rtps:每秒钟从物理设备读入的数据总量

wtps:每秒钟向物理设备写入的数据总量

bread/s:每秒钟从物理设备读入的数据量,单位为:块/s

bwrtn/s:每秒钟向物理设备写入的数据量,单位为:块/s

队列长度和平均负载

sar -q [ <时间间隔> [ <次数> ] ]

示例:

root@ubuntu:~# sar -q 1 3
Linux 4.15.0-20-generic (ubuntu)    09/18/2019  _x86_64_    (2 CPU)

02:01:22 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
02:01:23 AM         0       430      0.15      0.07      0.18         0
02:01:24 AM         0       430      0.15      0.07      0.18         0
02:01:25 AM         0       431      0.15      0.07      0.18         0
Average:            0       430      0.15      0.07      0.18         0
root@ubuntu:~# 

输出项说明:

runq-sz:运行队列的长度(等待运行的进程数)

plist-sz:进程列表中进程(processes)和线程(threads)的数量

ldavg-1:最后1分钟的系统平均负载(System load average)

ldavg-5:过去5分钟的系统平均负载

ldavg-15:过去15分钟的系统平均负载

blocked:当前阻塞的任务数,等待I / O完成

系统交换信息

sar -q [ <时间间隔> [ <次数> ] ]

示例:

[root@node-1 yum.repos.d]#  sar -W 5 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld)    09/18/2019  _x86_64_    (8 CPU)

05:19:59 PM  pswpin/s pswpout/s
05:20:04 PM      0.00      0.00
05:20:09 PM      0.00     64.00
05:20:14 PM      0.00      0.00
Average:         0.00     21.33
[root@node-1 yum.repos.d]#

输出项说明:

pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量

块设备状况

sar -d [ <时间间隔> [ <次数> ] ]

示例:

[root@node-1 ~]# sar -d 1 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld)    09/18/2019  _x86_64_    (8 CPU)

05:21:21 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:21:22 PM    dev8-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:22 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:22 PM  dev253-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:22 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:22 PM  dev253-2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:21:22 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:21:23 PM    dev8-0      3.00      0.00    192.00     64.00      0.00      0.00      0.00      0.00
05:21:23 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:23 PM  dev253-0     24.00      0.00    192.00      8.00      0.00      0.00      0.00      0.00
05:21:23 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:23 PM  dev253-2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

05:21:23 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
05:21:24 PM    dev8-0      4.00      8.00    160.00     42.00      0.00      0.00      0.00      0.00
05:21:24 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:24 PM  dev253-0     18.00      8.00    160.00      9.33      0.00      0.00      0.00      0.00
05:21:24 PM  dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
05:21:24 PM  dev253-2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:       dev8-0      2.33      2.67    117.33     51.43      0.00      0.00      0.00      0.00
Average:      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-0     14.00      2.67    117.33      8.57      0.00      0.00      0.00      0.00
Average:     dev253-1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:     dev253-2      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
[root@node-1 ~]#

输出项说明:

参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0

tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s:每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱和.

注意:
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当%util的值接近 1% 时,表示设备带宽已经占满。

输出统计的数据信息

示例:

[root@node-1 ~]# sar -o sarfile.log -u 1 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld)    09/18/2019  _x86_64_    (8 CPU)
05:24:18 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
05:24:19 PM     all     16.96      0.00      4.68      0.00      0.00     78.35
05:24:20 PM     all      5.68      0.00      1.26      0.00      0.00     93.06
05:24:21 PM     all      8.06      0.00      3.53      0.00      0.00     88.41
Average:        all     10.23      0.00      3.16      0.00      0.00     86.62
[root@node-1 ~]# 

上述示例命令会将sar -u 1 3采集到的数据以二进制的格式存放到文件sarfile.log中。

我们还可以通过命令sadf -d sarfile.log将二进制数据文件转换成数据库可读的格式。

sadf -d sarfile.log | sed 's/;/,/g' > sarfile.csv

也可以将这些数据存储在一个 csv 文档中,然后绘制成图表展示方式,如下所示:

从数据文件读取信息

sar -f <文件路径>

示例:

又将之前存储在二进制文件中的数据给读取并展示出来。

[root@node-1 ~]# sar -f sarfile.log
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld)    09/18/2019  _x86_64_    (8 CPU)

05:24:18 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
05:24:19 PM     all     16.96      0.00      4.68      0.00      0.00     78.35
05:24:20 PM     all      5.68      0.00      1.26      0.00      0.00     93.06
05:24:21 PM     all      8.06      0.00      3.53      0.00      0.00     88.41
Average:        all     10.23      0.00      3.16      0.00      0.00     86.62
[root@node-1 ~]#

性能问题排查技巧

  • 怀疑 CPU 存在瓶颈,可用sar -usar -q等来查看
  • 怀疑内存存在瓶颈,可用sar -Bsar -rsar -W等来查看
  • 怀疑 I/O 存在瓶颈,可用sar -bsar -usar -d等来查看
02-12 20:11