linux中查看系统活动情况报告sar命令详解

219 阅读12分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

参考文献:www.phpmianshi.com/?id=107

有很多工具可以看网络流量,但我最喜欢sar。

sar(System Activity Reporter系统活动情况报告)是目前 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:输出系统交换活动信息

sar 既能报告当前数据,也能报告历史数据

不带选项执行会以10分钟为间隔报告自午夜起当天的CPU利用率。这个粒度太粗,需要修改为1分钟。修改方法:

vi /etc/cron.d/sysstat#将这一行:*/10 * * * * root /usr/lib64/sa/sa1 1 1#更换为:*/1 * * * * root /usr/lib64/sa/sa1 1 1

比如查看本月23号以来服务器的平均负载状况

sar -q -f /var/log/sa/sa23

统计网络信息 sar -n

    -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)

1. sar -n DEV 1 即可每秒刷新一次网络流量。

[root@dev logs]#     sar -n DEV 1Linux 2.6.32-504.30.3.el6.x86_64 (dev.aigupiao.com)     05/31/20        _x86_64(2 CPU)20:09:14        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s20:09:15        lo      0.00    0.00      0.00      0.00      0.00      0.00      0.0020:09:15        eth0    2718.18   2111.11   1424.46    497.72      0.00      0.00      0.0020:09:15         IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s

IFACE  本地网卡接口的名称rxpck/s  每秒钟接受的数据包txpck/s  每秒钟发送的数据库rxKB/S  每秒钟接受的数据包大小,单位为KBtxKB/S  每秒钟发送的数据包大小,单位为KBrxcmp/s  每秒钟接受的压缩数据包txcmp/s  每秒钟发送的压缩包rxmcst/s  每秒钟接收的多播数据包

当然,你也可以使用ifstat、nload、iptraf等命令查看。然而数据来源,还是来自我们的/proc目录
watch cat /proc/net/dev查看占流量最大的IP
有时候我们发现网络带宽占用非常高,但我们无法判断到底流量来自哪里。这时候,iftop就可以帮上忙了。

2. sar -n EDEV 1 1 网络设备通信失败信息

[root@super-task-cron logs]# sar -n EDEV 1 1Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)07:59:22 PM     IFACE   rxerr/s   txerr/s    coll/s  rxdrop/s  txdrop/s  txcarr/s  rxfram/s  rxfifo/s  txfifo/s07:59:23 PM      eth0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.0007:59:23 PM        lo      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    在发生数据包 的时候,每秒钟缓冲区溢出的错误发生的次数

**3. sar -n SOCK 1 1 统计socket连接信息
**

[root@super-task-cron logs]# sar -n SOCK 1 1Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:03:33 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw08:03:34 PM       206        64         2         0         0         8Average:          206        64         2         0         0         8

totsck  当前被使用的socket总数tcpsck  当前正在被使用的TCP的socket总数udpsck  当前正在被使用的UDP的socket总数rawsck  当前正在被使用于RAW的skcket总数if-frag  当前的IP分片的数目tcp-tw  TCP套接字中处于TIME-WAIT状态的连接数量

4. sar -n TCP 1 1 TCP连接的统计

[root@super-task-cron logs]# sar -n TCP 1 1Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:06:27 PM  active/s passive/s    iseg/s    oseg/s08:06:28 PM      1.00      0.00   1114.00   1140.00Average:         1.00      0.00   1114.00   1140.00

active/s  新的主动连接passive/s  新的被动连接iseg/s  接受的段oseg/s  输出的段

5. sar -u 或 sar(默认) 查看CPU和IOWAIT统计状态

[root@super-task-cron logs]# sar -u 1 3  Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:16:05 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle08:16:06 PM     all      7.07      0.00      3.03      0.00      0.00     89.9008:16:07 PM     all      7.54      0.00      2.01      0.00      0.00     90.4508:16:08 PM     all      7.11      0.00      2.03      0.00      0.00     90.86Average:        all      7.24      0.00      2.36      0.00      0.00     90.40



%user   用户空间的CPU使用%nice   改变过优先级的进程的CPU使用率%system   内核空间的CPU使用率%iowait   CPU等待IO的百分比 %steal   虚拟机的虚拟机CPU使用的CPU%idle   空闲的CPU

主要看%iowait和%idle,%iowait过高表示存在I/O瓶颈,即磁盘IO无法满足业务需求,如果%idle过低表示CPU使用率比较严重,需要结合内存使用等情况判断CPU是否瓶颈。

6.sar -q 1 1 查看平均负载

[root@super-task-cron logs]# sar -q 1 3Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:20:36 PM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15   blocked08:20:37 PM         0       156      0.12      0.17      0.21         008:20:38 PM         0       157      0.11      0.16      0.21         008:20:39 PM         0       157      0.11      0.16      0.21         0Average:            0       157      0.11      0.16      0.21         0

runq-sz    运行队列的长度(等待运行的进程数,每核的CP不能超过3个)plist-sz   进程列表中的进程(processes)和线程数(threads)的数量ldavg-1  最后1分钟的CPU平均负载,即将多核CPU过去一分钟的负载相加再除以核心数得出的平均值,5分钟和15分钟以此类推ldavg-5   最后5分钟的CPU平均负载ldavg-15  最后15分钟的CPU平均负载blocked     当前阻塞的进程数量,在等待IO完成

7.sar -r 1 1或者 sar -S 查看内存使用情况

[root@super-task-cron logs]# sar -r 1 1Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:22:27 PM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty08:22:28 PM    333488   3546736     91.41    478972    941360   2581244     66.52   1027676    775288       856Average:       333488   3546736     91.41    478972    941360   2581244     66.52   1027676    775288       856

