sar(System Activity Reporter 系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘 I/O、CPU 效率、内存使用状况、进程活动及 IPC 有关的活动等。
我们可以使用sar命令来获得整个系统性能的报告。这有助于我们定位系统性能的瓶颈,并且有助于我们找出这些烦人的性能问题的解决方法。
性能问题排查技巧
怀疑 CPU 存在瓶颈,可用sar -u和sar -q等来查看
怀疑内存存在瓶颈,可用sar -B、sar -r和sar -W等来查看
怀疑 I/O 存在瓶颈,可用sar -b、sar -u和sar -d等来查看
sar命令来自于sysstat工具包,如果提示sar命令不存在,需先安装sysstat
yum -y install sysstat
在/etc/default/sysstat里面把false改成true,然后重启一下sysstat(service sysstat restart),就能产生日志了
网络统计信息
sar -n <关键词> [ <时间间隔> [ <次数> ] ]
示例:
sar -n DEV 1 5
平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
平均时间: lo 2.21 2.21 0.18 0.18 0.00 0.00 0.00
平均时间: eth0 4.62 3.82 0.37 1.90 0.00 0.00 0.00
#命令中 1 5 表示每一秒钟取 1 次值,一共取 5 次。
#命令执行后会列出每个网卡这 5 次取值的平均数据,根据实际情况来确定带宽跑满的网卡名称,默认情况下 eth0 为内网网卡,eth1 为外网网卡。
CPU 利用率
sar -u [ <时间间隔> [ <次数> ] ]
示例:
[email protected]:[/root]sar -u 1 3
Linux 3.10.0-1127.19.1.el7.x86_64 (localhost.localdomain) 2020年09月01日 _x86_64_ (1 CPU)
14时26分12秒 CPU %user %nice %system %iowait %steal %idle
14时26分13秒 all 0.00 0.00 0.00 0.00 0.00 100.00
14时26分14秒 all 0.00 0.00 0.00 0.00 0.00 100.00
14时26分15秒 all 0.99 0.00 0.99 0.00 0.00 98.02
平均时间: all 0.34 0.00 0.34 0.00 0.00 99.33
#命令中 1 3 表示每一秒钟取 1 次值,一共取 3 次。
输出项说明:
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU
索引节点,文件和其他内核表的状态
sar -v [ <时间间隔> [ <次数> ] ]
示例:
[email protected]:[/root]sar -v 1 3
Linux 3.10.0-1127.19.1.el7.x86_64 (localhost.localdomain) 2020年09月01日 _x86_64_ (1 CPU)
14时29分15秒 dentunusd file-nr inode-nr pty-nr
14时29分16秒 19393 1248 34981 1
14时29分17秒 19393 1248 34981 1
14时29分18秒 19393 1248 34981 1
平均时间: 19393 1248 34981 1
输出项说明:
dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的 pty 数量
内存利用率
sar -r [ <时间间隔> [ <次数> ] ]
示例:
[email protected]:[/root]sar -r 1 3
Linux 3.10.0-1127.19.1.el7.x86_64 (localhost.localdomain) 2020年09月01日 _x86_64_ (1 CPU)
14时30分50秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
14时30分51秒 290744 704940 70.80 228 363540 577112 18.66 243532 244500 8
14时30分52秒 290744 704940 70.80 228 363540 577112 18.66 243536 244500 8
14时30分53秒 290744 704940 70.80 228 363540 577112 18.66 243536 244500 8
平均时间: 290744 704940 70.80 228 363540 577112 18.66 243535 244500 8
输出项说明:
%memused:这个值是 kbmemused 和内存总量(不包括 swap)的一个百分比
kbbuffers 和 kbcached:这两个值就是 free 命令中的 buffer 和 cache
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM + swap)
%commit:这个值是 kbcommit 与内存总量(包括 swap)的一个百分比
内存分页状况
sar -B [ <时间间隔> [ <次数> ] ]
示例:
sar -B 1 3
Linux 2.6.32-696.13.2.el6.x86_64 (upfor163) 2018年04月25日 _x86_64_ (2 CPU)
10时55分41秒 pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff
10时55分42秒 0.00 0.00 5723.76 0.00 3356.44 0.00 0.00 0.00 0.00
10时55分43秒 0.00 0.00 1185.00 0.00 312.00 0.00 0.00 0.00 0.00
10时55分44秒 0.00 0.00 27.00 0.00 56.00 0.00 0.00 0.00 0.00
平均时间: 0.00 0.00 2323.26 0.00 1248.50 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)的百分比
I/O 和传输速率信息状况
sar -b [ <时间间隔> [ <次数> ] ]
示例:
sar -b 1 3
Linux 2.6.32-696.13.2.el6.x86_64 (upfor163) 2018年04月25日 _x86_64_ (2 CPU)
10时58分15秒 tps rtps wtps bread/s bwrtn/s
10时58分16秒 7.00 0.00 7.00 0.00 64.00
10时58分17秒 4.04 0.00 4.04 0.00 80.81
10时58分18秒 0.00 0.00 0.00 0.00 0.00
平均时间: 3.67 0.00 3.67 0.00 48.00
输出项说明:
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为:块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为:块/s
队列长度和平均负载
sar -q [ <时间间隔> [ <次数> ] ]
示例:
sar -q 1 3
Linux 2.6.32-696.13.2.el6.x86_64 (upfor163) 2018年04月25日 _x86_64_ (2 CPU)
11时00分35秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
11时00分36秒 0 268 0.00 0.00 0.00
11时00分37秒 0 268 0.00 0.00 0.00
11时00分38秒 0 268 0.00 0.00 0.00
平均时间: 0 268 0.00 0.00 0.00
输出项说明:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
系统交换信息
sar -W [ <时间间隔> [ <次数> ] ]
示例:
sar -W 1 3
Linux 2.6.32-696.13.2.el6.x86_64 (upfor163) 2018年04月25日 _x86_64_ (2 CPU)
11时01分45秒 pswpin/s pswpout/s
11时01分46秒 0.00 0.00
11时01分47秒 0.00 0.00
11时01分48秒 0.00 0.00
平均时间: 0.00 0.00
输出项说明:
pswpin/s:每秒系统换入的交换页面(swap page)数量
pswpout/s:每秒系统换出的交换页面(swap page)数量
块设备状况
sar -d [ <时间间隔> [ <次数> ] ]
示例:
sar -d 1 3
Linux 2.6.32-696.13.2.el6.x86_64 (upfor163) 2018年04月25日 _x86_64_ (2 CPU)
11时02分46秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11时02分47秒 dev252-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
11时02分47秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11时02分48秒 dev252-0 6.06 0.00 64.65 10.67 0.00 0.00 0.00 0.00
11时02分48秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
11时02分49秒 dev252-0 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
平均时间: dev252-0 2.00 0.00 21.33 10.67 0.00 0.00 0.00 0.00
输出项说明:
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% 时,表示设备带宽已经占满
输出统计的数据信息
sar -o path_file [选项] [ <时间间隔> [ <次数> ] ]
示例:
sar -o sarfile.log -u 1 3
上述示例命令会将sar -u 1 3采集到的数据以二进制的格式存放到文件sarfile.log中。
我们还可以通过命令sadf -d sarfile.log将二进制数据文件转换成数据库可读的格式。
sadf -d sarfile.log
# hostname;interval;timestamp;CPU;%user;%nice;%system;%iowait;%steal;%idle
upfor163;1;2018-04-25 03:15:02 UTC;-1;0.00;0.00;0.50;0.50;0.00;99.00
upfor163;1;2018-04-25 03:15:03 UTC;-1;1.01;0.00;0.00;0.00;0.00;98.99
upfor163;1;2018-04-25 03:15:04 UTC;-1;0.00;0.00;0.00;0.00;0.00;100.00
也可以将这些数据存储在一个 csv 文档中,然后绘制成图表展示方式,如下所示:
sadf -d sarfile.log | sed 's/;/,/g' > sarfile.csv
#sadf:导出数据绘制的图表
从数据文件读取信息
sar -f <文件路径>
示例:
sar -f sarfile.log
Linux 2.6.32-696.13.2.el6.x86_64 (upfor163) 2018年04月25日 _x86_64_ (2 CPU)
11时15分01秒 CPU %user %nice %system %iowait %steal %idle
11时15分02秒 all 0.00 0.00 0.50 0.50 0.00 99.00
11时15分03秒 all 1.01 0.00 0.00 0.00 0.00 98.99
11时15分04秒 all 0.00 0.00 0.00 0.00 0.00 100.00
平均时间: all 0.33 0.00 0.17 0.17 0.00 99.33