很多 VPS 套餐都会写“1TB 月流量”“3TB 带宽包”“超过后限速”或“不限流量”。问题是:商家面板里的统计经常有延迟,你真正发现超额时,可能已经被限速、停机,或者产生额外账单。
如果你只是想知道“1Mbps 够不够用”,可以先看站内的 VPS 带宽和流量计算指南。如果你已经在跑网站、代理、下载、对象存储同步、监控面板、n8n、Dify 或 API 网关,这篇更适合你:它解决的是“怎么每天自动知道用了多少流量,以及什么时候该停手”。
很多新手会把带宽和流量混在一起:
| 你看到的指标 | 代表什么 | 最适合用什么工具 |
|---|---|---|
| 当前上传/下载速度 | 现在每秒跑多少数据 | nload |
| 哪个连接正在吃流量 | 哪个 IP 或连接最活跃 | iftop |
| 今天、本月累计用了多少 | 会不会接近套餐上限 | vnStat |
| 应用、CPU、磁盘、服务状态 | 整体可观测性 | Prometheus / Grafana |
站内已经有 Prometheus + Grafana 监控告警方案,那是更完整的专业监控。本文推荐的是更轻量的做法:先把月流量看清楚,再决定要不要上大系统。
我的建议很简单:
- 所有 VPS 都安装
vnStat,长期记录每日和每月流量。 - 怀疑流量突然变大时,用
nload看实时速度。 - 还不确定是谁在跑流量时,用
iftop找连接来源。 - 对月流量设置 80% 和 90% 两级告警。
- 如果是按量计费云服务器,再配合预算告警和封顶策略。
这样做的好处是成本低、资源占用小、排查路径清晰。1 核 512MB 的小鸡也能跑,不需要为了看流量再部署一套大型监控。
先看你的公网网卡叫什么:
ip -br addr
常见结果可能是:
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 203.0.113.10/24
ens3 UP 203.0.113.10/24
后面示例假设网卡是 eth0。如果你的机器显示 ens3、enp1s0 或其他名称,把命令里的 eth0 换掉即可。
Debian / Ubuntu:
sudo apt update
sudo apt install -y vnstat
sudo systemctl enable --now vnstat
AlmaLinux / Rocky Linux / Fedora:
sudo dnf install -y vnstat
sudo systemctl enable --now vnstat
初始化后查看:
vnstat -i eth0
vnstat -d -i eth0
vnstat -m -i eth0
你会看到类似结果:
rx / tx / total
1.12 TiB / 340 GiB / 1.45 TiB
这里要注意两个细节:
rx是入站流量,tx是出站流量;不同商家的计费口径不同,有的只算出站,有的双向都算。- 刚安装
vnStat时没有历史数据,通常要等几分钟到几小时才有稳定统计。
如果你的套餐是 3TB 月流量,建议自己按更保守的方式计算:把入站和出站都加起来看。这样即便商家口径更宽松,你也不会低估风险。
安装:
sudo apt install -y nload
运行:
nload eth0
它会显示当前 incoming/outgoing 速度。适合回答这类问题:
- 网站是不是正在被爬虫刷?
- 备份任务是不是还在上传?
- 某个 Docker 容器是不是在疯狂同步?
- 代理或下载服务是不是跑满了出口?
如果你只是看到本月流量异常,但当前 nload 没有明显速度,说明问题可能已经过去,需要去查日志、定时任务或历史备份记录。
安装:
sudo apt install -y iftop
运行时建议加 -n,避免 DNS 反查拖慢界面:
sudo iftop -n -i eth0
你会看到当前连接里哪些 IP 上传/下载最多。常见判断:
- 大量陌生 IP 访问 80/443:可能是爬虫、CC、热链或接口被刷。
- 单个内网/对象存储地址流量很高:可能是备份、同步或镜像拉取。
- 某个海外 IP 长时间占用出口:检查是否有代理、下载、转码或 AI 模型拉取任务。
如果你发现是网站被打,可以参考 VPS 网站被 CC 攻击怎么办。如果是 Docker 日志、镜像或 Volume 失控,也可以看 Docker 占满磁盘排查,很多时候磁盘和流量问题会同时出现。
下面这个脚本适合最小化场景:每天跑一次,超过 80% 输出 warning,超过 90% 输出 critical。你可以把输出接到邮件、Telegram Bot、企业微信 Webhook 或自己的监控系统。
创建脚本:
sudo nano /usr/local/bin/vps-traffic-alert.sh
填入:
#!/usr/bin/env bash
set -euo pipefail
IFACE="eth0"
LIMIT_GB="3000"
WARN_PERCENT="80"
CRIT_PERCENT="90"
MONTH_TOTAL_GB=$(vnstat -i "$IFACE" --oneline b | awk -F';' '{print $11}' | awk '{print $1}')
USED_PERCENT=$(awk -v used="$MONTH_TOTAL_GB" -v limit="$LIMIT_GB" 'BEGIN { printf "%.0f", used / limit * 100 }')
MESSAGE="VPS traffic usage: ${MONTH_TOTAL_GB}GB / ${LIMIT_GB}GB (${USED_PERCENT}%) on ${IFACE}"
if [ "$USED_PERCENT" -ge "$CRIT_PERCENT" ]; then
echo "CRITICAL: $MESSAGE"
exit 2
fi
if [ "$USED_PERCENT" -ge "$WARN_PERCENT" ]; then
echo "WARNING: $MESSAGE"
exit 1
fi
echo "OK: $MESSAGE"
授权并测试:
sudo chmod +x /usr/local/bin/vps-traffic-alert.sh
/usr/local/bin/vps-traffic-alert.sh
再创建 systemd timer 或 cron。简单 cron 示例:
sudo crontab -e
每天上午 9 点检查一次:
0 9 * * * /usr/local/bin/vps-traffic-alert.sh >> /var/log/vps-traffic-alert.log 2>&1
如果你的套餐是 1TB,把 LIMIT_GB="3000" 改成 LIMIT_GB="1000"。如果商家只算出站流量,你可以进一步改脚本只读取 tx,但新手阶段建议先保守地看总量。
出现下面几种情况,就不要只想着清理流量:
- 连续两个月超过套餐 70%,说明增长已经不是偶发。
- 每到月底都要手动停服务,说明套餐不匹配业务。
- 商家超过阈值后直接限速到 1Mbps,影响线上服务可用性。
- 你的流量主要来自静态文件、图片、下载包,应该考虑对象存储或 CDN。
- 你的业务是流媒体、下载站、大文件分发,应优先买大流量套餐,而不是普通小鸡。
如果你正在纠结为什么出站流量贵,可以看 海外 VPS 出站流量成本解释。如果你用的是按量计费云服务器,一定要看 按量计费云服务器怎么防账单失控。
误区一:商家写不限流量,就不用监控。
很多“不限流量”仍然有公平使用条款,超过某个隐性阈值后可能限速或要求升级。站内也有专门解释:不限流量 VPS 真的不限吗。
误区二:只看面板,不看服务器本地统计。
商家面板是最终口径,但可能延迟;本机统计能更快发现异常。两边数据不一致时,以商家账单为准,但用本机数据做预警。
误区三:看到流量高就先重装系统。
先用 iftop、Nginx 日志、Docker 日志定位来源。重装会丢掉证据,也不一定解决根因。
误区四:只监控 CPU 和内存。
很多小站宕机不是 CPU 不够,而是带宽被刷、流量被跑完、出口被限速。流量监控应该和磁盘、证书、服务状态一样列入基础巡检。
- 用
ip -br addr找到公网网卡名称。 - 安装并启用
vnStat。 - 每周查看
vnstat -m -i eth0。 - 安装
nload,异常时看实时速度。 - 安装
iftop,异常时找连接来源。 - 根据套餐设置 80% 和 90% 告警阈值。
- 月流量长期超过 70% 时,考虑升级、迁移、上 CDN 或拆静态资源。
VPS 流量监控不需要一开始就上复杂平台。对大多数个人站、小团队、自托管服务来说,vnStat + nload + iftop + 一个阈值脚本 已经能解决 80% 的问题。
真正关键的是:不要等商家限速或账单出来才开始查。只要你知道本月用了多少、异常流量来自哪里、什么时候会触发阈值,就能提前决定是限速、加缓存、迁移静态资源,还是换一个更合适的 VPS 套餐。