Linux怎么统计某段时间内的带宽使用

答案是根据需求选择合适工具:长期趋势用vnstat,历史详细记录用sar,精确自定义统计则通过读取/proc/net/dev编写脚本实现,不同场景需分层处理以获得最佳效果。

Linux怎么统计某段时间内的带宽使用

在Linux上统计某段时间内的带宽使用,核心思路是利用系统提供的工具或接口,在时间段的起点和终点获取网络流量数据,然后计算差值。常用的方法包括使用

vnstat

进行长期数据收集,或者利用

sar

命令查询历史记录,更精细的自定义统计则可以借助读取

/proc/net/dev

文件来实现。

当我在Linux系统上需要了解某个特定时间段的带宽使用情况时,我通常会根据需求选择不同的工具。这不是一个“一招鲜吃遍天”的问题,因为实时监控、长期趋势分析和精确到秒级的自定义统计,它们各自有最适合的解决方案。

解决方案

对我而言,最直接且有效的策略是分层处理:

1. 长期趋势与聚合数据:

vnstat

如果我需要的是每日、每月或每小时的聚合流量数据,并且希望这些数据能够持久化,那么

vnstat

几乎是我的首选。它作为一个轻量级的守护进程,默默地在后台收集数据。

安装通常很简单:

  • Debian/Ubuntu:
    sudo apt install vnstat
  • CentOS/RHEL:
    sudo yum install vnstat

安装后,确保它正在运行并监控你的网络接口(例如

eth0

):

sudo vnstat --create -i eth0
sudo systemctl enable vnstat && sudo systemctl start vnstat

一旦

vnstat

运行了一段时间,你就可以查询特定时间段的数据了。

  • 查看今天和昨天的日流量:
    vnstat -d
  • 查看本月和上个月的月流量:
    vnstat -m
  • 查看过去24小时的每小时流量:
    vnstat -h

通过这些命令,我可以快速了解到某个特定日期或时间段的大致流量消耗。比如,我发现某天晚上网络特别慢,我就可以用

vnstat -h

看看那个小时的流量是不是异常高。

Linux怎么统计某段时间内的带宽使用

Magick

无代码ai工具,可以构建世界级的AI应用程序。

Linux怎么统计某段时间内的带宽使用99

查看详情 Linux怎么统计某段时间内的带宽使用

2. 历史详细记录与特定时间段查询:

sar

(System Activity Reporter)

sar

sysstat

工具包的一部分,它能记录非常详细的系统活动数据,包括网络接口的吞吐量。它的强大之处在于能够查询过去任意有记录的时间段。

sar

默认会把数据记录在

/var/log/sa/

目录下,文件名通常是

saXX

,其中

XX

是日期。 要查询今天上午9点到10点之间

eth0

接口的接收(rxkB/s)和发送(txkB/s)速率:

sar -n DEV -s 09:00:00 -e 10:00:00 -i 300

这里的

-n DEV

指定查看网络设备统计,

-s

-e

定义了时间段,

-i 300

表示每5分钟刷新一次,但对于历史数据查询,它会根据已有的日志记录来展示。

如果我想看昨天的同一时间段,就需要指定昨天的日志文件:

sar -f /var/log/sa/sa$(date -d 'yesterday' +%d) -n DEV -s 09:00:00 -e 10:00:00

这能让我追溯到某个特定故障发生前后的网络活动,对于故障排查非常有用。

3. 精确自定义时间段统计:

/proc/net/dev

与脚本 有时候,

vnstat

的聚合不够细致,

sar

的记录间隔又不是我想要的,或者我需要计算一个非常精确的、自定义持续时间内的总流量。这时,直接读取

/proc/net/dev

文件就成了唯一的选择。这个文件包含了所有网络接口的实时字节计数。

我通常会写一个简单的bash脚本来实现这个目的:

#!/bin/bash  INTERFACE="eth0" # 替换成你的网络接口,如 eth0, enp0s3, etc. DURATION_SECONDS=300 # 监控持续时间,单位秒 (这里是5分钟)  echo "开始监控 $INTERFACE 接口的带宽使用,持续 ${DURATION_SECONDS} 秒..."  # 获取初始字节计数 read -r _ _ RX_BYTES_START TX_BYTES_START _ < <(grep "$INTERFACE:" /proc/net/dev | awk '{print $2, $10}')  # 等待指定时间 sleep "$DURATION_SECONDS"  # 获取最终字节计数 read -r _ _ RX_BYTES_END TX_BYTES_END _ < <(grep "$INTERFACE:" /proc/net/dev | awk '{print $2, $10}')  # 计算差异 RX_DIFF=$((RX_BYTES_END - RX_BYTES_START)) TX_DIFF=$((TX_BYTES_END - TX_BYTES_START))  # 转换为MB并计算平均速率 (KB/s) TOTAL_RX_MB=$(echo "scale=2; $RX_DIFF / 1024 / 1024" | bc) TOTAL_TX_MB=$(echo "scale=2; $TX_DIFF / 1024 / 1024" | bc) AVG_RX_KBPS=$(echo "scale=2; $RX_DIFF / $DURATION_SECONDS / 1024" | bc) AVG_TX_KBPS=$(echo "scale=2; $TX_DIFF / $DURATION_SECONDS / 1024" | bc)  echo "-------------------------------------" echo "监控结束,持续时间:${DURATION_SECONDS} 秒" echo "$INTERFACE 接收总流量: ${TOTAL_RX_MB} MB" echo "$INTERFACE 发送总流量: ${TOTAL_TX_MB} MB" echo "$INTERFACE 平均接收速率: ${AVG_RX_KBPS} KB/s" echo "$INTERFACE 平均发送速率: ${AVG_TX_KBPS} KB/s" echo "-------------------------------------"

这个脚本非常灵活,我可以根据需要调整

INTERFACE

DURATION_SECONDS

,实现任意时间段的精确统计。这对于排查某个特定时间窗口内的瞬时网络问题,或者需要为某个任务计算精确带宽消耗时,非常管用。

如何选择合适的Linux带宽监控工具?

选择合适的Linux带宽监控工具,对我来说,从来都不是一个“哪个最好”的问题,而是“哪个最适合我当前的需求”。我发现,理解不同工具的侧重点,能帮助我更快地定位问题。

  • 你需要实时性还是历史数据?
    • 如果你只是想快速看一眼当前哪个进程或IP在消耗大量带宽,那么
      iftop

      nload

      这类实时工具是首选。它们提供即时、可视化的反馈,但一旦关闭,数据就消失了。

    • 如果你的目标是分析过去一小时、一天甚至一个月的趋势,或者需要追溯某个历史时刻的网络状况,那么
      vnstat

      sar

      或更高级的监控系统(如Prometheus结合Grafana)就显得

linux centos ubuntu 工具 linux系统 网络问题 bash date 接口 Interface var linux ubuntu debian prometheus grafana

上一篇
下一篇