在 Linux 上,TCP 的性能表现不仅取决于应用代码,更直接受内核中一系列参数的控制。理解并调整这些参数,能够在高并发、高延迟或高带宽场景下把服务器的吞吐量提升数倍,而不需要改动一行业务逻辑。
1. 关键 TCP 连接参数
这些参数定义了连接的行为边界,可以在 /proc/sys/net/ipv4/ 下查看和修改,或通过 /etc/sysctl.conf 永久设定。
tcp_tw_reuse
默认值通常为 2(内核 4.x 后)。允许将处于 TIME_WAIT 状态的套接字用于新的出站连接,对频繁发起短连接的客户端(如反向代理连接后端)至关重要。启用后可大幅减少“端口耗尽”的风险。
tcp_fin_timeout
控制 FIN-WAIT-2 状态的最长存活时间(秒)。如果本地关闭连接后迟迟未收到对端的 FIN,这个超时可以防止孤儿连接长期占用资源。默认为 60 秒,对繁忙的 Web 服务器可以调低到 15–30 秒。
tcp_keepalive_time/tcp_keepalive_intvl/tcp_keepalive_probes
这三个参数控制 TCP keepalive 探测的节奏:第一个参数设定连接空闲多久后开始探测(默认 7200 秒),第二个设定探测间隔(默认 75 秒),第三个设定探测失败几次后判定连接死亡(默认 9 次)。对于需要及时感知对端死机的应用,通常将空闲时间降到 600 秒左右。
tcp_max_syn_backlog
指定半连接队列(SYN_RECV)的最大长度。当服务器面对突发流量或 SYN 泛洪攻击时,如果该队列过小,新连接会被直接丢弃。增大此值可以在一定程度上缓解问题(但真正的防护需要 tcp_syncookies 配合)。
tcp_syncookies
开启后(设为 1),当半连接队列满时,系统会通过加密 Cookie 验证后续 ACK 的合法性,从而在不占用队列资源的情况下完成三次握手。这是防御 SYN Flood 的第一道廉价而有效的屏障。
2. TCP 缓冲区:发送与接收的“水库”
每个 TCP 连接在内核中存在发送缓冲区(sk_wmem_alloc)和接收缓冲区(sk_rcvbuf),它们决定了连接能暂存多少未确认或未读取的数据。如果缓冲区太小,高速网络或高延迟链路的吞吐量会急剧下降。
内核提供了自动调整机制,通过三个以 tcp_rmem 和 tcp_wmem 命名的参数控制:
tcp_rmem(接收):最小值 默认值 最大值,单位为字节
例如:4096 131072 6291456
- 最小值:系统为每个连接保证的最小接收缓冲区;
- 默认值:应用未显式设置 socket 缓冲区时使用的初始值;
- 最大值:自动调整可以增长到的上限。
tcp_wmem(发送):结构与上述相同。
tcp_mem(全局内存压力阈值):pages为单位,控制整个系统的 TCP 内存总量。当已用内存超过第三个值时,内核将开始限制缓冲区分配,以救回整体内存压力。
实用建议:
- 如果运行于 10GbE 及以上的高速网络,或者用于跨地域的长肥管道(高带宽、高延迟),需要显著增大
tcp_rmem和tcp_wmem的最大值(例如16777216)。 - 应用也可以在自己的代码中通过
setsockopt()设置SO_RCVBUF和SO_SNDBUF,但不得小于内核允许的最小值,也不得超过最大值。
3. 拥塞控制算法:控制发送节奏的核心策略
拥塞控制算法决定了 TCP 在网络出现拥堵时如何降低发送速率,以及恢复时如何提升速率。Linux 支持多种算法,模块会被编译进内核(ls /lib/modules/$(uname -r)/kernel/net/ipv4/tcp_*.ko 查看可用模块)。
cubic(当前默认)
适合大多数场景。它以三次函数方式探测可用带宽,在高速长距离网络上能够较快达到高吞吐量。但对丢包敏感,在网络不稳定的无线环境可能性能一般。
reno(经典)
快速恢复/快速重传的鼻祖,行为稳定但收敛速度较慢,不适用于高带宽时延网络。
bbr(Google 开发,目前推荐)
基于瓶颈带宽和往返时间模型,不再以“丢包”作为拥堵信号,而是实时估算可用带宽。在有随机丢包的环境(如 Wi-Fi、移动网络)或高延迟的网络(如国际专线)中,bbr 通常能显著提高吞吐并降低延迟。生产环境切换时建议先在测试环境验证,因早期版本曾在某些场景下造成公平性问题,但内核 4.9 以上的稳定版本已相当成熟。
切换算法(需要 root):
# 查看当前使用的算法
sysctl net.ipv4.tcp_congestion_control
# 临时切换到 bbr(可能需先 modprobe tcp_bbr)
echo bbr > /proc/sys/net/ipv4/tcp_congestion_control
若要永久生效,可在 /etc/sysctl.conf 中添加:
net.ipv4.tcp_congestion_control = bbr
然后执行 sysctl -p。
总结
这三个层面——连接参数、缓冲区规模和拥塞控制算法——是 Linux TCP 调优的三大支柱。实际工作流通常是:
- 观察异常指标(连接超时、握手失败、带宽跑不满),先检查连接队列和超时参数;
- 若存在长肥网络或突发大流量,逐步放宽缓冲区限制;
- 最后,对于高丢包但并非真实拥塞的环境,果断尝试
bbr等现代算法。
每次只改一项,改后联合 ss、netstat -s、iperf3 等工具验证效果,是安全可靠的优化路径。