零星笔记

TCP 缓冲区到底该调多大

2026-09-18 · 网络

这台机器上 net.ipv4.tcp_rmem 和 tcp_wmem 的最大值都设成了 64MB,rmem_max 和 wmem_max 也是。设完之后我一直觉得"差不多了",直到某天在一个跨洋链路上实测,单条 TCP 流只跑到 3MB/s。

先算带宽延迟积

链路 RTT 约 150ms,带宽 1Gbps。要把这条链路填满,理论上需要在途数据 1000Mbps × 0.15s ÷ 8 = 18.75MB。也就是说接收窗口至少要 18MB 量级。

但收到窗口不是只有上限就够的。内核实际协商的窗口取决于接收缓冲区的自动调节,而 tcp_rmem 的中间那个值(默认值)往往才是起点。默认 87380 字节,对 150ms 的链路来说,单流上限大概就是 87380 / 0.15 ≈ 583KB/s —— 除非接收方应用读得够快让内核把缓冲区涨上去。

所以调的是什么

另一个方向的坑

tcp_notsent_lowat 调小可以让数据更早离开发送队列,降低延迟,但对大流量吞吐通常是负面的 —— 因为它限制了在途缓冲。我这边设成了 16KB,纯粹是给交互流量让路的取舍,跑大文件的时候反而更慢。

结论:调参之前先算 BDP,算完再决定动哪个数字。凭感觉调 64MB 只是给自己心理安慰。