本文已参与「新人创作礼」活动,一起开启掘金创作之路。
参考文献: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目录中一系列信息的解析和友好的展示
-
每个进程都有一个pid,比如18,在 /proc/18中有很多有用的信息
-
/proc/18/env 跟这个进程相关的环境变量
-
/proc/18/fd 所有的file description
-
/proc/18/cmdline 进程启动时的命令行参数