Ubuntu 16.04 LTS如何查看上月互联网流量(排除本地及Docker交互)
从你的接口列表来看,ens32、ens33是物理网卡(大概率对应互联网/外部网络),而lo、docker0、br-*、veth-*都是本地或Docker相关的内部接口,这些产生的流量不需要统计。下面分两种常用方法帮你获取历史流量数据:
方法一:用sar(系统默认可能已记录历史数据)
sysstat工具包中的sar是Linux自带的系统活动报告工具,默认会按天记录网络流量数据,非常适合回溯历史统计。
步骤1:确认sysstat是否安装并启用
先检查是否安装:
dpkg -l | grep sysstat
如果没安装,执行:
sudo apt-get update && sudo apt-get install sysstat
然后确认历史记录是否开启:
编辑/etc/default/sysstat,将ENABLED="false"改为ENABLED="true",保存后重启服务:
sudo service sysstat restart
(如果之前已经启用,这一步可以跳过)
步骤2:查看单天的流量数据
sysstat的历史数据存在/var/log/sysstat/目录下,文件名格式为saXX(XX是日期,比如sa15代表15号的数据)。
查看某一天ens32的流量统计:
sar -n DEV -f /var/log/sysstat/sa15 | grep -E 'Average|ens32'
输出中的rxkB/s是平均每秒接收流量,txkB/s是平均每秒发送流量。要计算当天总流量,用平均值乘以86400秒(一天的秒数)即可,比如:
- 总接收流量 =
rxkB/s平均值 × 86400 KB = 转换为GB的话再除以1024×1024
步骤3:汇总过去一个月的流量
如果要批量统计过去30天的流量,可以用循环脚本遍历所有saXX文件,自动计算总和:
total_rx=0 total_tx=0 for file in /var/log/sysstat/sa[0-9][0-9]; do # 提取当天ens32和ens33的平均rx/tx速率 result=$(sar -n DEV -f "$file" | awk '/ens32|ens33/ {rx += $5; tx += $6} END {print rx, tx}') # 拆分结果为rx和tx rx_avg=$(echo "$result" | cut -d' ' -f1) tx_avg=$(echo "$result" | cut -d' ' -f2) # 计算当天总流量(KB)并累加 total_rx=$((total_rx + rx_avg * 86400)) total_tx=$((total_tx + tx_avg * 86400)) done # 转换为更易读的GB单位 echo "过去一个月总接收流量:$(echo "scale=2; $total_rx / 1024 / 1024" | bc) GB" echo "过去一个月总发送流量:$(echo "scale=2; $total_tx / 1024 / 1024" | bc) GB"
注意:如果你的物理网卡不是ens32/ens33,可以先通过ip route show default确认默认网关对应的接口(这就是你的互联网出口接口)。
方法二:用vnstat(更直观,但需提前配置)
vnstat是一个轻量级的网络流量监控工具,会按天/月统计流量,但只有从安装配置后才会开始记录数据,如果之前没装,无法回溯过去一个月的历史数据,适合长期监控。
步骤1:安装并配置vnstat
sudo apt-get install vnstat
配置监控你的互联网接口(比如ens32):
sudo vnstat -u -i ens32 sudo vnstat -u -i ens33
步骤2:查看月度统计
查看ens32的月度流量:
vnstat -m -i ens32
输出会清晰显示每个月的接收/发送总流量,非常直观。
关键说明:为什么排除那些接口?
lo:本地回环接口,仅用于主机内部进程间通信,完全不涉及外部网络docker0/br-*:Docker的桥接网络,用于容器与主机、容器之间的内部通信veth-*:Docker容器的虚拟网卡,流量仅在主机内部流转,不属于互联网流量
内容的提问来源于stack exchange,提问作者Vasily

