sar工具的使用

发布时间 2023-08-02 22:52:53作者: 赖顺欠

sar ( system activity reporter ,系统活动情况报告)命令是系统维护的重要工具,主要用于帮助我们掌握系统资源的使用情况,可以从多方面对系统的活动进行报告,报告内容包括:文件的读写情况、系统调用的使用情况、磁盘 I/O 、 CPU 效率、内存使用状况、进程活动及与 IPC 有关的活动等。

sar 通过 cron 定时调用执行以收集和记录信息,默认情况下, Linux 每 10 分钟运行一次 sar 命令来收集信息,如果你认为时间跨度太长,不容易发现性能问题,你也可以更改调度任务的间隔,修改 /etc/cron.d/sysstat 即可。

[root@lsqdb ~]# cat /etc/cron.d/sysstat
# Run system activity accounting tool every 10 minutes
*/10 * * * * root /usr/lib64/sa/sa1 1 1
# 0 * * * * root /usr/lib64/sa/sa1 600 6 &
# Generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A

然后重启 crond 生效。

/etc/init.d/crond restart

sar 命令的常用格式如下。

sar [ options... ] [ <interval> [ <count> ] ]

sar 如果不加参数,则默认是读取历史统计信息,你可以指定 interval 和 count 对当前的系统活动进行统计。其中参数的具体说明如下。

interval 为采样间隔, count 为采样次数,默认值是 1 。

options 为命令行选项, sar 命令常用的选项分别如下:

·-A :所有报告的总和。
·-u :输出 CPU 使用情况的统计信息。
·-v :输出 inode 、文件和其他内核表的统计信息。
·-d :输出每一个块设备的活动信息,一般添加选项 -p 以显示易读的设备名。
·-r :输出内存和交换空间的统计信息。
·-b :显示 I/O 和传送速率的统计信息。
·-c :输出进程的统计信息,每秒创建的进程数。
·-R :输出内存页面的统计信息。
·-y :终端设备的活动情况。
·-w :输出系统交换活动的信息,即每秒上下文切换次数。

常用命令:

sar -B 2 10    --监控内存,知道mem的繁忙程度
sar -b 2 10    --监控I/O,知道I/O的繁忙程度
sar -n DEV 1   --监控网络,知道network的繁忙程度
sar -q 2 10    --监控队列,知道cpu的繁忙程度
sar -d 10 3    --监控磁盘,知道disk的繁忙程度

如下是一些 sar 使用的例子。

(1)CPU 资源监控

例如,每 10s 采样一次,连续采样 3 次,观察 CPU 的使用情况,并将采样结果以二进制的形式存入当前目录下的文件 test 中,需要键入如下命令:

sar -u -o test 10 3
[oracle@lsqdb ~]$ sar -u -o test 10 3
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/02/2023      _x86_64_        (2 CPU)

10:52:11 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
10:52:21 AM     all      0.05      0.00      0.05      0.05      0.00     99.85
10:52:31 AM     all      0.15      0.00      0.05      0.00      0.00     99.80
10:52:41 AM     all      0.10      0.00      0.00      0.00      0.00     99.90
Average:        all      0.10      0.00      0.03      0.02      0.00     99.85

输出项说明如下:

·CPU : all 表示统计信息为所有 CPU 的平均值。我们可以使用 sar-P n 查看某颗 CPU 。
·%user :显示在用户级别运行和使用 CPU 总时间的百分比。
·%nice :显示在用户级别,用于 nice 操作,所占用 CPU 总时间的百分比。
·%system :在核心级别( kernel )运行所占用 CPU 总时间的百分比。
·%iowait :显示用于等待 I/O 操作所占用 CPU 总时间的百分比。
·%idle :显示 CPU 空闲时间所占用 CPU 总时间的百分比。

问题分析:

1 )若 %iowait 的值过高,则表示硬盘存在 I/O 瓶颈。
2 )若 %idle 的值很高但系统响应很慢时,有可能是 CPU 正在等待分配内存,此时应加大内存容量。
3 )若 %idle 的值持续低于 10 ,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。

(2)查看网络的统计

语法是 sar -n KEYWORD 。

KEYWORD 常用的值及说明具体如下。

·DEV :显示网络设备统计,如 eth0 、 eth1 等。
·EDEV :显示为网络设备错误统计。
·NFS :显示 NFS 客户端活动统计。
·ALL :显示所有统计信息。

如下命令可查看网络设备的吞吐,数据每秒更新一次,总共更新 5 次。

sar -n DEV 1 5
[root@lsqdb ~]# sar -n DEV 1 5
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/02/2023      _x86_64_        (2 CPU)
03:27:19 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
03:27:20 PM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:27:20 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
03:27:20 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
03:27:21 PM      eth1      1.04      1.04      0.06      0.43      0.00      0.00      0.00
03:27:21 PM        lo      6.25      6.25      0.35      0.35      0.00      0.00      0.00
Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
Average:         eth1      1.04      1.04      0.06      0.35      0.00      0.00      0.00
Average:           lo      1.24      1.24      0.07      0.07      0.00      0.00      0.00

输出项说明。

· 第一字段:时间。
·IFACE :设备名。
·rxpck/s :每秒收到的包。
·txpck/s :每秒传输的包。
·rxbyt/s :每秒收到的所有包的体积。
·txbyt/s :每秒传输的所有包的体积。
·rxcmp/s :每秒收到的数据切割压缩的包的总数。
·txcmp/s :每秒传输的数据切割压缩的包的总数。
·rxmcst/s :每秒收到的多点传送的包。

可以使用 grep 命令对输出进行过滤,命令如下。

sar -n DEV 2 5|grep eth1

