1、简介

在使用 Linux 系统时,常常会遇到各种各样的问题,比如系统容易死机或者运行速度突然变慢,这时我们常常猜测:是否硬盘空间不足,是否内存不足,是否 I/O 出现瓶颈,还是系统的核心参数出了问题?这时,我们应该考虑使用 sar 工具对系统做一个全面了解,分析系统的负载状况。

sar(System Activity Reporter)是系统活动情况报告的缩写。sar 工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。 sar 是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。为了提供不同的信息,sar 提供了丰富的选项、因此使用较为复杂。

2、安装

 [root@RedHat_test ~]# yum install sysstat

下面的命令启动服务

 [root@RedHat_test ~]# service sysstat start

3、sar命令常用格式

 [root@RedHat_test ~]# sar [options] [-A] [-o file] t [n]
 t : 采样间隔
 n : 采样次数,默认值是1
 -ofile : 将命令结果以二进制格式存放在文件中,file是文件名
 options : 命令行选项,sar命令常用选项如下:
 -A: 所有报告的总和
 -u: 输出CPU使用情况的统计信息
 -v: 输出inode、文件和其他内核表的统计信息
 -d: 输出每一个块设备的活动信息
 -r: 输出内存和交换空间的统计信息
 -b: 显示I/O的传送速率和统计信息
 -a: 文件读写情况
 -c: 输出进程统计信息,美妙创建的进程数
 -R: 输出内存页面的统计信息
 -y: 终端设备活动情况
 -w: 输出系统交换活动信息


4、CPU资源监控

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

 [root@RedHat_test ~]# sar -u -o test 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 16时04分12秒     CPU     %user     %nice   %system   %iowait   %steal     %idle
 16时04分22秒     all      0.00      0.00      0.03      0.00      0.00     99.97
 16时04分32秒     all      0.03      0.00      0.00      0.00      0.00     99.97
 16时04分42秒     all      0.00      0.00      0.03      0.00      0.00     99.97
 平均时间:     all      0.01      0.00      0.02      0.00      0.00     99.97
 ----------------------------------------------------------------------------------------
 CPU : all 表示统计信息为所有CPU的平均值
 %user : 显示用户级别(application)运行使用CPU总时间的百分比
 %nice : 显示用户级别,用于nice操作,所占用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
 ----------------------------------------------------------------------------------------
 如果要查看二进制文件test中的内容,需键入如下sar命令:
 [root@RedHat_test ~]# sar -u -f test 
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 
 16时04分12秒     CPU     %user     %nice   %system   %iowait   %steal     %idle
 16时04分22秒     all      0.00      0.00      0.03      0.00      0.00     99.97
 16时04分32秒     all      0.03      0.00      0.00      0.00      0.00     99.97
 16时04分42秒     all      0.00      0.00      0.03      0.00      0.00     99.97
 平均时间:     all      0.01      0.00      0.02      0.00      0.00     99.97

5、inode、文件和其他内核表监控

例如:每10秒采样一次,连续采样3次,观察核心表的状态

 [root@RedHat_test ~]# sar -v 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 16时28分07秒 dentunusd   file-nr inode-nr   pty-nr
 16时28分17秒     18074      896    21105        1
 16时28分27秒     18074      896    21105        1
 16时28分37秒     18074      896    21105        1
 平均时间:     18074      896    21105        1
 ----------------------------------------------------------------------------------------
 dentunusd : 目录高速缓存中未被使用的条目数量
 file-nr : 文件句柄(file handle)的使用数量
 inode-nr : 索引节点句柄(inode handle)的使用数量
 pty-nr : 使用的pty数量

6、内存和交换空间监控

例如:每10秒采样一次,连续采样3次,监控内存和交换分区

 [root@RedHat_test ~]# sar -r 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 16时34分25秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit   %commit kbactive   kbinact   kbdirty
 16时34分35秒  15902672   363840     2.24      2108   137640   245052     1.33     95560    87300        0
 16时34分45秒  15902672   363840     2.24      2108   137640   245052     1.33     95560    87300        0
 16时34分55秒  15902672   363840     2.24      2108   137640   245052     1.33     95560    87300        0
 平均时间:  15902672   363840     2.24      2108   137640   245052     1.33     95560    87300        0
 ----------------------------------------------------------------------------------------
 kbmemfree : 这个值和free命中的free值基本一致。所以它不包括buffer和cache的空间
 kbmemused : 这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间
 memused : 这个值是kbmemused和内存总量(不包括swqp)的一个百分比
 kbbuffers 和 kbcached : 这两个值就是free命中的buffer和cache
 kbcommit : 保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)
 %commit : 这个值是kbcommit与内存总量(包括swap)的一个百分比

7、内存分页监控

