概述
因工作需要对网卡出入流量进行统计分析,故编写该基础监测网卡出入流量脚本。
方法介绍
首先我们先了解一下Linux系统获取网络流量的几种方法:
1.基于sysfs虚拟文件系统,这是由内核用来将设备或驱动相关的信息输出到用户空间的一种机制。网络接口的相关分析数据会通过"/sys/class/net/\<ethX\>/statistics"输出。
加之Linux提供了LKM机制可以使我们在内核空间工作,在LKM机制中一个重要的组成部分就是proc伪文件系统,它为用户提供了动态操作Linux内核信息的接口,是除系统调用之外另一个重要的Linux内核空间与用户空间交换数据的途径。
如:
- /sys/class/net/eth0/statistics/rx_packets: 收到的数据包数据
- /sys/class/net/eth0/statistics/tx_packets: 传输的数据包数量
- /sys/class/net/eth0/statistics/rx_bytes: 接收的字节数
- /sys/class/net/eth0/statistics/tx_bytes: 传输的字节数
- /sys/class/net/eth0/statistics/rx_dropped: 当收到包数据包下降的数据量
- /sys/class/net/eth0/statistics/tx_dropped: 传输包数据包下降的数据量
2.sar
sar命令包含在sysstat
工具包中,提供系统的众多统计数据。其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收发包的个数和流量。
3./proc/net/dev
本文使用的是第一种方法,即为通过读取/sys/class/net/eth0/statistics/xxx文件的内容,来进行计算,获取最终的网络带宽
脚本介绍
该脚本执行效果如下:
[root@VM_0_9_centos ~]# bash Network_Device_Monitor.sh
网卡 eth0 入口累计 75.2488 GiB,当前流量速率: 113.516 Kbps/s
网卡 eth0 出口累计 87.7656 GiB,当前流量速率: 6327.33 Kbps/s
网卡 eth0 入口累计 75.2488 GiB,当前流量格式化速率: 14.1895 KB/s
网卡 eth0 出口累计 87.7656 GiB,当前流量格式化速率: 790.916 KB/s
能够自动获取出口网卡名称,并根据出口网卡名称获取累计出入口流量以及当前流量速率/s。
本脚本不适宜在生产或已部署服务的服务器上运行,可能会因CPU&内存占用过高导致其他服务被系统杀死
脚本内容
#!/bin/bash
# 网卡出入流量统计
# Author: admin@lolicp.com
# Date: 2021-10-30
# Version: 0.0.1
默认流量出口网卡
========
Default_Network_Device_Name=`route -n|awk '/^0.0.0.0/ {print $8}'`
旧入口流量
=====
Old_Network_Ingress_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/rx_bytes`
旧出口流量
=====
Old_Network_Outlet_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/tx_bytes`
sleep 1
新入口流量
=====
New_Network_Ingress_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/rx_bytes`
新出口流量
=====
New_Network_Outlet_Flow_Sum=`awk '{print $1}' /sys/class/net/${Default_Network_Device_Name}/statistics/tx_bytes`
网卡入口流量字节速率
==========
Network_Ingress_Flow_Sum=`echo |awk "{print ${New_Network_Ingress_Flow_Sum}-${Old_Network_Ingress_Flow_Sum}}"`
网卡入口流量比特速率
==========
Network_Ingress_Flow_Sum_D=`echo |awk "{print (${New_Network_Ingress_Flow_Sum}-${Old_Network_Ingress_Flow_Sum})*8}"`
if \[ "${Network_Ingress_Flow_Sum_D}" -lt 10000 \];then
# 标准入口比特速率
Network_Ingress_Device_Flow_Sum=`echo|awk "{print ${Network_Ingress_Flow_Sum_D}}"`
# 标准入口字节速率
Network_Ingress_Device_Flow_Sum_D=`echo|awk "{print ${Network_Ingress_Flow_Sum}}"`
# 标准网络速率
Network_Ingress_Device_Flow_Type="bps"
# 标准硬盘速率
Network_Ingress_Device_Flow_Type_D="B"
elif \[ "${Network_Ingress_Flow_Sum_D}" -lt 10000000 \];then
# 标准入口比特速率
Network_Ingress_Device_Flow_Sum=`echo|awk "{print ${Network_Ingress_Flow_Sum_D}/1024}"`
# 标准入口字节速率
Network_Ingress_Device_Flow_Sum_D=`echo|awk "{print ${Network_Ingress_Flow_Sum}/1024}"`
# 标准网络速率
Network_Ingress_Device_Flow_Type="Kbps"
# 标准硬盘速率
Network_Ingress_Device_Flow_Type_D="KB"
elif \[ "${Network_Ingress_Flow_Sum_D}" -lt 10000000000 \];then
# 标准入口比特速率
Network_Ingress_Device_Flow_Sum=`echo|awk "{print ${Network_Ingress_Flow_Sum_D}/1024/1024}"`
# 标准入口字节速率
Network_Ingress_Device_Flow_Sum_D=`echo|awk "{print ${Network_Ingress_Flow_Sum}/1024/1024}"`
# 标准网络速率
Network_Ingress_Device_Flow_Type="Mbps"
# 标准硬盘速率
Network_Ingress_Device_Flow_Type_D="MB"
elif \[ "${Network_Ingress_Flow_Sum_D}" -lt 10000000000000 \];then
# 标准入口比特速率
Network_Ingress_Device_Flow_Sum=`echo|awk "{print ${Network_Ingress_Flow_Sum_D}/1024/1024/1024}"`
# 标准入口字节速率
Network_Ingress_Device_Flow_Sum_D=`echo|awk "{print ${Network_Ingress_Flow_Sum}/1024/1024/1024}"`
# 标准网络速率
Network_Ingress_Device_Flow_Type="Gbps"
# 标准硬盘速率
Network_Ingress_Device_Flow_Type_D="GB"
fi
网卡出口流量字节速率
==========
Network_Outlet_Flow_Sum=`echo |awk "{print ${New_Network_Outlet_Flow_Sum}-${Old_Network_Outlet_Flow_Sum}}"`
网卡出口流量比特速率
==========
Network_Outlet_Flow_Sum_D=`echo |awk "{print (${New_Network_Outlet_Flow_Sum}-${Old_Network_Outlet_Flow_Sum})*8}"`
if \[ "${Network_Outlet_Flow_Sum_D}" -lt 10000 \];then
# 标准出口比特速率
Network_Outlet_Device_Flow_Sum=`echo|awk "{printf \\"%.2F\\", ${Network_Outlet_Flow_Sum_D}}"`
# 标准出口字节速率
Network_Outlet_Device_Flow_Sum_D=`echo|awk "{printf \\"%.2F\\", ${Network_Outlet_Flow_Sum}}"`
# 标准网络速率
Network_Outlet_Device_Flow_Type="bps"
# 标准硬盘速率
Network_Outlet_Device_Flow_Type_D="B"
elif \[ "${Network_Outlet_Flow_Sum_D}" -lt 10000000 \];then
# 标准出口比特速率
Network_Outlet_Device_Flow_Sum=`echo|awk "{printf \\"%.2F\\", ${Network_Outlet_Flow_Sum_D}/1024}"`
# 标准出口字节速率
Network_Outlet_Device_Flow_Sum_D=`echo|awk "{printf \\"%.2F\\",${Network_Outlet_Flow_Sum}/1024}"`
# 标准网络速率
Network_Outlet_Device_Flow_Type="Kbps"
# 标准硬盘速率
Network_Outlet_Device_Flow_Type_D="KB"
elif \[ "${Network_Outlet_Flow_Sum_D}" -lt 10000000000 \];then
# 标准出口比特速率
Network_Outlet_Device_Flow_Sum=`echo|awk "{printf \\"%.2F\\", ${Network_Outlet_Flow_Sum_D}/1024/1024}"`
# 标准出口字节速率
Network_Outlet_Device_Flow_Sum_D=`echo|awk "{printf \\"%.2F\\",${Network_Outlet_Flow_Sum}/1024/1024}"`
# 标准网络速率
Network_Outlet_Device_Flow_Type="Mbps"
# 标准硬盘速率
Network_Outlet_Device_Flow_Type_D="MB"
elif \[ "${Network_Outlet_Flow_Sum_D}" -lt 10000000000000 \];then
# 标准出口比特速率
Network_Outlet_Device_Flow_Sum=`echo|awk "{printf \\"%.2F\\", ${Network_Outlet_Flow_Sum_D}/1024/1024/1024}"`
# 标准出口字节速率
Network_Outlet_Device_Flow_Sum_D=`echo|awk "{printf \\"%.2F\\", ${Network_Outlet_Flow_Sum}/1024/1024/1024}"`
# 标准网络速率
Network_Outlet_Device_Flow_Type="Gbps"
# 标准硬盘速率
Network_Outlet_Device_Flow_Type_D="GB"
fi
网卡入口总流量
=======
Cumulative_Traffic_Network_Entrance=`awk '{printf "%.2F", $1/1024/1024/1024}' /sys/class/net/${Default_Network_Device_Name}/statistics/rx_bytes`
网卡出口总流量
=======
`Cumulative_Network_Egress_Traffic=``awk '{printf "%.2F", $1/1024/1024/1024}' /sys/class/net/${Default_Network_Device_Name}/statistics/tx_bytes``
echo "网卡 ${Default_Network_Device_Name} 入口累计 ${Cumulative_Traffic_Network_Entrance} GiB,当前流量速率: ${Network_Ingress_Device_Flow_Sum} ${Network_Ingress_Device_Flow_Type}/s"
echo "网卡 ${Default_Network_Device_Name} 出口累计 ${Cumulative_Network_Egress_Traffic} GiB,当前流量速率: ${Network_Outlet_Device_Flow_Sum} ${Network_Outlet_Device_Flow_Type}/s"
echo |awk "{print "网卡 ${Default_Network_Device_Name} 入口累计 ${Cumulative_Traffic_Network_Entrance} GiB,当前流量格式化速率:",${Network_Ingress_Device_Flow_Sum_D},"${Network_Ingress_Device_Flow_Type_D}/s" }"
echo |awk "{print "网卡 ${Default_Network_Device_Name} 出口累计 ${Cumulative_Network_Egress_Traffic} GiB,当前流量格式化速率:",${Network_Outlet_Device_Flow_Sum_D},"${Network_Outlet_Device_Flow_Type_D}/s" }"`