寻找系统瓶颈的利器——sar
一、sar是什么?
sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。
二、sar能做什么?
- 查看CPU使用率
- 查看平均负载
- 查看内存使用状况
- 查看I/O设备情况
- 查看网络情况
- 查看页面交换发生状况
- ……
三、sar怎么使用?
用法: sar [ 选项 ] [ <时间间隔> [ <次数> ] ]
选项:
[ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ]
[ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ]
[ -I { <中断> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ]
[ -n { <关键词> [,...] | ALL } ]
[ -o [ <文件名> ] | -f [ <文件名> ] ]
[ -i <时间间隔> ] [ -s [ <时:分:秒> ] ] [ -e [ <时:分:秒> ] ]
参数说明
-A 汇总所有的报告
-a 报告文件读写使用情况
-B 报告附加的缓存的使用情况
-b 报告缓存的使用情况
-c 报告系统调用的使用情况
-d 报告磁盘的使用情况
-g 报告串口的使用情况
-h 报告关于buffer使用的统计数据
-m 报告IPC消息队列和信号量的使用情况
-n 报告命名cache的使用情况
-p 报告调页活动的使用情况
-q 报告运行队列和交换队列的平均长度
-R 报告进程的活动情况
-r 报告没有使用的内存页面和硬盘块
-u 报告CPU的利用率
-v 报告进程、i节点、文件和锁表状态
-w 报告系统交换活动状况
-y 报告TTY设备活动状况
1、查看CPU使用率
使用-u选项,sar输出整体CPU的使用情况,不加选项时,默认使用的就是-u选项。以下命令显示采样时间为1s,采样次数为2次,整体CPU的使用情况。
$ sar 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15时08分13秒 CPU %user %nice %system %iowait %steal %idle
15时08分14秒 all 1.02 0.00 0.76 0.00 0.00 98.22
15时08分15秒 all 1.01 0.00 1.01 0.00 0.00 97.98
平均时间: all 1.01 0.00 0.89 0.00 0.00 98.10
$ sar -u 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
14时36分02秒 CPU %user %nice %system %iowait %steal %idle
14时36分03秒 all 0.76 0.00 0.76 0.00 0.00 98.48
14时36分04秒 all 1.27 0.00 0.76 0.00 0.00 97.97
平均时间: all 1.01 0.00 0.76 0.00 0.00 98.23
“-P ALL”选项指示对每个内核输出统计信息,其中”CPU”列输出0,1,2,3,4指示对应的cpu核。也可针对单独一个内核显示,“-P 1”指示显示第二个内核的统计信息。
$ sar -P ALL 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
14时35分54秒 CPU %user %nice %system %iowait %steal %idle
14时35分55秒 all 1.01 0.00 0.76 0.00 0.00 98.23
14时35分55秒 0 1.01 0.00 1.01 0.00 0.00 97.98
14时35分55秒 1 1.03 0.00 0.00 0.00 0.00 98.97
14时35分55秒 2 1.01 0.00 1.01 0.00 0.00 97.98
14时35分55秒 3 1.01 0.00 1.01 0.00 0.00 97.98
14时35分55秒 CPU %user %nice %system %iowait %steal %idle
14时35分56秒 all 1.26 0.00 0.76 0.00 0.00 97.98
14时35分56秒 0 1.01 0.00 1.01 0.00 0.00 97.98
14时35分56秒 1 1.01 0.00 2.02 0.00 0.00 96.97
14时35分56秒 2 1.02 0.00 0.00 0.00 0.00 98.98
14时35分56秒 3 1.01 0.00 0.00 0.00 0.00 98.99
平均时间: CPU %user %nice %system %iowait %steal %idle
平均时间: all 1.14 0.00 0.76 0.00 0.00 98.10
平均时间: 0 1.01 0.00 1.01 0.00 0.00 97.98
平均时间: 1 1.02 0.00 1.02 0.00 0.00 97.96
平均时间: 2 1.02 0.00 0.51 0.00 0.00 98.48
平均时间: 3 1.01 0.00 0.51 0.00 0.00 98.48
$ sar -P 1 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15时12分53秒 CPU %user %nice %system %iowait %steal %idle
15时12分54秒 1 1.02 0.00 1.02 0.00 0.00 97.96
15时12分55秒 1 0.00 0.00 1.01 0.00 0.00 98.99
平均时间: 1 0.51 0.00 1.02 0.00 0.00 98.48
- %user :用户模式下CPU时间占用比例;
- %nice :通过nice改变了进程调度优先级的进程,在用户模式下CPU时间占用比例
- %system :系统模式下CPU时间占用比例;
- %iowait :CPU等待磁盘I/O导致空闲状态CPU时间占用比例;
- %steal :当hypervisor服务另一个虚拟处理器的时候,虚拟CPU等待实际CPU的时间的百分比(如果此值过大,说明主机分配的虚拟机数量过多)
- %idle :CPU空闲时间占用比例;
2、查看平均负载
使用-q选项,就能查看运行队列中的进程数、系统上的进程和线程数、平均负载等
$ sar -q 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15时22分35秒 runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15
15时22分36秒 0 503 0.00 0.00 0.00
15时22分37秒 0 503 0.00 0.00 0.00
平均时间: 0 503 0.00 0.00 0.00
- runq-sz :运行队列的长度(等待运行的进程数)
- plist-sz :进程列表中进程(processes)和线程(threads)的数量
- ldavg-1 :最近1分钟的系统平均负载
- ldavg-5 :最近5分钟的系统平均负载
- ldavg-15 :最近15分钟的系统平均负载
3、查看内存使用状况
使用-r选项,可查看物理内存使用状况。
$ sar -r 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15时16分36秒 kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit
15时16分37秒 1251336 6811288 84.48 173712 5114880 5148236 42.00
15时16分38秒 1251336 6811288 84.48 173712 5114880 5148236 42.00
平均时间: 1251336 6811288 84.48 173712 5114880 5148236 42.00
$ free
total used free shared buffers cached
Mem: 8062624 6811016 1251608 0 173712 5114880
-/+ buffers/cache: 1522424 6540200
Swap: 4194296 756656 3437640
- 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、查看I/O设备情况
使用-b选项,查看I/O和传输速率统计。
$ sar -b 1 10
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时52分34秒 tps rtps wtps bread/s bwrtn/s
16时52分35秒 0.00 0.00 0.00 0.00 0.00
16时52分36秒 0.00 0.00 0.00 0.00 0.00
16时52分37秒 0.00 0.00 0.00 0.00 0.00
16时52分38秒 2.02 0.00 2.02 0.00 24.24
16时52分39秒 1.02 0.00 1.02 0.00 8.16
16时52分40秒 0.00 0.00 0.00 0.00 0.00
16时52分41秒 0.00 0.00 0.00 0.00 0.00
16时52分42秒 0.00 0.00 0.00 0.00 0.00
16时52分43秒 0.00 0.00 0.00 0.00 0.00
16时52分44秒 5.10 0.00 5.10 0.00 89.80
平均时间: 0.81 0.00 0.81 0.00 12.18
- tps :磁盘每秒钟的IO总数
- rtps :每秒钟从磁盘读取的IO总数
- wtps :每秒钟从写入到磁盘的IO总数
- bread/s :每秒钟从磁盘读取的块总数
- bwrtn/s :每秒钟此写入到磁盘的块总数
使用-d选项,查看每个块设备的活动。DEV 磁盘设备的名称,如果不加-p,会显示类似“dev11-0”的设备名称,因此加上-p显示的名称更为直观。
$ sar -d 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时47分23秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16时47分24秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时47分24秒 dev8-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时47分24秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16时47分25秒 dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时47分25秒 dev8-0 4.04 0.00 48.48 12.00 0.00 0.00 0.00 0.00
平均时间: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
平均时间: dev11-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: dev8-0 2.02 0.00 24.24 12.00 0.00 0.00 0.00 0.00
$ iostat -d 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.00 0.00 0.00 2000 0
sda 3.28 87.98 202.59 1984979076 4570968384
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
scd0 0.00 0.00 0.00 0 0
sda 0.00 0.00 0.00 0 0
$ sar -d -p 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时48分10秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16时48分11秒 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时48分11秒 sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时48分11秒 DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
16时48分12秒 scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时48分12秒 sda 3.03 0.00 32.32 10.67 0.00 0.00 0.00 0.00
平均时间: DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util
平均时间: scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: sda 1.53 0.00 16.33 10.67 0.00 0.00 0.00 0.00
- tps :每秒I/O的传输总数
- rd_sec/s :每秒读取的扇区的总数
- wr_sec/s :每秒写入的扇区的总数
- avgrq-sz :平均每次磁盘I/O操作的数据大小(扇区)
- avgqu-sz :磁盘请求队列的平均长度
- await :从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒等于1000毫秒),等于寻道时间+队列时间+服务时间
- svctm :I/O的服务处理时间,即不包括请求队列中的时间
- %util :I/O请求占用的CPU百分比,值越高,说明I/O越慢
5、查看网络情况
使用-n选项,结合关键词,查看网络相关情况。
【用法】:sar [ -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)
$ sar -n DEV 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时06分16秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16时06分17秒 lo 13.13 13.13 1.57 1.57 0.00 0.00 0.00
16时06分17秒 eth0 13.13 106.06 0.80 6.40 0.00 0.00 0.00
16时06分17秒 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
16时06分18秒 lo 13.27 13.27 1.58 1.58 0.00 0.00 0.00
16时06分18秒 eth0 14.29 110.20 1.09 6.98 0.00 0.00 0.00
平均时间: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
平均时间: lo 13.20 13.20 1.57 1.57 0.00 0.00 0.00
平均时间: eth0 13.71 108.12 0.94 6.69 0.00 0.00 0.00
- IFACE :本地网卡接口的名称
- rxpck/s :每秒钟接受的数据包
- txpck/s :每秒钟发送的数据库
- rxKB/S :每秒钟接受的数据包大小,单位为KB
- txKB/S :每秒钟发送的数据包大小,单位为KB
- rxcmp/s :每秒钟接受的压缩数据包
- txcmp/s :每秒钟发送的压缩包
- rxmcst/s :每秒钟接收的多播数据包
$ sar -n EDEV 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时08分16秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
16时08分17秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时08分17秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时08分17秒 IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
16时08分18秒 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
16时08分18秒 eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: IFACE rxerr/s txerr/s coll/s rxdrop/s txdrop/s txcarr/s rxfram/s rxfifo/s txfifo/s
平均时间: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
平均时间: eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
- IFACE :网卡名称
- rxerr/s :每秒钟接收到的损坏的数据包
- txerr/s :每秒钟发送的数据包错误数
- coll/s :当发送数据包时候,每秒钟发生的冲撞(collisions)数,这个是在半双工模式下才有
- rxdrop/s :当由于缓冲区满的时候,网卡设备接收端每秒钟丢掉的网络包的数目
- txdrop/s :当由于缓冲区满的时候,网络设备发送端每秒钟丢掉的网络包的数目
- txcarr/s :当发送数据包的时候,每秒钟载波错误发生的次数
- rxfram/s :在接收数据包的时候,每秒钟发生的帧对其错误的次数
- rxfifo/s :在接收数据包的时候,每秒钟缓冲区溢出的错误发生的次数
- txfifo/s 在发生数据包 的时候,每秒钟缓冲区溢出的错误发生的次数
$ sar -n TCP 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时12分15秒 active/s passive/s iseg/s oseg/s
16时12分16秒 0.00 0.00 6.06 9.09
16时12分17秒 0.00 0.00 2.02 2.02
平均时间: 0.00 0.00 4.04 5.56
- active/s :新的主动连接
- passive/s :新的被动连接
- iseg/s :接受的段
- oseg/s :输出的段
$ sar -n SOCK 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
16时13分59秒 totsck tcpsck udpsck rawsck ip-frag tcp-tw
16时14分00秒 434 26 19 1 0 0
16时14分01秒 434 26 19 1 0 0
平均时间: 434 26 19 1 0 0
- totsck :当前被使用的socket总数
- tcpsck :当前正在被使用的TCP的socket总数
- udpsck :当前正在被使用的UDP的socket总数
- rawsck :当前正在被使用于RAW的skcket总数
- if-frag :当前的IP分片的数目
- tcp-tw :TCP套接字中处于TIME-WAIT状态的连接数量
6、查看页面交换发生状况
$ sar -W 1 2
Linux 2.6.32-358.el6.x86_64 (localhost.localdomain) 2020年01月16日 _x86_64_ (4 CPU)
15时51分29秒 pswpin/s pswpout/s
15时51分30秒 0.00 0.00
15时51分31秒 0.00 0.00
平均时间: 0.00 0.00
- pswpin/s:每秒系统换入的交换页面(swap page)数量
- pswpout/s:每秒系统换出的交换页面(swap page)数量
四、总结
怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
怀疑内存存在瓶颈,可用sar -B、sar -r 和 sar -W 等来查看
怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看