服务器带宽跑不满?多半是运营商限制
不少新手运维买服务器后,明明标注的是100M带宽,实际下载速度却只有几Mbps。
排查很久服务器配置都没问题,最后发现是运营商在“暗中限速”。
本文就从运营商限制这个角度,带你一步步识别和缓解问题。
为什么营运商要限制你的带宽?
运营商限制带宽的常见手段有三种:突发上限(短时间能跑满,持续超过几秒就被限制)、连接数限制(单IP的并发连接数超过阈值直接丢包)、高峰时段限速(晚高峰或其他流量大时自动降速)。
另外部分云服务器使用的是“共享带宽池”,一旦同机房大量机器跑满,你的真实速率也会跟着下降。
第一步:用简单命令确认是不是运营商限制
不要直接看测速网站的结果,尽量从服务器向外部下载真实文件。
1. 单线程下载测试
使用 curl 测试从某大文件站点的下载速度,例如用阿里云或腾讯云的测试文件:
curl -o /dev/null -w "%{speed_download}\n" http://mirrors.aliyun.com/centos/8.4.2105/isos/x86_64/CentOS-8.4.2105-x86_64-dvd1.iso
这个命令会输出下载速度(单位bytes/sec)。
如果你的服务器带宽是100M,理论速度约12.5MB/s,如果实际只有2-3MB/s,说明大概率被限速。
2. 多线程/多节点对比
用 iperf3 测试更准确。
先找一台本机电脑(有公网IP更好)做服务器端:
iperf3 -s
在服务器上运行客户端:
iperf3 -c 你的电脑IP -t 30 -P 4
-P 4 表示启用4个并行连接。
如果单线程速度很低但多线程能接近带宽上限,说明运营商限制了单线程速率。
第二步:查看连接数和TCP参数
运营商有时会限制你的并发连接数(比如单IP最多5000个连接)。
可以用 ss 命令检查当前连接数:
ss -tan | grep ESTAB | wc -l
如果连接数瞬间暴涨(比如被CC攻击),运营商的防火墙就会开始丢包。
建议同时观察 /var/log/messages 或 dmesg 看看有没有大量 nf_conntrack: table full 之类提示,那是连接跟踪表满导致的丢包。
第三步:尝试绕过或缓解运营商限制
运营商限制通常是硬性的,但我们可以从下面几个方向缓解:
1. 启用BBR拥塞控制
BBR能更好地利用带宽,尤其在高延迟丢包环境下。
修改 /etc/sysctl.conf:
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr
然后执行 sysctl -p 生效,用 sysctl net.ipv4.tcp_congestion_control 确认是bbr。
2. 使用CDN或中转加速
如果前端有CDN(如Cloudflare、又拍云等),回源请求走的是CDN节点,运营商难以对CDN IP单独限速。
另外可以考虑购买BGP多线服务器,避开单一运营商拥堵。
3. 调整TCP缓冲区大小
适当增大接收缓存/发送缓存可以提升大流量时的吞吐量,在 /etc/sysctl.conf 中加入:
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
注意这个值要根据你实际内存调整,不要超过总内存的20%。
避坑与高频问题
- 不要被IDC测速图骗了:很多云厂商提供的测速工具只测试内网或经过优化的节点,不代表真实公网体验。
- 检查服务器侧的上传带宽:如果你跑的是下载服务,服务器上传带宽更要紧。很多运营商限制上行更狠。
- 部分云服务器有“突发带宽”机制:比如某云默认只有50M突发带宽,持续超过5分钟就会降回5M。一定要看清楚服务条款。
- UDP业务更容易被限制:游戏、直播等使用UDP的容易丢包,可以尝试开启KCP加速或切换到QUIC协议。
验证效果
做完以上优化后,重新用 curl 或 iperf3 测试,观察速度是否改善。
同时在不同时间段(比如凌晨和晚8点)分别测试,如果凌晨能跑满而晚上跑不满,基本可以确认是运营商高峰限速。
这时最强的方案就是换运营商或加CDN。
如果你正在处理服务器带宽跑不满的问题,建议先按本文方法排查运营商限制,不要盲目调服务器参数。
认清问题根源,才能对症下药。