在 CentOS 系统中,Linux 内核本身并不默认记录历史网络流量使用记录(如按小时/天的流量统计),它只提供实时或自系统启动以来的累计流量计数(通过 /proc/net/dev 或 ethtool 等)。因此,“查询流量使用记录”需分两种情况理解:
✅ 一、查看当前实时/累计流量(自启动以来)
这是内核原生支持的方式,无需额外安装:
1. 使用 cat /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: 123456789 123456 0 0 0 0 0 0 987654321 987654 0 0 0 0 0 0
bytes列即为总接收/发送字节数(B),可换算为 MB/GB。- 注意:这是自系统上次启动以来的累计值,不是历史记录。
2. 使用 ip -s link(推荐,更清晰)
ip -s link show eth0 # 替换 eth0 为你的网卡名(可用 ip link show 查看)
输出包含 RX(接收)和 TX(发送)的 bytes、packets 等累计统计。
3. 实时监控工具(非记录,但可观测)
# 安装 iftop(实时带宽占用)
sudo yum install -y iftop
sudo iftop -P # 按端口显示;-P 显示端口
# 或 nethogs(按进程显示)
sudo yum install -y nethogs
sudo nethogs eth0
# 或使用 ss + watch(简单轮询)
watch -n 1 'cat /proc/net/dev | grep eth0'
⚠️ 这些工具不保存历史数据,关闭后即丢失。
✅ 二、实现真正的历史流量记录(按时间维度)
需借助第三方工具进行持续采集与存储:
✅ 推荐方案:vnstat(轻量、专为流量统计设计)
✅ 支持按小时/天/月统计,后台守护进程自动记录,低开销,CentOS 原生仓库可用。
安装与配置(CentOS 7/8):
# CentOS 7
sudo yum install -y epel-release
sudo yum install -y vnstat
# CentOS 8/9(使用 dnf)
sudo dnf install -y epel-release
sudo dnf install -y vnstat
# 初始化数据库(指定网卡,如 eth0 或 ens33)
sudo vnstat -u -i eth0
# 启动并设置开机自启
sudo systemctl enable vnstat
sudo systemctl start vnstat
查询历史记录:
vnstat # 总览(日/月)
vnstat -d # 按天统计(最近 30 天)
vnstat -h # 按小时统计(最近 24 小时)
vnstat -m # 按月统计
vnstat -t # 实时速率(类似 iftop,但基于采样)
vnstat --oneline # 简洁单行输出(适合脚本)
✅ 输出示例(vnstat -d):
Day RX TX Total Avg. rate
2024-05-01 2.13 GiB 1.05 GiB 3.18 GiB 1.22 Mbit/s
2024-05-02 3.45 GiB 1.89 GiB 5.34 GiB 2.05 Mbit/s
💡
vnstat本质是定期(默认每5分钟)读取/proc/net/dev并计算差值,写入 SQLite 数据库(默认/var/lib/vnstat/),因此真正实现了“历史记录”功能。
🔁 其他可选方案(进阶场景):
| 工具 | 特点 | 适用场景 |
|---|---|---|
ntopng |
Web 界面,深度协议分析、实时+历史、支持导出 | 需要图形化、多用户、审计级需求(资源消耗较高) |
darkstat |
轻量 Web 统计,内置 HTTP 服务 | 简单局域网流量分析(无认证,慎用于公网) |
Netdata |
实时监控平台,含流量图表+告警+历史(内存占用略高) | 需要统一监控服务器健康状态 |
| 自定义脚本 + cron + 日志 | 用 awk 解析 /proc/net/dev,定时记录到文件 |
极简需求,无额外依赖 |
示例脚本(每5分钟记录一次):
#!/bin/bash IFACE="eth0" TS=$(date '+%Y-%m-%d %H:%M:%S') RX=$(awk -v iface="$IFACE" '$1 ~ iface":" {print $2}' /proc/net/dev) TX=$(awk -v iface="$IFACE" '$1 ~ iface":" {print $10}' /proc/net/dev) echo "$TS,$RX,$TX" >> /var/log/traffic.log(需配合
cron和日志轮转,不如vnstat可靠)
❌ 不推荐/无效方法:
iftop -t(仅输出当前快照,不记录历史)netstat(无流量统计功能)sar -n DEV(来自sysstat包)→ ⚠️ 注意:sar默认不记录网络流量!
sar -n DEV 1 3只能实时采样,且sysstat的网络统计需开启SA1_OPTIONS="-S ALL"并配置*/10 * * * * root /usr/lib64/sa/sa1 1 1才可能记录(但实际 CentOS 中sar -n DEV通常只记录接口 up/down 状态,不记录 bytes 流量,不可靠)。
✅ 总结建议:
| 需求 | 推荐方案 |
|---|---|
| ✅ 快速查看当前/累计流量 | cat /proc/net/dev 或 ip -s link |
| ✅ 实时监控(谁在用网) | iftop / nethogs |
| ✅ 长期、可靠的历史流量记录(小时/天/月) | ✅ vnstat(首选) |
| ✅ 企业级可视化+告警 | Netdata 或 ntopng |
如需进一步帮助(例如:
🔹 如何为多网卡配置 vnstat?
🔹 如何导出 vnstat 数据为 CSV?
🔹 如何排查 vnstat 数据为空?
🔹 CentOS Stream 9 的适配说明?),欢迎继续提问!
云小栈