[标签]: 流量监控 网卡流量监控 RX进入流量TX流出流量 iftop-nethogs-sar-ifconfig-dstat-watch等流量相关命令 statistics/rx_bytes文本文件、net/dev文本
问题详情的描述或方案目标的预期:
很多时候我们都需要对服务器上网络流量的使用情况进行监控和排查,或汇总、或定向查询某个IP、某个端口、进程的流量使用情况;当ECS服务器的网络带宽按量收费时,更是要做好相应的监控。
【解决方案】
基本单位换算
8bit(位)=1Byte(字节) *1024 =1KB *1024 =1MB *1024=1GB
方法1: 最爽又好看的watch+ifconfig [流量总体]
watch -n 1 "ifconfig eth0|egrep '[RT]X pack'"
watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。Linux下watch会周期性的执行定义的命令,并全屏显示执行结果。
方法2: sar命令 [流量总体]
sar –n DEV 1 999
命令后面1 2 意思是:每一秒钟取1次值,取999次。DEV显示网络接口信息.
另外,-n参数很有用,他有6个不同的开关:DEV | EDEV | NFS | NFSD | SOCK | ALL ,其代表的含义如下:
DEV显示网络接口信息。
EDEV显示关于网络错误的统计数据。
NFS统计活动的NFS客户端的信息。
NFSD统计NFS服务器的信息
SOCK显示套接字信息
ALL显示所有5个开关
sar命令包含在sysstat工具包中,提供系统的众多统计数据。其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收发包的个数和流量。
方法3: dstat -tn [流量总体]
yum install -y dstat 安装
[root@BLUBN-ALY-02 Tmp_ddup]# dstat -tn
----system---- -net/total-
time | recv send
23-07 14:35:11| 0 0
23-07 14:35:12| 60B 150B
23-07 14:35:13| 60B 342B
23-07 14:35:14| 60B 230B
23-07 14:35:15| 60B 230B
===========================>>相关补充:
eth0的网口上分析报告会输出到这些文件中:(不同的网卡目录是对对应的网卡名称)
/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: 传输包数据包下降的数据量
方法4: 通过监控 /proc/net/dev文本文件 //和方法3类似 [流量总体]
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:13661574714188 31346790620 0 0 0 0 0 0 5097461049535 27671144304 0 0 0 0 0 0
最左边的表示接口的名字,Receive表示收包,Transmit表示发送包;
bytes表示收发的字节数;packets表示收发正确的包量;errs表示收发错误的包量;drop表示收发丢弃的包量;
其实,我们平时经常用的很多查看网卡实时流量的命令,都是通过读取该文件并通过计算得到的。
Linux 内核提供了一种通过 /proc 文件系统,在运行时访问内核内部数据结构、改变内核设置的机制。proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系统内核读出所需信息并提交的。/proc文件系统中包含了很多目录,其中/proc/net/dev 保存了网络适配器及统计信息。
利用/proc/net/dev文件,写一个脚本实现流量监控的例子:
#!/bin/bash
# 利用/proc/net/dev文件,写一个脚本实现流量监控
# 修正时间: 2022年 08月 18日 星期四 15:32:18 CST
netcard_name=$1
while true
do
RX_pre=$(cat /proc/net/dev | grep $netcard_name | sed 's/:/ /g' | awk '{print $2}')
TX_pre=$(cat /proc/net/dev | grep $netcard_name | sed 's/:/ /g' | awk '{print $10}')
sleep 1
RX_next=$(cat /proc/net/dev | grep $netcard_name | sed 's/:/ /g' | awk '{print $2}')
TX_next=$(cat /proc/net/dev | grep $netcard_name | sed 's/:/ /g' | awk '{print $10}')
clear
echo -e "时间:$(date +%Y-%m-%d\ %H:%M:%S) \t 网卡:$netcard_name"
RX=$((${RX_next}-${RX_pre}))
TX=$((${TX_next}-${TX_pre}))
if [[ $RX -lt 1024 ]];then
RX="${RX}B/s"
elif [[ $RX -gt 1048576 ]];then
RX=$(echo $RX | awk '{print $1/1048576 "MB/s"}')
else
RX=$(echo $RX | awk '{print $1/1024 "KB/s"}')
fi
if [[ $TX -lt 1024 ]];then
TX="${TX}B/s"
elif [[ $TX -gt 1048576 ]];then
TX=$(echo $TX | awk '{print $1/1048576 "MB/s"}')
else
TX=$(echo $TX | awk '{print $1/1024 "KB/s"}')
fi
echo -e "流入流量_RX:$RX \t 流出流量_TX:$TX (计费)"
done
=================================================
方法5: iftop -P [流量定向排查--端口/ip] (最常用)
显示的刷屏和top命令类似
显屏快捷键:N--端口和名字切换SsDd--本地端口、主机信息、远端端口、主机信息;t--切换只显示入流量、出流量、双向流量;T--该条目的流量总计;P--暂停刷新;1/2/3--根据右侧流量排序;l--屏幕搜索
方法6: nethogs eth0 -d 1 [流量定向排查--PID/程序/用户/端口] (最常用)
nethogs ;nethogs eth0指定网卡 ; nethogs eth0 -d 5每5秒刷新
显示的刷屏和top命令类似
显屏快捷键:按s可以按照Sent列进行排序,按r可以按照Received列进行排序,按m可以切换不同的统计单位显示,例如kb/s、kb、b、mb
网络相关命令总括:
监控总体带宽使用――nload、bmon、slurm、bwm-ng、cbm、speedometer和netload
监控总体带宽使用(批量式输出)――vnstat、ifstat、dstat和collectl
每个套接字连接的带宽使用――iftop、iptraf、tcptrack、pktstat、netwatch和trafshow
每个进程的带宽使用――iftop、nethogs
总结: 简单而有效的方法才能写出最好的shell.