引入
国外的云主机厂商,例如AWS提供的网络数据是以流量为单位的,例如下面的图片:
从上图来看,其取值方式为
每隔5分钟取值1次,(每次)每个点显示为1分钟内的流量字节数(Bytes)
带宽与流量
我们从上图随便取个点来计算下:
带宽=单位时间内流量*8/时间段/1024/1024(Mbps)
AWS network in 619581409 对应得带宽为 78.8 Mbps
AWS network out 421092676 对应得带宽为 53.5Mbps
想图个省事,可以直接删掉AWS流量的后面7位数字,就可以得到带宽(Mbps)(误差稍有点大)
Linux中的网络数据提取
在Linux系统中我们可以从/proc 目录里来获取相应的数据并进行处理。
让我们来看下网络相关的/proc/net/dev
cat/proc/net/dev
Inter-|Receive|Transmit
face|bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
eth0:313568232649602558303341870000000227503770878768476857419543000000
lo:44090577055122430000004409057705512243000000
这个文件是本机所有网卡的数据记录。
从标题可以看出,第一列是网卡名称,第二列是入方向字节数(流量),第三列是入方向数据包数量,第四列是入方向错误包数,第10列是出方向字节数(流量)
脚本计算带宽和流量
有了数据,我们就可以写个shell脚本来获取带宽和流量数据了
脚本getnettraffic.sh
#!/bin/bash
DATE1=`date --utc`
RX1=`cat /proc/net/dev | grep eth0 |awk '{print $2}'`
TX1=`cat /proc/net/dev | grep eth0 |awk '{print $10}'`
sleep60
DATE2=`date --utc`
RX2=`cat /proc/net/dev | grep eth0 |awk '{print $2}'`
TX2=`cat /proc/net/dev | grep eth0 |awk '{print $10}'`
RX=$(($RX2-$RX1))
TX=$(($TX2-$TX1))
RXBAND=$(($RX*8/60/1024/1024))
TXBAND=$(($TX*8/60/1024/1024))
echo"time Range $DATE1 - $DATE2"
echo"Network In Bytes: $RX Bytes"
echo"Network Out Bytes: $TX Bytes"
echo"Network In BW: $RXBAND Mbps"
echo"Network Out BW: $TXBAND Mbps"
执行结果:
timeRangeThuJun405:38:06UTC2015-ThuJun405:39:06UTC2015
NetworkInBytes:628578266Bytes
NetworkOutBytes:465529561Bytes
NetworkInBW:79Mbps
NetworkOutBW:59Mbps
扩展
我们已经知道 /proc/net/dev 这个文件存储了主机上的网络数据。但如果我想看某个进程的网络数据怎么办?
同样的Linux也提供了 /proc/$PID/net/dev 这个文件来记录进程的网络数据。
如果主机上运行了虚拟机或者docker容器,也可以使用这种方法来获取网络数据。