在开始之前,先弄清你的供应商计费方式(按流量计费还是按95th峰值计费)。多数带CN2线路的机房对出口峰值采用95th percentile计费,频繁峰值会提高账单。通过平滑峰值、调度大流量任务并优化传输协议,可显著降低账单。
本指南面向有Linux VPS权限(root)的用户,包含监控、限速、应用层优化和调度等实操步骤,适用于日本CN2线。
联系机房或在控制面板查看:确认计费周期(通常每5分钟采样,按月取95th)。记录奖励与超额规则,以便对症下药。
如果是按总流量(按GB)计费,重点在于减少无用下行和备份流量;若是95th,重点在于压制短时峰值。
推荐工具:iftop/nethogs/ntopng(实时),vnstat(历史),sar/collectl(系统),iperf3(测量)。
安装示例(Debian/Ubuntu):apt update && apt install -y iftop nethogs vnstat iperf3
初始化vnstat:vnstat -u -i eth0 && systemctl enable --now vnstat,后续用 vnstat -m 查看每月流量。
用iperf3在两端跑测:服务器端 iperf3 -s,客户端 iperf3 -c SERVER_IP -P 10 -t 60。记录带宽峰值作为限速基准。
用iftop查看瞬时会话:iftop -i eth0,找到高流量源IP与端口,决定是否做规则化管理。
示例:对 eth0 全局限速并区分 HTTP 流量与其它流量。
1) 清空并添加 HTB 基本结构:
tc qdisc del dev eth0 root 2>/dev/null; tc qdisc add dev eth0 root handle 1: htb default 30
2) 建类并设置速率(按你的上限调整,单位kbps):
tc class add dev eth0 parent 1: classid 1:1 htb rate 800000kbps ceil 800000kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 600000kbps ceil 800000kbps # web
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 200000kbps ceil 800000kbps # 其它
3) 用 iptables 标记流量并用 tc filter 关联:
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 10 fw flowid 1:10
这套办法能把短时突发分到固定类,从而限制峰值。
若不熟 tc,可用 wondershaper 一行命令限速:apt install wondershaper; wondershaper eth0 100000 20000 (下载上行 kbps)。
或用 trickle 对单进程限速:trickle -d 100 -u 50 rsync ...,适合临时使用。
nginx:开启 gzip、缓存、并用 limit_conn/limit_req 控制并发请求,示例:
limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn addr 10; limit_req_zone $binary_remote_addr zone=req:10m rate=10r/s;
rsync:使用 --bwlimit=KBPS 来限制同步带宽;cron 结合 off-peak 时间运行。
对备份、镜像、离线同步类任务使用 cron 在凌晨或机房低峰时段执行。示例:
0 3 * * * /usr/bin/rsync --bwlimit=10240 /data backup@remote:/backup
如果必须在高峰运行,分片上传并使用 --bwlimit 与间隔(sleep)来平滑峰值。
将静态资源(大文件、镜像)放到 CDN、阿里云OSS、S3或对象存储,减少 VPS 出口流量。使用 CDN 可以把用户下载压力转移出 VPS,从而避免计费峰值。
配置方法:将静态域名 CNAME 指向 CDN,然后在应用中改用 CDN 域名或配置反向代理。
用 fail2ban、iptables limit 模块或 nginx limit_conn 限制单IP并发,防止少数坏用户制造峰值。
iptables 示例:iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
用 vnstat + simple shell 脚本每小时检查流量并在接近阈值时发通知或自动触发限速策略。示例脚本(伪):
if [ $(vnstat --json | jq ...) -gt THRESHOLD ]; then /usr/local/bin/enable_shaper.sh; fi
结合邮件或 webhook 推送到 Slack/微信,实现24小时监控。
1) 启用 TCP BBR:echo 'bbr' > /proc/sys/net/ipv4/tcp_congestion_control,能提高吞吐同时可能减少重传浪费。
2) 启用 HTTP/2、压缩、图片 WEBP 转换、合理缓存头,降低重复下行。
3) 对外提供分段下载,可对客户端下载速率做更精细控制,例如用 nginx slice 或限制下载线程数。
步骤:1) 立刻用 iftop/vnstat 确认实时流量来源;2) 临时启用全局限速(wondershaper或tc);3) 关闭不必要服务并检查日志(/var/log/messages/nginx/access.log);4) 逐条封禁异常IP并持久化规则;5) 分析日志找根因并修正应用。
启限脚本示例(/usr/local/bin/enable_shaper.sh)简要:
#!/bin/bash tc qdisc add dev eth0 root tbf rate 50mbit burst 32kbit latency 400ms
禁限:tc qdisc del dev eth0 root
问:我的机房是按95th计费,我该如何快速降低本月账单风险?
答:立刻平滑当前峰值:启用tc或wondershaper做全局限速,把突发流量压到低于95th阈值;暂停或限速大文件任务(rsync/备份);检查并封堵异常流量源。随后分析日志找根因并把大流量工作迁移到低峰或CDN上。
问:我不懂 tc,最简单能做的事是什么?
答:使用 wondershaper 或在应用层限速(rsync --bwlimit、nginx limit_req/limit_conn)以及把静态资源上CDN。这些办法不需深入内核命令就能有效压峰。
问:如何长期优化以避免每月都手工干预?
答:建立自动化监控(vnstat + 脚本告警),遇到接近阈值时自动触发平滑策略;把大流量任务调度到低峰,静态资源上 CDN,应用层做好带宽限制与缓存。长期来看,结合这些策略能稳定控制95th峰值并节省费用。
