CUBIC在跨洲际链路表现差,因其依赖“丢包≈拥塞”和“RTT稳定”假设,而高延迟(200–400ms)、物理层丢包、大BDP(如3.75MB)与小init_cwnd(14KB)导致窗口增长错位、误减半、爬升缓慢;改用BBRv2可主动探测带宽与RTT,提升利用率至89%,并需同步调大init_cwnd、启用tcp_tw_reuse、优化Composer超时及连接策略。

跨洲际网络下 Composer 拉取大型项目失败,不是镜像源慢,而是 TCP 拥塞控制在高延迟、高丢包链路上过度保守——默认 CUBIC 算法把非拥塞丢包(如卫星链路信号衰减、跨境路由抖动)误判为拥塞,直接砍半 cwnd,导致带宽利用率长期卡在 10%~30%。
为什么CUBIC在跨洲际链路上表现差
CUBIC 是 Linux 默认的 TCP 拥塞控制算法,设计目标是“公平抢占带宽”,但它依赖两个强假设:丢包 ≈ 拥塞、RTT 相对稳定。跨洲际场景中:
- 单次 RTT 常达 200–400ms(东京→法兰克福),而 CUBIC 的窗口增长函数基于本地 RTT 估算,远程链路下增长节奏错位
- 物理层丢包率高(海缆信号衰减、跨境 POP 点设备缓存溢出),但并非链路饱和,CUBIC 却触发乘性减半
- BDP(带宽延迟积)极大:100Mbps × 0.3s = 3.75MB,但默认 init_cwnd=10 MSS(约 14KB),初始窗口仅占 BDP 的 0.4%,需数十个 RTT 才爬升到合理水位
改用BBRv2并调大init_cwnd
BBR(Bottleneck Bandwidth and RTT)不依赖丢包信号,而是主动探测带宽和最小 RTT,更适合长肥管道(LFN)。实测在新加坡→阿姆斯特丹链路上,BBRv2 可将 Composer 下载带宽利用率从 22% 提升至 89%。
操作步骤:
- 确认内核支持:
sysctl net.ipv4.tcp_congestion_control输出应含bbr2;若无,升级内核至 5.10+ 或手动编译启用 - 启用 BBRv2:
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr2 - 增大初始窗口:
sudo ip route change default via <your-gateway> dev eth0 initcwnd 30</your-gateway>(替换<your-gateway></your-gateway>和eth0) - 持久化:在
/etc/sysctl.d/99-bbr.conf中写入net.ipv4.tcp_congestion_control = bbr2,并在/etc/network/interfaces或 systemd-networkd 中固化 initcwnd
绕过TCP层限制:强制复用连接 + 调整TIME_WAIT行为
Composer 默认为每个 dist 包建独立 HTTPS 连接,短连接 + 高频并发 → 大量 TIME_WAIT 占用端口,叠加跨洲际高 RTT,进一步恶化拥塞感知。必须同时调整:
- 启用
net.ipv4.tcp_tw_reuse=1,但前提必须确保net.ipv4.tcp_timestamps=1(BBR 本身依赖时间戳,此项通常已开) - 降低 TIME_WAIT 超时:
net.ipv4.tcp_fin_timeout=30(默认 60),避免端口被长时间锁定 - 扩大本地端口范围:
net.ipv4.ip_local_port_range = 1024 65535,提供 64K 端口缓冲 - 关键提醒:这些参数只对 Composer 进程所在命名空间生效。Docker 容器需加
--sysctl参数;PHP-FPM 需在 pool 配置中设catch_workers_output = yes并确认其继承宿主机 sysctl
Composer自身配置必须同步调优
内核调优只是基础,Composer 若仍用默认超时和重试策略,照样在 TLS 握手阶段就断连:
- 延长网络超时:
COMPOSER_NETWORK_TIMEOUT=600(覆盖http.timeout),避免首字节等待中断 - 禁用 IPv6 强制 fallback:
CURL_IPRESOLVE=4,跳过 AAAA 查询卡顿 - 启用 dist 优先 + 清理兜底:
composer install --no-interaction --prefer-dist,失败后必须rm -rf vendor/ composer.lock再重试,否则残留损坏 checksum 导致无限循环 - 不要依赖
--retries:它只对 dist 下载有效,且不指数退避;真要稳,得用 shell 封装实现sleep $((i * 15))级别退避
真正起效的组合不是单点优化:BBRv2 解决带宽探测失准,init_cwnd 缩短爬坡期,tcp_tw_reuse 缓解端口耗尽,而 Composer 层的 timeout + IPv4 强制 + dist 优先则是让上层请求能活过链路抖动。漏掉任意一环,都可能卡在某个隐性瓶颈上。