kbmemfree   空闲的物理内存大小kbmemused   使用中的物理内存大小%memused  物理内存使用率kbbuffers  内核中作为缓冲区使用的物理内存大小,kbbuffers和kbcached:这两个值就是free命令中的buffer和cache. kbcached  缓存的文件大小kbcommit   保证当前系统正常运行所需要的最小内存,即为了确保内存不溢出而需要的最少内存(物理内存+Swap分区)commit   这个值是kbcommit与内存总量(物理内存+swap分区)的一个百分比的值

内存使用情况提示:服务器内存占用量较高的情况其实非常正常。这是因为内存的读写速度及效率远高于服务器磁盘,因此操作系统倾向于将内存作为缓冲机制预先载入数据,从而提高数据读取速度。

同样,内存使用百分比也并不是什么大问题(除非大家没有设置虚拟内存分区,但这也与内存本身无关)。大家真正需要关注的是虚拟内存使用百分比,因为 只有在服务器的物理内存被全部占用后、虚拟内存才会接替而上发挥作用。这一数字越低,就说明服务器的运行状态越好。如果虚拟内存使用率为0%,则意味着我 们的服务器能够完全利用物理内存执行任务。

那么虚拟内存使用率达到多少才算过高?这取决于大家自己的感觉。一般来说,如果虚拟内存使用率一直不高、那么我们的服务器的运行状态还是比较理想 的。如果大家发现虚拟内存使用率随时间不断提升(例如由1%到7%再到32%),这就代表服务器上的某些进程正在疯狂吞噬内存,我们需要及时展开调查以了 解具体情况(而不该直接安装更多内存)。一旦服务器用尽了所有物理内存与虚拟内存,那么整套系统的运行将变得极为缓慢,需要经过重启才能暂时恢复正常。

8.sar -W 1 3 查看系统SWAP分区统计

[root@super-task-cron logs]# sar -W 1 3 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:24:09 PM  pswpin/s pswpout/s08:24:10 PM      0.00      0.0008:24:11 PM      0.00      0.0008:24:12 PM      0.00      0.00Average:         0.00      0.00

pswpin/s    每秒从交换分区到系统的交换页面(swap page)数量pswpott/s   每秒从系统交换到swap的交换页面(swap page)的数量

9.sar -b 1 1 查看IO传递速率

[root@super-task-cron logs]# sar -b 1 1 Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:25:31 PM       tps      rtps      wtps   bread/s   bwrtn/s08:25:32 PM      0.00      0.00      0.00      0.00      0.00Average:         0.00      0.00      0.00      0.00      0.00

tps  磁盘每秒钟的IO总数,等于iostat中的tpsrtps  每秒钟从磁盘读取的IO总数wtps  每秒钟从写入到磁盘的IO总数bread/s  每秒钟从磁盘读取的块总数bwrtn/s  每秒钟此写入到磁盘的块总数

10.sar -d 1 1 查看磁盘使用情况

[root@super-task-cron logs]# sar -d  1 1Linux 3.10.0-1062.9.1.el7.x86_64 (super-task-cron.aigupiao.com)         06/03/2020      _x86_64_        (2 CPU)08:26:30 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util08:26:31 PM  dev253-0      0.99      0.00     23.76     24.00      0.00      1.00      1.00      0.1008:26:31 PM dev253-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.0008:26:31 PM   dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %utilAverage:     dev253-0      0.99      0.00     23.76     24.00      0.00      1.00      1.00      0.10Average:    dev253-16      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00Average:      dev11-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

DEV  磁盘设备的名称,如果不加-p,会显示dev253-0类似的设备名称,因此加上-p显示的名称更直接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越慢

1. avgqu-sz 的值较低时,设备的利用率较高。

2. 当%util的值接近 1% 时,表示设备带宽已经占满。

常用总结:

(1) sar -b 1 1        // IO传送速率(2) sar -B 1 1        // 页交换速率(3) sar -c 1 1        // 进程创建的速率(4) sar -d 1 1        // 块设备的活跃信息(5) sar -n DEV 1 1    // 网路设备的状态信息(6) sar -n SOCK 1 1   // SOCK的使用情况(7) sar -n ALL 1 1    // 所有的网络状态信息(8) sar -P ALL 1 1    // 每颗CPU的使用状态信息和IOWAIT统计状态 (9) sar -q 1 1        // CPU队列的长度(等待运行的进程数)和负载的状态(10) sar -r 1 1      // 内存和swap空间使用情况(11) sar -R 1 1       // 内存的统计信息(内存页的分配和释放、系统每秒作为BUFFER使用内存页、每秒被cache到的内存页)(12) sar -u 1 1       // CPU的使用情况和IOWAIT信息(同默认监控)(13) sar -v 1 1       // inode, file and other kernel tablesd的状态信息(14) sar -w 1 1       // 每秒上下文交换的数目(15) sar -W 1 1       // SWAP交换的统计信息(监控状态同iostat 的si so)(16) sar -x 2906 1 1  // 显示指定进程(2906)的统计信息,信息包括:进程造成的错误、用户级和系统级用户CPU的占用情况、运行在哪颗CPU上(17) sar -y 1 1       // TTY设备的活动状态(18) 将输出到文件(-o)和读取记录信息(-f)

要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来

怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看

数据从何而来

/proc目录是一个虚拟目录,存储的是当前内核的一系列特殊文件
比如top的load (使用uptime命令得到同样的结果)。读取的就是
/proc/loadavg 文件
而每核cpu的信息,读取
/proc/stat文件
这些命令,是对/proc目录中一系列信息的解析和友好的展示

  1. 每个进程都有一个pid,比如18,在 /proc/18中有很多有用的信息

  2. /proc/18/env 跟这个进程相关的环境变量

  3. /proc/18/fd 所有的file description

  4. /proc/18/cmdline 进程启动时的命令行参数