跳转至

008.如何使用sar工具?

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 资源监控

  • CPU主要性能衡量指标如下:

  • CPU利用率:衡量CPU资源的利用程度,由CPU user和CPU sys构成。

  • CPU利用率:CPU user+CPU sys

    例如,每 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 
  • CPU queue(运行队列):由于1个cpu在某一时刻只能为一个用户进程提供服务,因此运行队列中的其他进程需要等待之前的进程完成工作之后才能得到服务。

    cpu queue在cpu性能指标中是最重要的指标,队列的长度决定了进程的响应时间。队列太长,意味着响应时间也会更长。

    监控队列,知道cpu的繁忙程度

    sar -q 2 10
    
    [oracle@lsqdb dba]$ sar -q 2 10
    Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/09/2023      _x86_64_        (2 CPU)
    
    11:04:04 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
    11:04:06 AM         1       154      0.08      0.03      0.10
    11:04:08 AM         2       154      0.08      0.03      0.10
    11:04:10 AM         2       154      0.08      0.03      0.10
    11:04:12 AM         2       155      0.08      0.03      0.10
    11:04:14 AM         2       158      0.07      0.03      0.10
    11:04:16 AM         2       158      0.07      0.03      0.10
    11:04:18 AM         3       158      0.14      0.05      0.11
    

    输出项说明如下:

    ·第一字段:时间。
    ·runq-sz:运行队列的长度(等待运行的进程数,每核的CP不能超过3个
    ·plist-sz:进程列表中的进程(processes)和线程数(threads)的数量
    ·ldavg-1:最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值5分钟和15分钟以此类推
    ·ldavg-5:最后5分钟的CPU平均负载
    ·ldavg-15:最后15分钟的CPU平均负载
    
  • 进程fork次数:进程fork极其消耗CPU资源,这部分CPU 资源会反映在CPU sys中。

  • 上下文切换(context switchs)次数:在CPU调度的过程中会不断地涉及上下文切换,尤其是进程在不同CPU之间进行调度的时候,此时会涉及CPU cache进程信息的释放和重载。该指标同样仅仅影响CPU sys部分。

  • 中断(interrupts)次数:每次中断都需要进行相关引擎的转换,都需要CPU内核进行处理。该指标仅仅影响CPU sys部分。

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.网络设备通信失败信息

sar -n EDEV 1 5
[root@lsqdb ~]# sar -n EDEV 1 5
Linux 4.1.12-37.4.1.el6uek.x86_64 (lsqdb)       08/09/2023      _x86_64_        (2 CPU)
11:50:47 AM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s
11:50:48 AM      eth1      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
11:50:48 AM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

输出项说明如下:

·IFACE :网卡名称
·rxerr/s :每秒钟接收到的损坏的数据包
·txerr/s :每秒钟发送的数据包错误数
·coll/s :当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有
·rxdrop/s :当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目
·txdrop/s :当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目
·txcarr/s :当发送数据包的时候,每秒钟载波错误发生的次数
·rxfram/s :在接收数据包的时候,每秒钟发生的帧对其错误的次数
·rxfifo/s :在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数
·txfifo/s :在发生数据包 的时候,每秒钟缓冲区溢出的错误发生的次数

4.内存分页监控

例如,每 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 :每秒钟产生的主缺页数,这会导致将数据从磁盘加载到内存,因此需要留意。

5.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 

6.进程队列长度和平均负载状态监控

例如,每 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 分钟的系统平均负载。

7.系统交换活动信息监控

例如,每 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 :每秒系统换出的交换页面( swap page )数量。

8.设备使用情况监控

例如,每 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% 时,表示设备带宽已经占满。

9.查看历史统计信息

有时我们希望能够看到历史性能统计信息,可以进入目录 /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 条记录。

10.输出 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 等来查看。

常用监控汇总:

(1) sar 1 1           //  CPU和IOWAIT统计状态 
(2) sar -b 1 1        // IO传送速率
(3) sar -B 1 1        // 页交换速率
(4) sar -c 1 1        // 进程创建的速率
(5) sar -d 1 1        // 块设备的活跃信息
(6) sar -n DEV 1 1    // 网路设备的状态信息
(7) sar -n SOCK 1 1   // SOCK的使用情况
(8) sar -n ALL 1 1    // 所有的网络状态信息
(9) sar -P ALL 1 1    // 每颗CPU的使用状态信息和IOWAIT统计状态 
(10) sar -q 1 1        // 队列的长度(等待运行的进程数)和负载的状态
(11) sar -r 1 1       // 内存和swap空间使用情况
(12) sar -R 1 1       // 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)
(13) sar -u 1 1       // CPU的使用情况和IOWAIT信息(同默认监控)
(14) sar -v 1 1       // inode, file and other kernel tablesd的状态信息
(15) sar -w 1 1       // 每秒上下文交换的数目
(16) sar -W 1 1       // SWAP交换的统计信息(监控状态同iostat 的si so)
(17) sar -x 2906 1 1  // 显示指定进程(2906)的统计信息,信息包括:进程造成的错误、用户级和系统级用户CPU的占用情况、运行在哪颗CPU上
(18) sar -y 1 1       // TTY设备的活动状态
(18) 将输出到文件(-o)和读取记录信息(-f)