sar
2022-08-27 11:50:34 阿炯

sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写(I/O)、系统调用的使用情况、磁盘I/O、分区(交换区)、内存使用状况、CPU效率(中断)和网络使用情况、进程相关活动及IPC有关的活动的统计数据。众多linux分析工具中,sar是一个非常全面的一个分析工具,是Sysstat工具包中的瑞士军刀,对文件的读写、系统调用情况、磁盘IO、CPU使用情况、内存使用情况、进程活动等都可以进行有效的分析。它将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,使用它时消耗的系统资源也很小。

1、sar命令常用格式

sar [options] [-A] [-o file] t [n]

其中t为采样间隔是必须有的参数,n为采样次数,是可选的,默认值是1;
-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。
options 为命令行选项,sar命令常用选项如下:
sar [ 选项 ] [ <时间间隔> [ <次数> ] ]

Options are:
[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -j { ID | LABEL | PATH | UUID | ... } ] [ -n { <keyword> [,...] | ALL } ]
[ -o [ <filename> ] | -f [ <filename> ] ] [ --legacy ]
[ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]

sar [options] [-A] [-o file] [ <interval> [ <count> ] ]
interval:表示采样间隔时间,该参数必须手动设置;
count:表示采样次数,是可选参数,其默认值为 1;
options:为命令行选项,由于 sar 命令提供的选项很多,这里不再一一介绍,仅列举出常用的一些选项及对应的功能,如下所示。

其中:t为采样间隔,n为采样次数,默认值是1;-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。options 为命令行选项,sar命令常用选项如下:
-A:显示系统所有资源设备(CPU、内存、磁盘)的运行状况。
-P:显示当前系统中指定 CPU 的使用情况。
-p:报告每个CPU的状态情况。
-u:显示系统所有 CPU 在采样时间内的负载状态。
-v:输出inode、文件和其他内核表的统计信息。
-d:显示系统所有硬盘设备在采样时间内的使用状态。
-n:显示网络情况,此选项后可跟 DEV(显示网络接口信息)、EDEV(显示网络错误的统计数据)、SOCK(显示套接字信息)和 FULL(等同于使用 DEV、EDEV和SOCK)等。
-q:显示运行列表中的进程数、进程大小、系统平均负载等。
-r:显示系统内存和交换空间在采样时间内的使用情况。
-b:显示I/O和传送速率的统计信息,缓冲区在采样时间内的使用情况。
-a:文件读写情况。
-c:输出进程统计信息,每秒创建的进程数。
-R:输出内存页面的统计信息,进程在采样时的活动情况。
-y:终端设备活动情况。
-W:输出系统交换活动信息。
-i:设状态信息刷新的间隔时间。
-e:设置显示报告的结束时间。
-f:从指定文件提取报告。

sar --help
用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ]
主要选项和报告(报告名以方括号分隔):
	-B	分页状况 [A_PAGE]
	-b	I/O 和传输速率信息状况 [A_IO]
	-d	块设备状况 [A_DISK]
	-F [ MOUNT ]
		文件系统统计信息 [A_FS]
	-H	巨大页面利用率 [A_HUGE]
	-I { <中断列表> | SUM | ALL }
		中断信息状况 [A_IRQ]
	-m { <关键字> [,...] | ALL }
		电源管理统计信息 [A_PWR_...]
		关键字:
		CPU	CPU 瞬时时钟频率
		FAN	风扇速度
\t\tFREQ\tCPU 平均时钟频率
		IN	输入电压
		TEMP	设备温度
\t\tUSB\t连接的 USB 设备
	-n { <关键字> [,...] | ALL }
		网络统计信息 [A_NET_...]
		关键字:
		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)
		FC	Fibre channel HBAs
		SOFT	基于软件的网络处理

	-q	队列长度和平均负载统计信息 [A_QUEUE]
	-r [ ALL ]
		内存利用率信息 [A_MEMORY]
	-S	交换空间利用率信息 [A_MEMORY]
	-u [ ALL ]
		CPU 利用率信息 [A_CPU]
	-v	内核表统计信息 [A_KTABLES]
	-W	交换信息 [A_SWAP]
	-w	任务创建与系统切换信息 [A_PCSW]
	-y	TTY 设备信息 [A_SERIAL]


2. CPU资源监控

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

屏幕显示如下:
17:06:16 CPU %user %nice %system %iowait %steal %idle
17:06:26 all 0.00 0.00 0.20 0.00 0.00 99.80
17:06:36 all 0.00 0.00 0.20 0.00 0.00 99.80
17:06:46 all 0.00 0.00 0.10 0.00 0.00 99.90
Average: all 0.00 0.00 0.17 0.00 0.00 99.83

