sar`(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘 I/O、CPU 效率、内存使用状况、进程活动及 IPC 有关的活动等。
我们可以使用sar
命令来获得整个系统性能的报告。这有助于我们定位系统性能的瓶颈,并且有助于我们找出这些烦人的性能问题的解决方法。
Linux 内核维护着一些内部计数器,这些计数器包含了所有的请求及其完成时间和 I/O 块数等信息,sar
命令从所有的这些信息中计算出请求的利用率和比例,以便找出瓶颈所在。
sar命令主要的用途是生成某段时间内所有活动的报告,因此必需确保
sar`命令在适当的时间进行数据采集(而不是在午餐时间或者周末)
命令参数
用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ]
主选项和报告:
-b I/O 和传输速率信息状况
-B 分页状况
-d 块设备状况
-I { <中断> | SUM | ALL | XALL }
中断信息状况
-m 电源管理信息状况
-n { <关键词> [,...] | ALL }
网络统计信息
关键词可以是:
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)
-q 队列长度和平均负载
-r 内存利用率
-R 内存状况
-S 交换空间利用率
-u [ ALL ]
CPU 利用率
-v Kernel table 状况
-w 任务创建与系统转换统计信息
-W 交换信息
-y TTY 设备状况
-o {<文件路径>}
将命令结果以二进制格式存放在指定文件中
常用命令
网络统计信息
sar -n <关键词> [ <时间间隔> [ <次数> ] ]
示例:
命令中 1 5 表示每一秒钟取 1 次值,一共取 5 次。
命令执行后会列出每个网卡这 5 次取值的平均数据,根据实际情况来确定带宽跑满的网卡名称,
CPU 利用率
sar -u [ <时间间隔> [ <次数> ] ]
示例:
root@ubuntu:~# sar -u 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:44:59 AM CPU %user %nice %system %iowait %steal %idle
01:45:00 AM all 0.50 0.00 2.50 0.00 0.00 97.00
01:45:01 AM all 1.02 0.00 1.53 0.00 0.00 97.45
01:45:02 AM all 2.01 0.00 3.52 11.56 0.00 82.91
Average: all 1.18 0.00 2.52 3.87 0.00 92.44
root@ubuntu:~#
命令中 1 3 表示每一秒钟取 1 次值,一共取 3 次。
输出项说明:
CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比
即:用户进程空间内改变过优先级的进程占用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
索引节点,文件和其他内核表的状态
sar -v [ <时间间隔> [ <次数> ] ]
示例:
root@ubuntu:~# sar -v 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:50:30 AM dentunusd file-nr inode-nr pty-nr
01:50:31 AM 10487 7104 28040 2
01:50:32 AM 10487 7104 28040 2
01:50:33 AM 10487 7104 28040 2
Average: 10487 7104 28040 2
root@ubuntu:~#
输出项说明:
dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的 pty 数量
内存利用率
sar -r [ <时间间隔> [ <次数> ] ]
示例:
root@ubuntu:~# sar -r 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:51:59 AM kbmemfree kbavail kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
01:52:00 AM 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 920
01:52:01 AM 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 920
01:52:02 AM 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 932
Average: 6829576 7191212 1314884 16.14 77508 494124 2902068 16.58 409396 587336 924
root@ubuntu:~#
输出项说明:
kbmemfree:这个值和 free 命令中的 free 值基本一致,所以它不包括 buffer 和 cache 的空间
kbmemused:这个值和 free 命令中的 used 值基本一致,所以它包括 buffer 和 cache 的空间
%memused:这个值是 kbmemused 和内存总量(不包括 swap)的一个百分比
kbbuffers 和 kbcached:这两个值就是 free 命令中的 buffer 和 cache
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM + swap)
%commit:这个值是 kbcommit 与内存总量(包括 swap)的一个百分比
Kbactive:活动内存量(以千字节计算)(最近使用的内存,通常不会被收回,除非绝对必要)
kbinact:不活动内存量(以千字节计算的内存(最近使用的内存),更有资格被用于其他目的)。
kbdirty:以KB为单位的内存量等待写入磁盘
内存分页状况
sar -B [ <时间间隔> [ <次数> ] ]
示例:
root@ubuntu:~# sar -B 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:57:43 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
01:57:44 AM 0.00 0.00 18.00 0.00 4.00 0.00 0.00 0.00 0.00
01:57:45 AM 0.00 0.00 2.00 0.00 2.00 0.00 0.00 0.00 0.00
01:57:46 AM 0.00 0.00 0.00 0.00 3.00 0.00 0.00 0.00 0.00
Average: 0.00 0.00 6.67 0.00 3.00 0.00 0.00 0.00 0.00
root@ubuntu:~#
输出项说明:
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)的百分比
I/O 和传输速率信息状况
sar -b [ <时间间隔> [ <次数> ] ]
示例:
root@ubuntu:~# sar -b 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
01:59:58 AM tps rtps wtps bread/s bwrtn/s
01:59:59 AM 2.00 0.00 2.00 0.00 128.00
02:00:00 AM 0.00 0.00 0.00 0.00 0.00
02:00:01 AM 0.00 0.00 0.00 0.00 0.00
Average: 0.67 0.00 0.67 0.00 42.67
root@ubuntu:~#
输出项说明:
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为:块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为:块/s
队列长度和平均负载
sar -q [ <时间间隔> [ <次数> ] ]
示例:
root@ubuntu:~# sar -q 1 3
Linux 4.15.0-20-generic (ubuntu) 09/18/2019 _x86_64_ (2 CPU)
02:01:22 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
02:01:23 AM 0 430 0.15 0.07 0.18 0
02:01:24 AM 0 430 0.15 0.07 0.18 0
02:01:25 AM 0 431 0.15 0.07 0.18 0
Average: 0 430 0.15 0.07 0.18 0
root@ubuntu:~#
输出项说明:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载(System load average)
ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载
blocked:当前阻塞的任务数,等待I / O完成
系统交换信息
sar -q [ <时间间隔> [ <次数> ] ]
示例:
[root@node-1 yum.repos.d]# sar -W 5 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:19:59 PM pswpin/s pswpout/s
05:20:04 PM 0.00 0.00
05:20:09 PM 0.00 64.00
05:20:14 PM 0.00 0.00
Average: 0.00 21.33
[root@node-1 yum.repos.d]#
输出项说明:
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量
块设备状况
sar -d [ <时间间隔> [ <次数> ] ]
示例:
[root@node-1 ~]# sar -d 1 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:21:21 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:21:22 PM dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev253-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:22 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:21:23 PM dev8-0 3.00 0.00 192.00 64.00 0.00 0.00 0.00 0.00
05:21:23 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:23 PM dev253-0 24.00 0.00 192.00 8.00 0.00 0.00 0.00 0.00
05:21:23 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:23 PM dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:23 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
05:21:24 PM dev8-0 4.00 8.00 160.00 42.00 0.00 0.00 0.00 0.00
05:21:24 PM dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:24 PM dev253-0 18.00 8.00 160.00 9.33 0.00 0.00 0.00 0.00
05:21:24 PM dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
05:21:24 PM dev253-2 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: dev8-0 2.33 2.67 117.33 51.43 0.00 0.00 0.00 0.00
Average: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-0 14.00 2.67 117.33 8.57 0.00 0.00 0.00 0.00
Average: dev253-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Average: dev253-2 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
[root@node-1 ~]#
输出项说明:
参数-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的百分比,比率越大,说明越饱和.
注意:
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当%util的值接近 1% 时,表示设备带宽已经占满。
输出统计的数据信息
示例:
[root@node-1 ~]# sar -o sarfile.log -u 1 3
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:24:18 PM CPU %user %nice %system %iowait %steal %idle
05:24:19 PM all 16.96 0.00 4.68 0.00 0.00 78.35
05:24:20 PM all 5.68 0.00 1.26 0.00 0.00 93.06
05:24:21 PM all 8.06 0.00 3.53 0.00 0.00 88.41
Average: all 10.23 0.00 3.16 0.00 0.00 86.62
[root@node-1 ~]#
上述示例命令会将sar -u 1 3
采集到的数据以二进制的格式存放到文件sarfile.log
中。
我们还可以通过命令sadf -d sarfile.log
将二进制数据文件转换成数据库可读的格式。
sadf -d sarfile.log | sed 's/;/,/g' > sarfile.csv
也可以将这些数据存储在一个 csv 文档中,然后绘制成图表展示方式,如下所示:
从数据文件读取信息
sar -f <文件路径>
示例:
又将之前存储在二进制文件中的数据给读取并展示出来。
[root@node-1 ~]# sar -f sarfile.log
Linux 3.10.0-327.20.1.es2.el7.x86_64 (node-1.domain.tld) 09/18/2019 _x86_64_ (8 CPU)
05:24:18 PM CPU %user %nice %system %iowait %steal %idle
05:24:19 PM all 16.96 0.00 4.68 0.00 0.00 78.35
05:24:20 PM all 5.68 0.00 1.26 0.00 0.00 93.06
05:24:21 PM all 8.06 0.00 3.53 0.00 0.00 88.41
Average: all 10.23 0.00 3.16 0.00 0.00 86.62
[root@node-1 ~]#
性能问题排查技巧
- 怀疑 CPU 存在瓶颈,可用
sar -u
和sar -q
等来查看 - 怀疑内存存在瓶颈,可用
sar -B
、sar -r
和sar -W
等来查看 - 怀疑 I/O 存在瓶颈,可用
sar -b
、sar -u
和sar -d
等来查看