例如:每10秒采样一次,连续采样3次,监控内存分页

 [root@RedHat_test ~]# sar -B 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 
 16时44分18秒 pgpgin/s pgpgout/s   fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s   %vmeff
 16时44分28秒      0.00      0.00      3.80      0.00      8.80      0.00      0.00      0.00      0.00
 16时44分38秒      0.00      0.00      3.70      0.00      8.50      0.00      0.00      0.00      0.00
 16时44分48秒      0.00      0.00      2.90      0.00      8.50      0.00      0.00      0.00      0.00
 平均时间:      0.00      0.00      3.47      0.00      8.60      0.00      0.00      0.00      0.00
 ----------------------------------------------------------------------------------------
 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)的百分比

8、I/O和传送速率监控

例如:每10秒采样一次,连续采样3次,报告缓冲区的使用情况

 [root@RedHat_test ~]# sar -b 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 17时03分12秒       tps     rtps     wtps   bread/s   bwrtn/s
 17时03分22秒      0.30      0.00      0.30      0.00      3.20
 17时03分32秒      0.60      0.00      0.60      0.00      4.80
 17时03分42秒      0.00      0.00      0.00      0.00      0.00
 平均时间:      0.30      0.00      0.30      0.00      2.67
 ----------------------------------------------------------------------------------------
 tps : 每秒钟物理设备I/O传输总量
 rtps : 每秒钟从物理设备读入的数据总量
 wtps : 每秒钟向物理设备写入的数据总量
 bread/s : 每秒钟从物理设备读入的数据量,单位为 块/s
 bwrtn/s : 每秒钟从物理设备写入的数据量,单位为 块/s

9、进程队列长度和平均负载状态监控

例如:每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态

 [root@RedHat_test ~]# sar -q 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 17时09分34秒   runq-sz plist-sz   ldavg-1   ldavg-5 ldavg-15   blocked
 17时09分44秒         1      124     0.00      0.01      0.05         0
 17时09分54秒         0      124     0.00      0.01      0.05         0
 17时10分04秒         1      127     0.00      0.01      0.05         0
 平均时间:         1      125     0.00      0.01      0.05         0
 ------------------------------------------------------------------------------------------
 runq-sz : 运行队列的长度(等待运行的进程数)
 plist-sz : 进程列表中进程(processes)和线程(threads)的数量
 ldavg-1 : 最后1分钟的系统平均负载(System load average)
 ldavg-5 : 过去5分钟的系统平均负载
 ldavg-15 : 过去15分钟的系统平均负载

10、系统交换活动信息监控

例如:每10秒采样一次,连续采样3次,监控系统交换活动信息

 [root@RedHat_test ~]# sar -W 10 3
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 17时17分05秒 pswpin/s pswpout/s
 17时17分15秒      0.00      0.00
 17时17分25秒      0.00      0.00
 17时17分35秒      0.00      0.00
 平均时间:      0.00      0.00
 ----------------------------------------------------------------------------------------
 pswpin/s : 每秒系统换入的交换页面(swap page)数量
 pswpout/s : 每秒系统换出的交换页面(swap page)数量

11、设备使用情况监控

例如:每10秒采样一次,连续采样3次,报告设备使用情况

 [root@RedHat_test ~]# sar -d 10 3 -p
 Linux 3.10.0-957.el7.x86_64 (RedHat_test) 2020年01月17日 _x86_64_(4 CPU)
 
 17时41分31秒       DEV       tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz     await     svctm     %util
 17时41分41秒       vda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 17时41分41秒 centos-root      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 17时41分41秒 centos-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 
 17时41分41秒       DEV       tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz     await     svctm     %util
 17时41分51秒       vda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 17时41分51秒 centos-root      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 17时41分51秒 centos-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 
 17时41分51秒       DEV       tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz     await     svctm     %util
 17时42分01秒       vda      0.30      0.00      0.30      1.00      0.03    112.00    103.67      3.11
 17时42分01秒 centos-root      0.20      0.00      0.30      1.50      0.03    168.00    168.00      3.36
 17时42分01秒 centos-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 
 平均时间:       DEV       tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz     await     svctm     %util
 平均时间:       vda      0.10      0.00      0.10      1.00      0.01    112.00    103.67      1.04
 平均时间: centos-root      0.07      0.00      0.10      1.50      0.01    168.00    168.00      1.12
 平均时间: centos-swap      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 -----------------------------------------------------------------------------------------
 -p: 可以打印出vda、centos-root、centos-swap等磁盘设备名称,如果不用参数-p,设备节点则有可能是别的
 tps : 每秒从物理磁盘I/O的次数,多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的。
 rd_sec/s : 每秒读扇区的次数
 wr_sec/s : 每秒写扇区的次数
 avgrp-sz : 平均每次设备I/O操作的数据大小(扇区)
 avgqu-sz : 磁盘请求队列的平均长度
 await : 从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒)
 svctm : 系统处理每次请求的平均时间,不包括在请求队列中消耗的时间