服务器带宽被跑满怎么办?三种原因与处理顺序
带宽跑满是游戏服务器最常见的故障之一。这篇讲清楚怎么确认、有哪几种原因、以及每一层怎么处理。
怎么确认是带宽跑满
三个信号同时出现,基本可以确定:
- 云厂商控制台的出带宽曲线顶到上限,呈一条水平直线
- 服务器本地
ping网关正常,但从外部ping服务器丢包严重 - SSH 登录极慢或超时,但 CPU 和内存都不高
验证命令:
# 实时看网卡流量(需要 iftop,或用 sar)
sar -n DEV 1 10
# 看当前累计流量
cat /proc/net/dev
# 按进程统计流量(nethogs)
nethogs
关键区分:带宽跑满时 CPU 往往不高,因为包根本没进到应用层就被丢了。如果 CPU 也满了,那是 CC 攻击或程序问题,不是单纯的带宽问题。
三种原因,处理方式完全不同
原因一:DDoS 流量攻击
特征:带宽瞬间打满,从正常值直接冲到上限,通常几分钟内发生。攻击流量可能是正常流量的几十上百倍。
为什么自己处理不了:你的带宽上限是 100M,攻击流量是 10G,包在运营商那里就被丢了——你连抓包都抓不到。
处置:
- 立刻联系云厂商,申请流量清洗或黑洞(黑洞是下策,等于业务中断)
- 如果攻击持续,考虑接入带清洗能力的防护方案
- 源站 IP 暴露的话,光换 IP 只能撑几天
原因二:业务增长超出预期
特征:带宽随在线人数平稳上升,在某个时间点(比如晚高峰)顶到上限,凌晨恢复正常。
怎么算需要多少带宽:
所需带宽(Mbps) ≈ 单玩家平均带宽(Kbps) × 在线人数 ÷ 1000 × 峰值系数
举例:
单玩家 30 Kbps(回合制/棋牌)
在线 2000 人
峰值系数 1.5
→ 30 × 2000 ÷ 1000 × 1.5 = 90 Mbps
不同类型游戏的单玩家带宽差别很大:
| 游戏类型 | 单玩家带宽参考 | 说明 |
|---|---|---|
| 回合制、棋牌 | 10–30 Kbps | 请求响应式,数据量小 |
| MMORPG | 30–80 Kbps | 周围玩家和怪物状态同步 |
| MOBA、FPS | 80–200 Kbps | 高频位置同步,20–60 帧/秒 |
| 带语音的房间类 | 200–500 Kbps | 语音流占大头 |
处置:升级带宽,或者把静态资源(客户端下载包、更新包、图片)迁到对象存储 + CDN,这部分流量往往占了总流量的一半以上。
原因三:程序或配置问题
特征:没有攻击、人也不多,但带宽就是异常高。常见几种:
- 死循环重连:客户端断线后疯狂重连,每个客户端每秒几十次请求
- 日志或监控外发:把日志实时推到外部服务,量大时很惊人
- 资源盗链:更新包被别的站直接引用
- 备份任务:每天定时全量备份传到异地,瞬间打满上行
- UDP 放大:服务器开了某些 UDP 服务(如 memcached、DNS 递归),被利用做反射放大
排查方法:
# 按进程看流量(最直接)
nethogs
# 看哪些端口在大量外发
ss -s
ss -tunp | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head
# 检查是否开了不该开的 UDP 服务
netstat -ulnp
特别注意 UDP:很多服务器默认开了 DNS 递归或 memcached,一旦被利用做反射放大,你的服务器会变成攻击别人的工具,同时自己的带宽被打满。这类服务如果不需要,一定要关掉或限制来源。
应急处理顺序
带宽已经跑满、业务中断时,按这个顺序做:
- 先确认是不是攻击(看曲线形状,见 游戏卡顿掉线是被攻击了吗)
- 是攻击:联系云厂商清洗,同时准备临时扩容扛过峰值
- 不是攻击:
nethogs找出发流量的进程,先kill掉止血 - 止血后:查清原因,是配置问题就改配置,是业务增长就扩容或分流
长期方案:把带宽压力拆开
不要把全部流量都压在源站带宽上。合理的架构是分层:
| 流量类型 | 走哪里 | 效果 |
|---|---|---|
| 客户端下载包、更新包 | 对象存储 + CDN | 通常能省掉一半以上带宽 |
| 游戏内图片、配置 | CDN | 省带宽,还更快 |
| 登录、支付等短连接 | CDN 或高防 IP | 挡掉大部分 CC |
| 游戏长连接(核心) | 游戏盾节点中转 | 隐藏源站 IP,攻击打不到源站 |
其中最后一项最关键——只要源站 IP 不暴露,流量型攻击就没有目标。原理见 游戏盾是什么。