如果想知道网络设备错误报告,也就是用来查看设备故障的。应该用 EDEV 命令;比如下面的例子。

sar -n EDEV 2 5

(3)内存分页监控

例如,每 10s 采样一次,连续采样 3 次,监控内存分页,命令及输出结果如下。

sar -B 10 3
10:45:04 AM pgpgin/s pgpgout/s fault/s  majflt/s
10:45:14 AM 606.19   3648.35   13893.21 0.00
10:45:24 AM 626.17   3726.67   525.97   0.00
10:45:34 AM 557.36   3734.53   1.50     0.00
Average:    596.60   3703.17   4810.10  0.00

输出项说明如下。

·pgpgin/s :表示每秒从磁盘或 SWAP 置换到内存的字节数( KB )。
·pgpgout/s :表示每秒从内存置换到磁盘或 SWAP 的字节数( KB )。
·fault/s :每秒钟系统产生的缺页数,即主缺页与次缺页之和( major+minor )。
·majflt/s :每秒钟产生的主缺页数,这会导致将数据从磁盘加载到内存,因此需要留意。

(4)I/O 和传送速率监控

例如,每 10s 采样一次,连续采样 3 次,需要键入如下命令。

sar -b 10 3
[root@lsqdb ~]# sar -b 1 3
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/02/2023      _x86_64_        (2 CPU)
03:19:46 PM       tps      rtps      wtps   bread/s   bwrtn/s
03:19:47 PM      5.26      0.00      5.26      0.00     50.53
03:19:48 PM      6.25      0.00      6.25      0.00    200.00
03:19:49 PM      0.00      0.00      0.00      0.00      0.00
Average:         3.83      0.00      3.83      0.00     83.62

输出项说明如下。

·tps :每秒钟物理设备的 I/O 传输总量。
·rtps :每秒钟从物理设备读入的数据总量。
·wtps :每秒钟向物理设备写入的数据总量。
·bread/s :每秒钟从物理设备读入的数据量,单位为块 /s 。
·bwrtn/s :每秒钟向物理设备写入的数据量,单位为块 /s 。

(5)进程队列长度和平均负载状态监控

例如,每 10s 采样一次,连续采样 3 次,监控进程队列长度和平均负载状态,命令如下。

sar -q 10 3
[root@lsqdb ~]# sar -q 1 3
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/02/2023      _x86_64_        (2 CPU)
03:21:26 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
03:21:27 PM         0       151      0.02      0.03      0.05
03:21:28 PM         1       151      0.02      0.03      0.05
03:21:29 PM         0       151      0.02      0.03      0.05
Average:            0       151      0.02      0.03      0.05

输出项说明如下。

·runq-sz :运行队列的长度(等待运行的进程数)。
·plist-sz :进程列表中进程( processes )和线程( threads )的数量。
·ldavg-1 :最后 1 分钟的系统平均负载( system load average )。
·ldavg-5 :过去 5 分钟的系统平均负载。
·ldavg-15 :过去 15 分钟的系统平均负载。

(6)系统交换活动信息监控

例如,每 10s 采样一次,连续采样 3 次,监控系统交换活动信息,命令如下。

sar -W 10 3
[root@lsqdb ~]# sar -W 1 3
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/02/2023      _x86_64_        (2 CPU)
03:25:54 PM  pswpin/s pswpout/s
03:25:55 PM      0.00      0.00
03:25:56 PM      0.00      0.00
03:25:57 PM      0.00      0.00
Average:         0.00      0.00

输出项说明如下。

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

(7)设备使用情况监控

例如,每 10s 采样一次,连续采样 3 次,报告设备使用情况,需要键入如下命令。

sar -d 10 3 -p

其中,参数 -p 可以打印出 sda 、 hdc 等易读的磁盘设备名称,如果不使用参数 -p ,设备节点则有可能是 dev8-0 、 dev22-0 这样的形式。

[root@lsqdb ~]# sar -d 1 3 -p
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/02/2023      _x86_64_        (2 CPU)
03:29:38 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
03:29:39 PM       sda      3.03      0.00     96.97     32.00      0.00      0.33      0.33      0.10
03:29:39 PM      dm-0      3.03      0.00     96.97     32.00      0.00      0.33      0.33      0.10
Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:          sda      1.68      0.00     40.27     24.00      0.00      0.20      0.20      0.03
Average:         dm-0      2.01      0.00     40.27     20.00      0.00      0.17      0.17      0.03

输出项说明如下。

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

问题分析

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

(8)查看历史统计信息

有时我们希望能够看到历史性能统计信息,可以进入目录 /var/log/sa ,使用 sar–f saXX 命令查看历史数据,例如,

sar -f sa22

默认将显示整天的数据。我们可以加上 -s 选项指定特定时间段的数据,例如,

sar -q -f sa13 -s 14:00:00 | head -n 10

以上命令将只显示 13 日 14 点之后的 load 的统计数据,且只显示最前面的 10 条记录。

(9)输出 inode 、文件和其他内核表的统计信息

sar -v 10 3

输出项说明如下。

·dentunusd :目录高速缓存中未被使用的条目数量。
·file-nr :文件句柄( file handle )的使用数量。
·inode-nr :索引节点句柄( inode handle )的使用数量。

要想判断系统的瓶颈问题,有时需要将几个 sar 命令选项结合起来。

· 怀疑 CPU 存在瓶颈,可用 sar-u 和 sar-q 等来查看。
· 怀疑内存存在瓶颈,可用 sar-B 、 sar-r 和 sar-W 等来查看。
· 怀疑 I/O 存在瓶颈,可用 sar-b 、 sar-u 和 sar-d 等来查看。