写在前面:
- 此方案适合本身拥有亚太线路机(特别是日本),需要顺带拉美西(落地)的人
- 此方案单纯成本上肯定远远贵于美西线路机
很多人(包括我自己)拿到美西线路机,在多个终端上测速,单线程最大也就200M左右,都会以为是运营商锁死单线程。单线程速度不够高时,表现看视频的缓冲速度可能不够快(例如油管虽然够用,但跑分较低)。因为我同时测试gen2和turin,发现前者大概是500M,后者能跑满1000M+,因此我认为不是运营商的问题。
简单询问AI,AI表示是BDP(带宽延迟积) 决定。
BDP=带宽x(往返延迟)RTT
在默认情况下,如果操作系统或软件的 TCP 窗口大小(Window Size) 设置得不够大,数据传输就会进入“走走停停”的状态。160ms 的延迟意味着数据包在路上要花很长时间,如果窗口填满了,发送端就必须停下来等回包,导致带宽无法跑满。也就是绝大部分人被限制在200M左右,这其实是物理距离太远限制造成的
那为什么机场的专线能无视这个RTT,说明这个并不是无解的,而且也有mjj能跑到接近千兆的水平。一般来说,提高终端设备(以及美西服务器)的TCP窗口能直接解决问题,但是对我来说,我不希望每个终端设备还要调整这个。因此询问AI后,测试发现通过分拆TCP是一个可行的方案。即将
本地->美西 160ms延迟
拆成
本地->日本 60ms延迟 日本->美西 100ms延迟
两段,这样就能显著降低RTT的影响,终端不做任何调整,美西单线程测速能达到500M左右。
实际的技术方案就是在日本机器上部署一个HAProxy或者Nginx Stream拆分TCP并转发到美西。以下为HAPrxoy为例,下面的代码就是将日本服务器的54321口转发到美西ip的12345口,如果部署需要按照自己的需求更改配置:
frontend fe_54321
bind :54321
default_backend be_12345
部分,54321更改成自己希望的日本服务器入口,
backend be_12345
server c1 美西机器ip:12345
更改为自己美西代理服务的入口ip和端口
启用后,直接将美西代理配置的ip和入口改成日本的ip和入口,即可实现tcp split提速。实测经过提速后,原来200M的单线程可以提升到480M左右,油管美西速度能到18W左右
而直接用代理链因为没有进行TCP拆分,握手仍然是本地和美西完成,并不能提速,只有TCP Split本地先和日本握手,日本再和美西握手才有此效果
备注:
- 此方案只处理TCP,如果同时需要UDP转发,可能需要再用nftables之类的进行转发
- 这一方案对日本机器的性能要求会略高一点,iperf3测速时CPU占用会比较高,但speedtest单线程测速并不高。
- 由于使用日本中转到美西,因此美西其实无需线路机,落地机即可
- 日本和美西之间的TCP调优最好还是继续做,因为整条线路的速度略低于分段线路的最低值(瓶颈效应以及拆分的额外开销)
apt-get update
apt-get install -y haproxy
# 创建haproxy配置文件
cat > /etc/haproxy/haproxy.cfg <<EOF
global
log /dev/log local0
log /dev/log local1 notice
daemon
maxconn 20000
ulimit-n 200000
defaults
mode tcp
log global
option tcplog
# 关键:零拷贝/低抖动
option splice-auto
timeout connect 5s
timeout client 10m
timeout server 10m
timeout client-fin 30s
timeout server-fin 30s
# --- Port maps with split (TCP) ---
frontend fe_54321
bind :54321
default_backend be_12345
backend be_12345
server c1 美西机器ip:12345
EOF
# 创建haproxy服务
cat > /etc/systemd/system/haproxy-split.service <<EOF
[Unit]
Description=HAProxy TCP Split Proxy (Production)
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy-split.pid
ExecReload=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /run/haproxy-split.pid -c
ExecReload=/bin/kill -USR2 $MAINPID
Restart=always
RestartSec=2
# 关键:文件句柄、进程数
LimitNOFILE=200000
LimitNPROC=65535
# 安全加固(不影响性能)
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
# 允许绑定低端口(你现在端口都>1024,其实不必须)
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl daemon-reload
systemctl enable --now haproxy-split
systemctl status haproxy-split --no-pager
# 确认log
journalctl -u haproxy-split -f
有测速对比结果吗
@levinion #1
原来210M,拆分后480M左右
都有亚太线路了还去美西干嘛,不理解
成本略高
@ningchaitong1 #3 可能是美西的便宜大盘鸡
@ningchaitong1 #3
美西落地机即可,为了某些服务分流
有些地区运营商就是限制200 不用想了 同设备 minibox 移动5G国内测速千兆 iperf3 600兆 联通5g国内800兆 iperf3卡死200±5兆
@stgunner #5 @aifennng #6
懂了
dmit也是这样
另外这样相当于用日本中转美西,就要求日本线路要好,美西走国际,就浪费美西cn2了