系统监控工具指南 / 第7章:nload与vnstat
第7章:nload与vnstat
7.1 概述
工具定位
| 工具 | 定位 | 特点 |
|---|---|---|
| nload | 实时带宽监控 | 图形化显示、直观 |
| vnstat | 历史带宽统计 | 持久化存储、低资源消耗 |
为什么需要这两个工具
- nload - 实时查看带宽使用情况,图形化显示
- vnstat - 长期记录带宽数据,支持按小时/天/月统计
与其他网络工具对比
| 特性 | nload | vnstat | iftop | bmon |
|---|---|---|---|---|
| 实时图形 | ✓ | ✗ | ✗ | ✓ |
| 历史数据 | ✗ | ✓ | ✗ | ✗ |
| 连接级别 | ✗ | ✗ | ✓ | ✗ |
| 资源消耗 | 低 | 极低 | 低 | 低 |
| 持久化 | ✗ | ✓ | ✗ | ✗ |
7.2 nload详解
7.2.1 安装
# Debian/Ubuntu
sudo apt update
sudo apt install nload
# CentOS/RHEL
sudo yum install epel-release
sudo yum install nload
# Fedora
sudo dnf install nload
# Arch Linux
sudo pacman -S nload
# macOS
brew install nload
7.2.2 基本使用
# 监控默认接口
nload
# 监控指定接口
nload eth0
# 监控多个接口
nload eth0 eth1
# 监控所有接口
nload -m
7.2.3 界面解读
Device eth0 [192.168.1.100] (1/2):
======================================================================
Incoming:
curr: 1.25 MBit/s
avg: 1.10 MBit/s
min: 0.50 MBit/s
max: 2.30 MBit/s
Ttl: 123.45 MByte
Outgoing:
curr: 456.00 kBit/s
avg: 400.00 kBit/s
min: 100.00 kBit/s
max: 789.00 kBit/s
Ttl: 45.67 MByte
界面元素:
| 元素 | 含义 |
|---|---|
| Device | 网络接口名称和IP |
| Incoming | 入站流量(下载) |
| Outgoing | 出站流量(上传) |
| curr | 当前速率 |
| avg | 平均速率 |
| min | 最小速率 |
| max | 最大速率 |
| Ttl | 总流量 |
7.2.4 图形解读
入站流量图形:
│
┌───────┤
│ ████ │
│ ████ │
────────┤ ████ ├────────
│ ████ │
└───────┤
│
- 柱状图 - 显示当前流量
- 刻度 - 动态调整的带宽刻度
- 颜色 - 绿色表示入站,红色表示出站
7.2.5 命令行参数
# 常用参数
nload -a <seconds> # 平均窗口大小(秒)
nload -i <max> # 入站最大带宽(kBit/s)
nload -o <max> # 出站最大带宽(kBit/s)
nload -t <interval> # 刷新间隔(毫秒)
nload -u <unit> # 显示单位
nload -U <unit> # 总流量单位
nload -m # 合并显示所有接口
nload devices eth0 # 指定接口
单位选项:
| 参数 | 单位 |
|---|---|
-u h | 自动(默认) |
-u b | Bit/s |
-u k | kBit/s |
-u m | MBit/s |
-u g | GBit/s |
7.2.6 交互命令
| 按键 | 功能 |
|---|---|
↑ / ↓ | 切换接口 |
← / → | 调整刻度 |
r | 重置统计 |
q | 退出 |
F2 | 显示帮助 |
7.2.7 高级用法
自定义带宽范围:
# 假设带宽为100Mbps
nload -i 100000 -o 100000 eth0
# 假设带宽为1Gbps
nload -i 1000000 -o 1000000 eth0
脚本化输出:
# 使用tshark或tcpdump配合
nload -t 1000 eth0 > /dev/null &
# 获取当前流量
nload -t 1 eth0 | grep "curr:"
监控脚本:
#!/bin/bash
# nload_monitor.sh
INTERFACE=${1:-eth0}
LOG_FILE="/tmp/nload_${INTERFACE}.log"
while true; do
# 获取流量数据
DATA=$(nload -t 1 $INTERFACE 2>/dev/null | grep "curr:" | awk '{print $2, $3}')
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "$TIMESTAMP $DATA" >> $LOG_FILE
sleep 1
done
7.2.8 性能开销
| 场景 | CPU占用 | 内存占用 |
|---|---|---|
| 默认设置 | <0.5% | ~5MB |
| 高频刷新 | <1% | ~5MB |
| 多接口 | <1% | ~10MB |
7.3 vnstat详解
7.3.1 安装
# Debian/Ubuntu
sudo apt update
sudo apt install vnstat
# CentOS/RHEL
sudo yum install epel-release
sudo yum install vnstat
# Fedora
sudo dnf install vnstat
# Arch Linux
sudo pacman -S vnstat
# macOS
brew install vnstat
7.3.2 服务管理
# 启动服务
sudo systemctl start vnstat
# 设置开机自启
sudo systemctl enable vnstat
# 查看服务状态
sudo systemctl status vnstat
# 停止服务
sudo systemctl stop vnstat
7.3.3 数据库初始化
# 首次运行需要初始化数据库
sudo vnstat -u -i eth0
# 检查数据库
ls -la /var/lib/vnstat/
# 修复数据库
sudo vnstat --repair
7.3.4 基本使用
# 查看默认接口统计
vnstat
# 查看指定接口
vnstat -i eth0
# 查看所有接口
vnstat -a
7.3.5 输出解读
月度统计:
Database updated: 2026-05-10 14:30:00
eth0 since 2026-01-01
rx: 123.45 GiB tx: 45.67 GiB total: 169.12 GiB
monthly
rx | tx | total | avg. rate
------------------------+-------------+-------------+---------------
2026-05 12.34 GiB | 4.56 GiB | 16.90 GiB | 5.23 Mbit/s
2026-04 45.67 GiB | 12.34 GiB | 58.01 GiB | 1.87 Mbit/s
2026-03 34.56 GiB | 9.87 GiB | 44.43 GiB | 1.43 Mbit/s
------------------------+-------------+-------------+---------------
total 92.57 GiB | 26.77 GiB | 119.34 GiB |
每日统计:
vnstat -d
小时统计:
vnstat -h
实时统计:
vnstat -l
7.3.6 统计选项
| 选项 | 功能 |
|---|---|
-d | 每日统计 |
-m | 月度统计 |
-w | 周度统计 |
-h | 小时统计 |
-l | 实时统计 |
-t | 顶部统计 |
-s | 短格式 |
-5 | 5分钟统计 |
7.3.7 输出格式
# JSON格式
vnstat --json
# XML格式
vnstat --xml
# 文本格式
vnstat --text
# 图形化(需要vnstati)
vnstat -i eth0 -hg
7.3.8 vnstati图形化
安装vnstati:
# Debian/Ubuntu
sudo apt install vnstati
# CentOS/RHEL
sudo yum install vnstati
生成图片:
# 生成小时统计图
vnstati -h -o /tmp/vnstat_hourly.png
# 生成每日统计图
vnstati -d -o /tmp/vnstat_daily.png
# 生成月度统计图
vnstati -m -o /tmp/vnstat_monthly.png
# 生成汇总图
vnstati -s -o /tmp/vnstat_summary.png
# 生成流量图
vnstati -hg -o /tmp/vnstat_graph.png
# 生成5分钟统计图
vnstati -5 -o /tmp/vnstat_5min.png
7.3.9 配置文件
主配置文件:
/etc/vnstat.conf
配置示例:
# 接口
Interface "eth0"
# 数据库目录
DatabaseDir "/var/lib/vnstat"
# 日志目录
LogFile "/var/log/vnstat/vnstat.log"
# 刷新间隔(秒)
UpdateInterval 30
# 数据库轮转
BootVariation 15
# 流量单位
RateUnit 1
# 默认输出格式
OutputStyle 3
# 带宽限制
BandwidthDetection 1
MaxBandwidth 1000
# 数据保留
MonthRotate 1
配置选项详解:
| 选项 | 默认值 | 说明 |
|---|---|---|
| UpdateInterval | 30 | 数据更新间隔(秒) |
| PollInterval | 5 | 轮询间隔(秒) |
| RateUnit | 1 | 0=bytes, 1=bits |
| OutputStyle | 0 | 0=简约, 1=经典, 2=彩色, 3=彩色经典 |
| MonthRotate | 1 | 月度轮转日期 |
| MaxBandwidth | 1000 | 最大带宽(Mbit/s) |
7.3.10 数据管理
删除接口数据:
# 删除指定接口
sudo vnstat --delete -i eth0
# 清空所有数据
sudo vnstat --delete -i eth0 --force
备份数据:
# 备份数据库
sudo cp -r /var/lib/vnstat /backup/vnstat_$(date +%Y%m%d)
# 恢复数据库
sudo cp -r /backup/vnstat_20260510/* /var/lib/vnstat/
修改数据:
# 设置特定日期的流量
sudo vnstat -i eth0 --setconfig -t "2026-05-01 100000 50000"
7.3.11 告警设置
基于带宽的告警脚本:
#!/bin/bash
# vnstat_alert.sh
INTERFACE=${1:-eth0}
THRESHOLD_MB=${2:-1000} # 1GB阈值
# 获取今日流量(字节)
TODAY_RX=$(vnstat -i $INTERFACE --json | jq '.interfaces[0].traffic.day[0].rx')
TODAY_TX=$(vnstat -i $INTERFACE --json | jq '.interfaces[0].traffic.day[0].tx')
TOTAL=$((TODAY_RX + TODAY_TX))
TOTAL_MB=$((TOTAL / 1024 / 1024))
if [ $TOTAL_MB -gt $THRESHOLD_MB ]; then
echo "警告: $INTERFACE 今日流量已达 ${TOTAL_MB}MB,超过阈值 ${THRESHOLD_MB}MB"
# 发送告警
# mail -s "流量告警" admin@example.com <<< "今日流量: ${TOTAL_MB}MB"
fi
定期检查cron:
# 编辑crontab
crontab -e
# 每小时检查一次
0 * * * * /path/to/vnstat_alert.sh eth0 1000
7.4 带宽监控方案
7.4.1 实时监控方案
方案1:nload + 终端
# 直接运行
nload eth0
# 适合临时查看
方案2:nload + tmux
# 在tmux会话中运行
tmux new-session -d -s monitor 'nload eth0'
tmux attach -t monitor
方案3:nload + SSH
# 远程监控
ssh user@server nload eth0
7.4.2 历史监控方案
方案1:vnstat + vnstati
# 记录数据
sudo systemctl enable vnstat
# 定期生成图片
vnstati -d -o /var/www/html/vnstat_daily.png
方案2:vnstat + 自定义脚本
#!/bin/bash
# vnstat_report.sh
# 生成报告
vnstat -i eth0 > /var/log/vnstat/report_$(date +%Y%m%d).txt
# 生成CSV
vnstat -i eth0 --json > /var/log/vnstat/report_$(date +%Y%m%d).json
7.4.3 综合监控方案
组合使用:
# 实时监控
tmux new-session -d -s nload 'nload eth0'
# 历史记录
sudo systemctl enable vnstat
# 定期报告
crontab -e
# 0 0 * * * vnstat_report.sh
7.5 实战场景
场景1:服务器带宽监控
需求:监控服务器的带宽使用情况
# 1. 安装工具
sudo apt install nload vnstat vnstati
# 2. 启动vnstat服务
sudo systemctl enable --now vnstat
# 3. 实时监控
nload eth0
# 4. 查看历史
vnstat -d # 每日
vnstat -m # 每月
场景2:带宽异常排查
问题:带宽突然跑满
# 1. 实时查看流量
nload eth0
# 2. 找出流量来源
iftop -i eth0 -n
# 3. 查看历史趋势
vnstat -h
# 4. 分析是否有异常高峰
vnstati -h -o /tmp/hourly.png
场景3:流量统计报告
需求:生成月度流量报告
# 1. 生成报告
vnstat -m > /tmp/monthly_report.txt
# 2. 生成图形
vnstati -m -o /tmp/monthly_graph.png
# 3. 生成JSON(可导入其他系统)
vnstat -m --json > /tmp/monthly.json
场景4:多接口监控
需求:监控多个网络接口
# 1. 查看所有接口
vnstat -a
# 2. 实时监控多个接口
nload -m
# 3. 分别监控
nload eth0
# Ctrl+C
nload eth1
场景5:带宽计费
需求:统计流量用于计费
# 1. 查看月度流量
vnstat -m
# 2. 获取精确数据
vnstat -m --json | jq '.interfaces[0].traffic.month[0]'
# 3. 计算费用
# 流量(GB)* 单价
场景6:带宽告警
需求:流量超过阈值时告警
#!/bin/bash
# bandwidth_alert.sh
INTERFACE="eth0"
THRESHOLD_GB=100 # 100GB阈值
# 获取本月流量(GB)
MONTHLY=$(vnstat -i $INTERFACE -m --json | jq '.interfaces[0].traffic.month[0].rx + .interfaces[0].traffic.month[0].tx')
MONTHLY_GB=$(echo "$MONTHLY / 1073741824" | bc)
if [ $MONTHLY_GB -gt $THRESHOLD_GB ]; then
echo "警告: $INTERFACE 本月流量已达 ${MONTHLY_GB}GB"
# 发送告警
# mail -s "流量告警" admin@example.com <<< "本月流量: ${MONTHLY_GB}GB"
fi
7.6 高级配置
7.6.1 nload高级配置
自定义颜色:
# nload不支持颜色配置
# 但可以通过终端设置
export TERM=xterm-256color
nload eth0
自定义刷新:
# 每秒刷新
nload -t 1000 eth0
# 每2秒刷新
nload -t 2000 eth0
7.6.2 vnstat高级配置
多接口配置:
# /etc/vnstat.conf
Interface "eth0"
Interface "eth1"
自定义单位:
# 以bits显示
RateUnit 1
# 以bytes显示
RateUnit 0
数据保留策略:
# 保留多少个月的数据
# 默认24个月
7.7 故障排查
问题1:nload显示为0
# 检查接口是否有流量
ping 8.8.8.8
# 检查接口状态
ip link show eth0
# 检查nload指定的接口是否正确
nload -m # 查看所有接口
问题2:vnstat没有数据
# 检查服务状态
sudo systemctl status vnstat
# 初始化数据库
sudo vnstat -u -i eth0
# 检查权限
ls -la /var/lib/vnstat/
问题3:vnstat数据不准确
# 重置数据
sudo vnstat --delete -i eth0
sudo vnstat -u -i eth0
# 检查是否有其他流量计数器
iptables -L -v
问题4:nload图形异常
# 检查终端支持
echo $TERM
# 调整窗口大小
# nload需要足够的终端宽度
# 使用更简单的终端
TERM=xterm nload eth0
7.8 性能优化
7.8.1 nload优化
# 降低刷新频率
nload -t 5000 eth0 # 5秒刷新
# 减少带宽计算
nload -a 10 eth0 # 10秒平均窗口
7.8.2 vnstat优化
# 调整更新间隔
sudo nano /etc/vnstat.conf
# 增大更新间隔
UpdateInterval 60 # 60秒
# 减少轮询频率
PollInterval 10 # 10秒
7.9 与其他工具集成
7.9.1 nload + Prometheus
# 使用textfile collector
#!/bin/bash
# /var/lib/node_exporter/textfile_collector/network_stats.prom
# 获取流量数据
RX=$(cat /sys/class/net/eth0/statistics/rx_bytes)
TX=$(cat /sys/class/net/eth0/statistics/tx_bytes)
echo "# HELP node_network_receive_bytes Total bytes received"
echo "# TYPE node_network_receive_bytes counter"
echo "node_network_receive_bytes{device=\"eth0\"} $RX"
echo "# HELP node_network_transmit_bytes Total bytes transmitted"
echo "# TYPE node_network_transmit_bytes counter"
echo "node_network_transmit_bytes{device=\"eth0\"} $TX"
7.9.2 vnstat + Grafana
# 导出JSON
vnstat -i eth0 --json > /var/lib/grafana/vnstat.json
# 使用InfluxDB
# 需要额外脚本将数据导入InfluxDB
7.9.3 vnstat + Web界面
# 使用vnStat PHP frontend
git clone https://github.com/vberber/vnstat-php-frontend.git
cd vnstat-php-frontend
cp config.php.example config.php
# 修改配置
nano config.php
# 设置接口和数据库路径
# 部署到Web服务器
cp -r * /var/www/html/vnstat/
7.10 扩展阅读
7.11 快速参考
nload快速参考
# 基本用法
nload eth0 # 监控指定接口
nload -m # 合并所有接口
nload -t 1000 eth0 # 每秒刷新
# 带宽设置
nload -i 100000 -o 100000 eth0 # 100Mbps
# 单位设置
nload -u k eth0 # kBit/s
nload -u m eth0 # MBit/s
# 交互键
↑/↓ 切换接口
q 退出
vnstat快速参考
# 基本用法
vnstat # 默认接口统计
vnstat -i eth0 # 指定接口
vnstat -a # 所有接口
# 时间统计
vnstat -h # 小时
vnstat -d # 每日
vnstat -m # 月度
vnstat -w # 周度
vnstat -l # 实时
# 输出格式
vnstat --json # JSON
vnstat --xml # XML
# 图形化
vnstati -d -o out.png # 每日图
vnstati -m -o out.png # 月度图
vnstati -s -o out.png # 汇总图
# 管理
sudo vnstat -u -i eth0 # 初始化
sudo vnstat --delete -i eth0 # 删除
sudo vnstat --repair # 修复
7.12 本章小结
本章详细介绍了nload和vnstat的使用:
nload - 实时带宽监控
- 图形化显示
- 多接口支持
- 交互式操作
vnstat - 历史带宽统计
- 持久化存储
- 多维度统计
- 图形化输出
监控方案:
- 实时监控:nload
- 历史记录:vnstat
- 综合方案:nload + vnstat
实战场景:
- 带宽监控
- 流量统计
- 异常排查
- 计费统计
nload适合实时查看,vnstat适合长期记录,两者结合使用效果最佳。
上一章: 第6章:iftop详解 下一章: 第8章:vmstat/iostat/SAR