很多朋友购买了千兆 VPS,但往往发现单线程速度跑不上去。以 DMIT VPS 为例:
本地千兆宽带测速可超过 1Gbps
优化前 iperf3 单线程测速约 160 Mbps,远低于理论上限
即便调整了vps的各种配置,速度依然无法突破
通过实际操作,我总结了单线程速度低的几个主要原因
VPS TCP 栈限制
默认 Linux 内核的 TCP 窗口较小,跨洋 RTT 较高时,单条 TCP 连接无法充分利用带宽。
客户端 TCP 栈限制
macOS 默认的 autorcvbuf 和 autosndbuf 较小,TCP 窗口未开启动态增长,导致高带宽长延迟链路下吞吐受限。
VPS 内核拥塞控制
默认拥塞控制算法通常是 CUBIC,对长延迟链路性能不佳。采用 BBR 或 BBR3 可以显著提升跨洋单线程速度。
总结来说,优化前 DMIT VPS 单线程速度主要受 TCP 窗口、拥塞控制算法和系统默认配置 的限制。其中两个设置网上有很多资料,例如 BBR 内核和 TCP 调优,但大家常常忽略了最关键的一点——本地客户端 TCP 窗口限制。
** 我使用的是 macOS 系统,默认 TCP 窗口限制约 4MB。将其修改为 16MB 后,跨洋 DMIT VPS 的单线程 iperf3 速度可以从 160 Mbps 提升到 350–410 Mbps,已经接近实际可用带宽的极限。
至于那些声称跑 800 Mbps+ 的单线程,我估计并非跨洋测试结果。Windows 用户是否也可以通过类似方法修改 TCP 窗口,我暂不清楚,欢迎大家探讨。**
# macos 系统查询 tcp 窗口当前数字的命令
sysctl net.inet.tcp.autorcvbufmax
sysctl net.inet.tcp.autosndbufmax
# macos 系统**临时**修改 tcp 窗口的命令
sudo sysctl -w net.inet.tcp.autorcvbufmax=16777216
sudo sysctl -w net.inet.tcp.autosndbufmax=16777216
调整后,如果有效果,在修改为永久有效就可以了。否则重启就恢复回去了。
Windows通过注册表限制最大缓冲区
如果你希望像 macOS 那样从底层限制缓冲区占用的内存最大值,可以通过修改注册表实现(需重启生效)。
按下 Win + R,输入 regedit。
定位到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在右侧新建 DWORD (32位) 值:
名称:TcpWindowSize
数值:例如 16777216 (十进制,代表 16MB)
顶一下,好贴
好贴 顶了
好贴
单线程过g其实挺简单的 地区不qos
拉tcp就好了
不错
过G 的过程中有很多门槛,前期一直以为是 区域qos的原因让我的速度上不去,今天调整了本地客户端配置后,竟然突破了,至于过G,放在下学期继续在这里学习
先收藏
@hogue #6 前段时间不qos的时候,我家(浙江)本地ubuntu调tcp,远端调tcp,iperf3对拉1.4g+,甚至撞墙导致有重传,现在开始q了又变成200m多的水平了


q和不q的区别
收藏
@Inklazy #8 海豚测速参考价值几何?