输出项说明:
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 。

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

如果要查看二进制文件sys_info中的内容,需键入如下sar命令:
sar -u -f  sys_info

由于sys_info是二进制文件中的内容, 当你用cat看sys_info时发现全都是二进制码,sar为你准备了-f filename选项,只要用-f设定要读取的信息存储文件,就可以清晰地读出信息了:sar -f sys_info。

如果我的CPU是多核处理器,那么sar能知道某一个核的运行信息么?

完全没问题的。有一个选项-P,就是用来为多核处理器而设计的。当在使用sar命令而没有设定-P选项时,sar会根据所有核给出一个宏观汇报,也就是平均的值。如果使用了-P选项来指定某一个核,那么就会针对这个单独的核给出具体性能信息。当使用-P ALL时,sar就会根据每一个核都给出其具体性能信息,然后再给出一个总的性能信息。

比如这里有一个至强处理器的CPU,是双核CPU,看看-P的使用方法吧:
sar -P ALL 1 1
10:59:38 PM       CPU     %user     %nice   %system   %iowait     %idle
10:59:39 PM       all      2.12      0.00      2.87      0.00     95.01
10:59:39 PM         0      0.00      0.00      1.98      0.00     98.02
10:59:39 PM         1      9.00      0.00      7.00      0.00     84.00

sar会根据处理器的每一个核给出性能信息。当我们想查看第6个核的信息时,其输出如下:
sar -P 0 1 1
11时36分12秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
11时36分13秒       0      5.21      0.00      3.12      0.00      0.00     91.67
平均时间:       0      5.21      0.00      3.12      0.00      0.00     91.67

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


每5秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:
sar -v 5 3

屏幕显示如下:
11时36分47秒 dentunusd   file-nr  inode-nr    pty-nr
11时36分52秒     11198      1472     25944         6
11时36分57秒     11198      1472     25944         6
11时37分02秒     11216      1472     25969         6
平均时间:     11204      1472     25952         6

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

4. 内存和交换空间监控

每10秒采样一次,连续采样3次,监控内存分页:
sar -r 10 3

屏幕显示如下:
10:02:52 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
10:03:02 PM   2289016   1632096     41.62    204860   1218352    333068      8.49
10:03:12 PM   2288388   1632724     41.64    204860   1218352    333068      8.49
10:03:22 PM   2288544   1632568     41.64    204860   1218352    333068      8.49
Average:        2288649   1632463     41.63    204860   1218352    333068      8.49

输出项说明:
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间。
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间。
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比。
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache。
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap)。
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比。

5. 内存分页监控

每5秒采样一次,连续采样3次,监控内存分页:
sar -B 5 3

屏幕显示如下:
11时34分58秒  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
11时35分03秒      0.00      0.00   1104.60      0.00    174.00      0.00      0.00      0.00      0.00
11时35分08秒      0.00   1777.60    475.40      0.00   1193.40      0.00      0.00      0.00      0.00
11时35分13秒      0.00      4.80      0.00      0.00     94.80      0.00      0.00      0.00      0.00
平均时间:      0.00    594.13    526.67      0.00    487.40      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)的百分比。

6. I/O和传送速率监控

每5秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:
sar -b 5 3

屏幕显示如下:
11时39分00秒       tps      rtps      wtps   bread/s   bwrtn/s
11时39分05秒      2.40      1.60      0.80    409.60    595.20
11时39分10秒      0.80      0.80      0.00    204.80      0.00
11时39分15秒      1.60      1.60      0.00    409.60      0.00
平均时间:      1.60      1.33      0.27    341.33    198.40

输出项说明:
tps:每秒钟物理设备的 I/O 传输(transfer)总量,等于iostat中的tps;一个transfer就是一个I/O,多个逻辑请求组合成一个对磁盘的I/O请求,一个transfer的大小不确定。
rtps:每秒钟从物理设备读入的数据总量。
wtps:每秒钟向物理设备写入的数据总量。
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s。
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s。

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

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

屏幕显示如下:
19:25:50 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
19:26:00 0 259 0.00 0.00 0.00
19:26:10 0 259 0.00 0.00 0.00
19:26:20 0 259 0.00 0.00 0.00
Average: 0 259 0.00 0.00 0.00

输出项说明:
runq-sz:运行队列的长度(等待运行的进程数,每核的CP不能超过3个)。
plist-sz:进程列表中进程(processes)和线程(threads)的数量。
ldavg-1:最后1分钟的系统平均负载(System load average)。
ldavg-5:过去5分钟的系统平均负载。
ldavg-15:过去15分钟的系统平均负载。

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

