很多团队在业务出现卡顿、视频起播慢、API超时的时候,第一反应是"带宽不够",但加了带宽之后问题依旧。原因往往不是带宽数值,而是并发模型与内核参数不匹配:单条TCP流跑不满链路、缓冲区过小导致丢包、拥塞控制算法不适合跨境长肥管道。本文以CTG香港大带宽服务器为例,面向运维与后端读者,拆解大带宽到底解决什么问题,讲清单流与多流、CUBIC与BBR的差异,给出可执行的sysctl与ethtool调优、iperf3多流压测和sar监控方法,让带宽真正转化为可用吞吐。
一、大带宽解决的不是"速度",而是"并发承载"
带宽的单位是比特每秒,而业务感受的"快"取决于并发连接数与单连接吞吐的乘积。同样1Gbps链路,给100个用户各10Mbps是流畅的,给10个用户各100Mbps就可能因单流限制而跑不出预期。大带宽的价值是让更多并发用户同时获得稳定速率,而不是让单个下载变得"更快"。
把并发承载想清楚,就能避免两个典型误区:一是盲目堆带宽却忽略单流限制,二是只测下载不测上传。前者表现为链路利用率长期偏低,后者会在业务上线后才暴露上行受限。两者都应在选型与压测阶段就检出来。
1.1 从业务反推带宽的估算方法
- 视频分发:码率乘以并发数再留30%余量,例如4Mbps×500路≈2.6Gbps。
- 游戏同步:以每秒消息数乘以单包大小乘以在线人数估算,包小但频率高,更看重PPS。
- API与下载:以峰值QPS乘以平均响应体大小估算,注意突发峰值而非平均值。
估算完成后,还要验证网卡的PPS能力。小包场景下先撞到的是PPS上限而非带宽上限,这一点必须靠压测确认。
1.2 带宽与PPS是两条不同的上限
带宽上限由链路速率决定,PPS上限则由网卡与内核每秒能处理的报文数量决定。以64字节小包为例,1Gbps在理论上限下对应约148万PPS,但很多网卡与单核软中断根本达不到,于是小包业务的实际可用吞吐可能远低于标称带宽。判断方法是用小包做压测,观察是否出现带宽没满、单核CPU却已跑满并伴随丢包的情况。若属于这一类,单纯加带宽无效,需要开启多队列、调整中断亲和性,或启用RPS/RFS把软中断分散到多个CPU。
二、为什么单条TCP流跑不满带宽
TCP吞吐的近似上限等于窗口大小除以往返时间。跨中国香港与中国大陆的链路RTT若为30毫秒,要让单流跑到1Gbps,窗口需达到约3.75MB;而默认接收窗口远小于此值,于是单流吞吐被卡住。解决办法有两个:增大窗口(配合窗口缩放),或使用多流并发。
# 多流压测才能反映真实可用带宽,-P 为并行流数 iperf3 -s -p 5201 # 对端监听 iperf3 -c 203.0.113.20 -p 5201 -t 30 -P 16 -w 4M --get-server-output # 对照单流结果,观察差距 iperf3 -c 203.0.113.20 -p 5201 -t 30 -P 1 -w 4M
如果单流只有多流的几分之一,说明瓶颈在TCP窗口与拥塞控制,通过调大缓冲区与改用BBR通常可以明显改善,而不必立即升级带宽。
2.1 窗口、RTT与吞吐的定量关系
把吞吐公式展开更直观:吞吐上限约等于窗口除以RTT。RTT为30毫秒时,128KB窗口只能得到约34Mbps,1MB窗口约266Mbps,4MB窗口才接近1Gbps。这就是为什么跨境单流"天生吃亏"。窗口缩放选项负责把16位窗口字段扩展成更大值,一旦协商失败,吞吐会被钉死在低位。排查时先确认两端都启用了窗口缩放,再逐步调大 tcp_rmem 与 tcp_wmem,每调一档压测一次,找到吞吐不再上升的拐点。
- 先确认路径MTU,避免分片拖累效率。
- 再确认窗口缩放生效,可抓包查看窗口字段。
- 最后按业务并发度决定用单流大窗口还是多流。
三、内核与网卡调优
大带宽高并发场景下,内核缓冲、队列调度与网卡特性共同决定实际吞吐。建议逐项修改并记录原值,改动后压测复验。
sysctl -w net.core.default_qdisc=fq sysctl -w net.ipv4.tcp_congestion_control=bbr sysctl -w net.ipv4.tcp_window_scaling=1 sysctl -w net.ipv4.tcp_mtu_probing=1 sysctl -w net.ipv4.tcp_notsent_lowat=16384 sysctl -w net.core.somaxconn=65535 sysctl -w net.ipv4.ip_local_port_range="10240 65000"
BBR不依赖丢包判断拥塞,在有一定丢包的跨境链路上比传统CUBIC更稳健,但并非任何场景都更快:本地低延迟内网中,两者差距可能不明显。fq队列配合BBR可降低缓冲膨胀带来的延迟。修改拥塞控制算法后建议做A/B对比:同一负载分别用CUBIC与BBR压测,记录吞吐、重传率与P99延迟,若BBR在吞吐上明显占优且延迟未显著恶化,即值得保留;反之则维持原算法。切换算法不需要重启服务,但应确认内核已支持,可用 sysctl net.ipv4.tcp_available_congestion_control 查看可用算法列表。
# 检查网卡丢包与队列,确认不是硬件或中断瓶颈 ethtool -S eth0 | grep -E "rx_dropped|tx_dropped|rx_missed|rx_over" # 适当增大环形缓冲区(按驱动支持范围调整) ethtool -G eth0 rx 4096 tx 4096 # 确认卸载特性符合预期 ethtool -k eth0 | grep -E "gro|gso|tso"
若 rx_dropped 持续增长,多半是环形缓冲区偏小或中断集中在单个CPU;此时可结合网卡多队列与RPS/RFS分担软中断。
3.1 中断亲和与多队列
万兆网卡通常支持多队列,每个队列可绑定不同的CPU。若中断全部落在CPU0,即使带宽充足也会因单核软中断打满而丢包。可以按队列编号把中断分散到隔离出来的CPU核上,并让业务进程避开这些核,减少竞争。修改后重跑压测,观察单核利用率是否下降、丢包是否消失,以此判断调优是否起效。
四、实测与监控:把吞吐与丢包都盯住
调优不是一次性的,需要常态化监控关键指标。压测期间同时打开监控,才能判断瓶颈位置。
sar -n DEV 1 10 # 逐秒查看网卡收发速率与丢包 ss -s # 汇总TCP连接状态 tc -s qdisc show dev eth0 # 查看队列调度与丢弃计数 nstat -az | grep -iE "retrans|drop|prune"
参考阈值:稳态下带宽利用率可长期维持在70%以内较为从容,瞬时突发可到85%;重传率应保持在较低水平,若持续偏高需排查链路质量或窗口设置。应用层同样要配合:以nginx为例,worker_processes 设为CPU核心数、开启 keepalive 复用连接、合理设置 worker_connections 与 sendfile,可减少每请求的连接开销;上游长连接池能显著降低跨区域调用的握手成本。压测时同步观察应用层指标,避免内核已调优而应用成为新瓶颈。下表对比几种拥塞控制算法在跨境大带宽场景下的特性,便于按业务特点选择。
| 算法 |
拥塞判断依据 |
跨境长肥管道表现 |
适用场景 |
| CUBIC |
基于丢包 |
有丢包时吞吐下降明显 |
低延迟内网、稳定链路 |
| BBR |
基于带宽与RTT建模 |
抗随机丢包,吞吐更稳 |
跨境大带宽分发 |
| HTCP |
丢包结合延迟 |
通用性较好 |
混合链路 |
| Nevada |
基于丢包 |
长肥管道效率偏低 |
老系统兼容 |
| Vegas |
基于排队延迟 |
对缓冲敏感 |
低延迟受控环境 |
总结
大带宽服务器的落地关键在于三件事:先用业务模型估算带宽与PPS需求,再用多流压测确认单流与并发流的真实差距,最后用内核与网卡参数把瓶颈从软件侧移除。压测环境也要讲究:客户端与服务端都应避开被其他任务占用的机器,压测前先确认两端网卡速率与链路协商结果(可用 ethtool eth0 查看 Speed 与 Duplex),否则测出的数字反映的可能是客户端瓶颈而非服务器能力;测试完成后把参数、客户端信息与结果一并归档,便于复现。记住单流受窗口与RTT限制、跨境链路适合BBR、小包场景关注PPS,就能避免"带宽加了问题没解决"的常见误区。
本文链接:https://www.idcbest.com/servernews/11018581.html