参考:https://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 1 Linux 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/s 20:09:15 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 20:09:15 eth0 2718.18 2111.11 1424.46 497.72 0.00 0.00 0.00 20:09:15 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s
IFACE 本地网卡接口的名称 rxpck/s 每秒钟接受的数据包 txpck/s 每秒钟发送的数据库 rxKB/S 每秒钟接受的数据包大小,单位为KB txKB/S 每秒钟发送的数据包大小,单位为KB rxcmp/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 1 Linux 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/s 07:59:23 PM eth0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 07: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 1 Linux 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-tw 08:03:34 PM 206 64 2 0 0 8 Average: 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 1 Linux 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/s 08:06:28 PM 1.00 0.00 1114.00 1140.00 Average: 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 %idle 08:16:06 PM all 7.07 0.00 3.03 0.00 0.00 89.90 08:16:07 PM all 7.54 0.00 2.01 0.00 0.00 90.45 08:16:08 PM all 7.11 0.00 2.03 0.00 0.00 90.86 Average: 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 3 Linux 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 blocked 08:20:37 PM 0 156 0.12 0.17 0.21 0 08:20:38 PM 0 157 0.11 0.16 0.21 0 08:20:39 PM 0 157 0.11 0.16 0.21 0 Average: 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平均负载
7.sar -r 1 1或者 sar -S 查看内存使用情况
[root@super-task-cron logs]# sar -r 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:22:27 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty 08:22:28 PM 333488 3546736 91.41 478972 941360 2581244 66.52 1027676 775288 856 Average: 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/s 08:24:10 PM 0.00 0.00 08:24:11 PM 0.00 0.00 08:24:12 PM 0.00 0.00 Average: 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/s 08:25:32 PM 0.00 0.00 0.00 0.00 0.00 Average: 0.00 0.00 0.00 0.00 0.00
tps 磁盘每秒钟的IO总数,等于iostat中的tps rtps 每秒钟从磁盘读取的IO总数 wtps 每秒钟从写入到磁盘的IO总数 bread/s 每秒钟从磁盘读取的块总数 bwrtn/s 每秒钟此写入到磁盘的块总数
10.sar -d 1 1 查看磁盘使用情况
[root@super-task-cron logs]# sar -d 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:26:30 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 08:26:31 PM dev253-0 0.99 0.00 23.76 24.00 0.00 1.00 1.00 0.10 08:26:31 PM dev253-16 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 08:26:31 PM dev11-0 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: dev253-0 0.99 0.00 23.76 24.00 0.00 1.00 1.00 0.10 Average: dev253-16 0.00 0.00 0.00 0.00 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
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目录中一系列信息的解析和友好的展示
-
每个进程都有一个pid,比如18,在 /proc/18中有很多有用的信息
-
/proc/18/env 跟这个进程相关的环境变量
-
/proc/18/fd 所有的file description
-
/proc/18/cmdline 进程启动时的命令行参数