每10秒采样一次,连续采样3次,监控系统交换(Swap)活动信息:
sar -W 10 3

屏幕显示如下:
19:39:50 pswpin/s pswpout/s
19:40:00 0.00 0.00
19:40:10 0.00 0.00
19:40:20 0.00 0.00
Average: 0.00 0.00

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

9. 设备使用情况监控

每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:
# sar -d 10 3 –p

屏幕显示如下:
17:45:54    DEV    tps    rd_sec/s    wr_sec/s    avgrq-sz    avgqu-sz    await    svctm    %util
17:46:04    scd0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17:46:04    sda    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17:46:04    vg_livedvd-lv_root    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
17:46:04    vg_livedvd-lv_swap    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00

其中:
参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0、dev22-0。
tps:每秒从物理磁盘I/O的次数。多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的。
rd_sec/s:每秒读扇区的次数,每个扇区512 bytes。
wr_sec/s:每秒写扇区的次数,每个扇区512 bytes。
avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。
avgqu-sz:磁盘请求队列的平均长度。
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒)。
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间。
%util:I/O请求占CPU的百分比,比率越大,说明越饱和。

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

10、sar分析网卡流量

sar -n { DEV | EDEV | NFS | NFSD | SOCK | ALL }

sar 提供六种不同的语法选项来显示网络信息。-n选项使用6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套接字信息,ALL显示所有5个开关。它们可以单独或者一起使用。

如果你使用DEV关键字,那么sar将汇报和网络设备相关的信息,如lo,eth0或eth1等,例如
#sar -n DEV 2 10
01:39:40 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
01:39:42 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:39:42 AM eth1 131.34 104.98 119704.48 36110.45 0.00 0.00 0.00
01:39:42 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:39:42 AM IFACE rxpck/s txpck/s rxbyt/s txbyt/s rxcmp/s txcmp/s rxmcst/s
01:39:44 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:39:44 AM eth1 168.00 165.50 114496.50 83938.50 0.00 0.00 0.00
01:39:44 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00

IFACE:LAN接口,网络设备的名称
rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数
rxcmp/s:每秒钟接收的压缩数据包
txcmp/s:每秒钟发送的压缩数据包
rxmcst/s:每秒钟接收的多播数据包

使用EDEV关键字,那么会针对网络设备汇报其失败情况,例如:
#sar -n EDEV 2 10
01:42:18 AM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
01:42:20 AM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:42:20 AM eth1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
01:42:20 AM sit0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

IFACE:LAN接口  网络设备的名称
rxerr/s:每秒钟接收的坏数据包
txerr/s:每秒钟发送的坏数据包
coll/s:每秒冲突数
rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数
txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数
txcarr/s:发送数据包时,每秒载波错误数
rxfram/s:每秒接收数据包的帧对齐错误数
rxfifo/s:接收的数据包每秒FIFO过速的错误数
txfifo/s:发送的数据包每秒FIFO过速的错误数

使用SOCK关键字,则会针对socket连接进行汇报:
#sar -n SOCK 2 10
01:44:32 AM totsck tcpsck udpsck rawsck ip-frag
01:44:34 AM 243 9 8 0 0
01:44:36 AM 242 9 7 0 0
01:44:38 AM 238 9 7 0 0
01:44:40 AM 238 9 7 0 0

如果你使用FULL关键字,相当于上述DEV、EDEV和SOCK三者的综合。

sar -n SOCK 1 1 #统计socket连接信息
totsck 当前被使用的socket总数
tcpsck 当前正在被使用的TCP的socket总数
udpsck 当前正在被使用的UDP的socket总数
rawsck 当前正在被使用于RAW的skcket总数
if-frag 当前的IP分片的数目
tcp-tw TCP套接字中处于TIME-WAIT状态的连接数量

sar -n TCP 1 3 #TCP连接的统计
active/s 新的主动连接
passive/s 新的被动连接
iseg/s 接受的段
oseg/s 输出的段

sar -n 使用小结
-n DEV:网络接口统计信息。
-n EDEV:网络接口错误。
-n IP:IP数据报统计信息。
-n EIP:IP错误统计信息。
-n TCP:TCP统计信息。
-n ETCP:TCP错误统计信息。
-n SOCK:套接字使用。


11、要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来综合考虑

怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看。

怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看。

怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看。

常用命令一览

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

12、利用sar来做个后台监控程序,可以实时汇报机器性能情况

借助linux的后台符就可以了,别忘了把标准输出重定向的:
sar -o monitor.res interval count >/dev/null 2>&1 &

记得把interval和count都替换为你想要的间隔和次数。这样所有的性能信息就全都存入二进制格式的数据文件monitor.res里了。当读取时使用-f就可以了。