linux-sar详解

2017-01-13 16:17

sar

  • sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。
  • 安装
yum install sysstat 

sar命令常用格式

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

其中:

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

实例

cpu监控

每秒钟记录一次cpu运行情况,共记录30次

sar -u 1 30 | sed '1,3d'|sed '$d' > sar_cpu_1.txt
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

说明:删掉了第1-3行和最后一行,这样有利于js分析

输出项说明

  • CPU:all 表示统计信息为所有 CPU 的平均值。
  • %user 在用户模式中运行进程所花的时间
  • %nice 运行正常进程所花的时间
  • %system 在内核模式(系统)中运行进程所花的时间
  • %iowait 没有进程在该CPU上执行时,处理器等待I/O完成的时间
  • %idle 显示 CPU 空闲时间占用 CPU 总时间的百分比
  • %steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。

注意说明:

  • 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
  • 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
  • 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU

内存的监控

每1秒钟记录一次内存使用情况,共记录10次

root@ubuntu:~$ sar -r 1 3
Linux 3.19.0-15-generic (ubuntu)    01/13/2017  _x86_64_    (1 CPU)

12:01:56 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
12:01:57 AM     68536    931520     93.15     11048    200416   3914160    191.25    332892    356680         8
12:01:58 AM     66628    933428     93.34     11048    201108   3914160    191.25    333080    358352         8
12:01:59 AM     70256    929800     92.97     11048    200976   3965000    193.74    342224    345812         8
Average:        68473    931583     93.15     11048    200833   3931107    192.08    336065    353615         8
shi@ubuntu:~$ 

输出项说明

  • kbmemfree 空闲内存大小.这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
  • kbmemused 内存使用量大小.这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
  • %memused 物理内存使用率,这个值是kbmemused和内存总量(不包括swap)的一个百分比.
  • kbbuffers 内存buffers大小.等同于free中的buffers
  • kbcached 内存cached大小.等同于free中的cache
  • kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
  • %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.

查看平均负载

指定-q后,就能查看运行队列中的进程数、系统上的进程大小、平均负载等;与其它命令相比,它能查看各项指标随时间变化的情况

root@ubuntu:~$ sar -q 1 10
Linux 3.19.0-15-generic (ubuntu)    01/12/2017  _x86_64_    (1 CPU)

11:53:05 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked
11:53:06 PM         0       468      2.14      0.76      0.27         0
11:53:07 PM         0       468      2.14      0.76      0.27         0
11:53:08 PM         0       468      1.97      0.75      0.27         0
11:53:09 PM         1       467      1.97      0.75      0.27         0
11:53:10 PM         0       467      1.97      0.75      0.27         0
11:53:11 PM         0       467      1.97      0.75      0.27         0
11:53:12 PM         0       467      1.97      0.75      0.27         0
11:53:13 PM         0       467      1.81      0.74      0.27         0
11:53:14 PM         0       466      1.81      0.74      0.27         0
11:53:15 PM         0       462      1.81      0.74      0.27         0
Average:            0       467      1.96      0.75      0.27         0

输出说明

  • runq-sz:运行队列的长度(等待运行的进程数)
  • plist-sz:进程列表中进程(processes)和线程(threads)的数量
  • ldavg-1:最后1分钟的系统平均负载
  • ldavg-5:过去5分钟的系统平均负载
  • ldavg-15:过去15分钟的系统平均负载

IO监控

sar -b 1 2 | sed  '1,3d'|sed '$d' > sar_IO.txt
4:50:33          tps      rtps      wtps   bread/s   bwrtn/s
14:50:34         0.99      0.00      0.99      0.00      7.92
14:50:35         4.00      0.00      4.00      0.00    136.00
Average:         2.49      0.00      2.49      0.00     71.64

输出说明

  • tps: 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps的和。出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。
  • rtps: 每秒向磁盘设备的读请求次数
  • wtps: 每秒向磁盘设备的写请求次数
  • bread: 每秒从磁盘读的bytes数量
  • bwrtn: 每秒向磁盘写的bytes数量

查看页面交换发生状况

页面发生交换时,服务器的吞吐量会大幅下降;服务器状况不良时,如果怀疑因为内存不足而导致了页面交换的发生,可以使用这个命令来确认是否发生了大量的交换

root@ubuntu:~$ sar -W 1 3
Linux 3.19.0-15-generic (ubuntu)    01/12/2017  _x86_64_    (1 CPU)

11:57:58 PM  pswpin/s pswpout/s
11:57:59 PM      0.00      0.00
11:58:00 PM     31.00    361.00
11:58:01 PM     23.76    210.89
Average:        18.09    188.82

输出说明

  • pswpin/s:每秒系统换入的交换页面(swap page)数量
  • pswpout/s:每秒系统换出的交换页面(swap page)数量

利用sar来做个后台监控程

可以实时汇报机器性能情况。sar能放后台运行么,借助linux的后台符就可以了,别忘了把标准输出重定向哦,方法是这样的:

sar -o monitor.res interval count >/dev/null 2>&1 &

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

sar分析网卡流量

sar -n DEV 2 10
Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

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

Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009
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

Linux 2.6.18-53.el5PAE (localhost.localdomain) 03/29/2009

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

输出说明

  • totsck:使用的套接字总数量
  • tcpsck:使用的TCP套接字数量
  • udpsck:使用的UDP套接字数量
  • rawsck:使用的raw套接字数量
  • ip-frag:使用的IP段数量

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

总结

  • 怀疑CPU存在瓶颈,可用 sar -usar -q 等来查看
  • 怀疑内存存在瓶颈,可用 sar -Bsar -rsar -W 等来查看
  • 怀疑I/O存在瓶颈,可用 sar -bsar -usar -d 等来查看
  • 怀疑流量异常,可用sar -n DEV
  • 怀疑socket异常,可用sar -n SOCK