文章目录
一、简介
sar
是系统活动报告(System Activity Report)英文单词的首字母缩写。就像它的名字一样,sar是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。
二、命令详解
sar
命令常用格式如下:
sar [options] [-A] [-o file] t [n]
其中t
采样间隔,n
为采样次数,默认值是 1 ;-o file
表示将命令结果以二进制格式存放在文件中,file是文件名;options
为命令行选项,sar
常用的选项有以下:
-A
:所有报告的总和-u
:输出CPU使用情况的统计信息-v
:输出inode、文件和其他内核表的统计信息-d
:输出每一个块设备的活动信息-r
:输出内存和交换空间的统计信息-b
:显示I/O和传送速率的统计信息-a
:文件读写情况-c
:输出进程统计信息,每秒创建的进程数-R
:输出内存页面的统计信息-y
:终端设备活动情况-w
:输出系统交换活动信息
在继续讲解之前,我们再来简单说一下sysstat
包。
三、sysstat包
sar
、sa1
和sa2
命令都是sysstat
包的一部分。它是Linux包含的性能监视工具集合。
sar
:显示数据sa1
和sa2
:收集和保存数据用于以后分析。sa2
shell脚本在/var/log/sa
目录中每日写入一个报告。sa1
shell脚本将每日的系统活动信息以二进制数据的形式写入到文件中。
我们可以在/etc/cron.d/
下sysstat
文件中找到sar
默认的cron作业,如下:
# 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
这样我们就可以按照我们的需求,进行输出定制化了。
sar
不止上面说的几个程序:
sar
:收集、报告或存储信息(CPU、内存、磁盘、中断、网卡、TTY、内核表等等);sadc
:系统数据收集器,给sar
做后台服务;sa1
:收记并存储二进制数据到每天的文件;这是设计来给cron执行一个sadc
的前台程序;sa2
:生成总结报表;sadf
:以多种格式显示数据(CSV, XML, JSON, etc.),还可以用来生成SVG(Scalable Vector Graphics)图表。
四、使用实例
4.1、CPU资源监控
若每10秒采样一次,连续采样3次,观察CPU 的使用情况,并将采样结果以二进制形式存入当前目录下的文件 test 中,需键入如下命令:
[root@localhost ~]# sar -u -o test 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:45:11 PM CPU %user %nice %system %iowait %steal %idle
04:45:21 PM all 0.00 0.00 0.10 0.00 0.00 99.90
04:45:31 PM all 0.00 0.00 0.10 0.00 0.00 99.90
04:45:41 PM all 0.00 0.00 0.10 0.00 0.00 99.90
Average: all 0.00 0.00 0.10 0.00 0.00 99.90
输出项说明:
CPU
:all 表示统计信息为所有 CPU 的平均值。
%user
:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice
:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system
:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait
:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal
:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle
:显示 CPU 空闲时间占用 CPU 总时间的百分比。
-
若
%iowait
的值过高,表示硬盘存在I/O瓶颈 -
若
%idle
的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量 -
若
%idle
的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
如果要查看二进制文件test中的内容,需键入如下sar命令:
[root@localhost ~]# sar -u -f test
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 2021年01月05日 _x86_64_ (1 CPU)
16时44分10秒 CPU %user %nice %system %iowait %steal %idle
16时44分20秒 all 0.10 0.00 0.10 0.00 0.00 99.80
16时44分30秒 all 0.00 0.00 0.00 0.00 0.00 100.00
16时44分40秒 all 0.00 0.00 0.10 0.00 0.00 99.90
16时45分11秒 all 0.00 0.00 0.16 0.16 0.00 99.68
16时45分21秒 all 0.00 0.00 0.10 0.00 0.00 99.90
16时45分31秒 all 0.00 0.00 0.10 0.00 0.00 99.90
16时45分41秒 all 0.00 0.00 0.10 0.00 0.00 99.90
平均时间: all 0.01 0.00 0.11 0.06 0.00 99.82
4.2、inode、文件和其他内核表监控
若每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:
[root@localhost ~]# sar -v 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:51:48 PM dentunusd file-nr inode-nr pty-nr
04:51:58 PM 36298 1088 47616 1
04:52:08 PM 36298 1088 47616 1
04:52:18 PM 36298 1088 47616 1
Average: 36298 1088 47616 1
输出项说明:
dentunusd
:目录高速缓存中未被使用的条目数量
file-nr
:文件句柄(file handle)的使用数量
inode-nr
:索引节点句柄(inode handle)的使用数量
pty-nr
:使用的pty数量
4.3、内存和交换空间swap监控
若每10秒采样一次,连续采样3次,监控内存分页:
[root@localhost ~]# sar -v 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:51:48 PM dentunusd file-nr inode-nr pty-nr
04:51:58 PM 36298 1088 47616 1
04:52:08 PM 36298 1088 47616 1
04:52:18 PM 36298 1088 47616 1
Average: 36298 1088 47616 1
输出项说明:
kbmemfree
:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused
:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused
:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers
和kbcached
:这两个值就是free命令中的buffer和cache.
kbcommit
:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit
:这个值是kbcommit与内存总量(包括swap)的一个百分比.
4.4、内存分页监控
若每10秒采样一次,连续采样3次,监控内存分页:
[root@localhost ~]# sar -B 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:54:59 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
04:55:09 PM 0.00 0.00 7.30 0.00 8.70 0.00 0.00 0.00 0.00
04:55:19 PM 0.00 0.20 4.71 0.00 11.63 0.00 0.00 0.00 0.00
04:55:29 PM 0.00 0.00 2.20 0.00 8.70 0.00 0.00 0.00 0.00
Average: 0.00 0.07 4.74 0.00 9.68 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)的百分比
4.5、I/O和传送速率监控
若每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:
[root@localhost ~]# sar -b 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:56:40 PM tps rtps wtps bread/s bwrtn/s
04:56:50 PM 0.20 0.00 0.20 0.00 0.30
04:57:00 PM 0.00 0.00 0.00 0.00 0.00
04:57:10 PM 0.00 0.00 0.00 0.00 0.00
Average: 0.07 0.00 0.07 0.00 0.10
输出项说明:
tps
:每秒钟物理设备的 I/O 传输总量
rtps
:每秒钟从物理设备读入的数据总量
wtps
:每秒钟向物理设备写入的数据总量
bread/s
:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s
:每秒钟向物理设备写入的数据量,单位为 块/s
4.6、进程队列长度和平均负载状态监控
若每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:
[root@localhost ~]# sar -q 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:57:40 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
04:57:50 PM 1 115 0.00 0.01 0.05 0
04:58:00 PM 1 115 0.00 0.01 0.05 0
04:58:10 PM 1 115 0.00 0.01 0.05 0
Average: 1 115 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分钟的系统平均负载
4.7、系统交换活动信息监控
若每10秒采样一次,连续采样3次,监控系统交换活动信息:
[root@localhost ~]# sar -W 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
04:59:24 PM pswpin/s pswpout/s
04:59:34 PM 0.00 0.00
04:59:44 PM 0.00 0.00
04:59:54 PM 0.00 0.00
Average: 0.00 0.00
输出项说明:
pswpin/s
:每秒系统换入的交换页面(swap page)数量
pswpout/s
:每秒系统换出的交换页面(swap page)数量
4.8、设备使用情况监控
若每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:
[root@localhost ~]# sar -d -p 10 3
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
05:03:53 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:04:03 PM sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:03 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:03 PM centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:03 PM centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:03 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:04:13 PM sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:13 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:13 PM centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:13 PM centos-swap 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:13 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:04:23 PM sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:23 PM sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:23 PM centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:04:23 PM centos-swap 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: sr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: centos-root 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: centos-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
:每秒读扇区的次数.
wr_sec/s
:每秒写扇区的次数.
avgrq-sz
:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz
:磁盘请求队列的平均长度.
await
:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm
:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util
:I/O请求占CPU的百分比,比率越大,说明越饱和.
-
avgqu-sz
的值较低时,设备的利用率较高。 -
当
%util
的值接近 1% 时,表示设备带宽已经占满。
4.9、网卡流量信息
若每1秒采样一次,连续采样4次,监控网卡流量信息:
[root@localhost ~]# sar -n DEV 1 4
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
05:26:21 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
05:26:22 PM ens32 0.99 0.99 0.06 0.22 0.00 0.00 0.00
05:26:22 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:26:22 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
05:26:23 PM ens32 1.00 1.00 0.06 0.41 0.00 0.00 0.00
05:26:23 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:26:23 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
05:26:24 PM ens32 1.00 1.00 0.06 0.41 0.00 0.00 0.00
05:26:24 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:26:24 PM IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
05:26:25 PM ens32 1.00 1.00 0.06 0.41 0.00 0.00 0.00
05:26:25 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
Average: ens32 1.00 1.00 0.06 0.36 0.00 0.00 0.00
Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00
-n
参数是查看网卡信息,包括流量等
-n
参数很有用,他有6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL 。DEV显示网络接口信息,EDEV显示关于网络错误的统计数据,NFS统计活动的NFS客户端的信息,NFSD统计NFS服务器的信息,SOCK显示套 接字信息,ALL显示所有5个开关。它们可以单独或者一起使用。我们现在用的就是-n DEV了。
IFACE
:LAN接口
rxpck/s
:每秒钟接收的数据包
txpck/s
:每秒钟发送的数据包
rxbyt/s
:每秒钟接收的字节数
txbyt/s
:每秒钟发送的字节数
rxcmp/s
:每秒钟接收的压缩数据包
txcmp/s
:每秒钟发送的压缩数据包
rxmcst/s
:每秒钟接收的多播数据包
- 查看异常流量(错误)
[root@localhost ~]# sar -n EDEV 1 4
Linux 3.10.0-957.el7.x86_64 (localhost.localdomain) 01/05/2021 _x86_64_ (1 CPU)
05:31:04 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
05:31:05 PM ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:05 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:05 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
05:31:06 PM ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:06 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:06 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
05:31:07 PM ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:07 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:07 PM IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
05:31:08 PM ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:31:08 PM lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
Average: ens32 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: lo 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过速的错误数
4.10、性能分析小技巧
-
技巧一:要判断系统瓶颈问题,有时需几个
sar
命令选项结合起来:1、怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
2、怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
3、怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看 -
技巧二:巧用
sadf
命令,转换成各种可读形式高的文件格式,进行线下分析。sar -o会将输出保存为二进制文件,我们可以通过sadf -d将二进制文件进行转换。 -
技巧三:如果你觉的上述通过
sadf
命令进行转换比较麻烦,也好,还有开源的ksar
工具,可以直接加载sar生成的日志文件,通过GUI显示,更直观,更便捷。 -
技巧四:sar也可以监控非实时数据,通过cron周期的运行到指定目录下。例如:我们想查看本月27日,从0点到23点的内存资源.sa27就是本月27日,指定具体的时间可以通过-s(start)和-e(end)来指定.如:
sar -f /var/log/sa/sa27 -s 00:00:00 -e 23:00:00 -r
五、常用命令汇总
默认监控: 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)