本文目录导读:

- 内核参数(系统全局配置)
- 使用
sysctl命令(推荐方式) - Socket 选项级别(通常无需手动操作)
- 编译内核时(Kernel Config)
- 什么时候需要调整
tcp_autocorking? - 调试与监控
tcp_autocorking(TCP 自动 CORK)是 Linux 内核网络子系统中的一个优化选项,用于自动推迟小数据包的发送,从而减少网络拥塞窗口的浪费和提升吞吐量,它不需要手动调用 TCP_CORK 选项,而是由内核根据当前连接的状态自动判断是否应该将小包合并后再发送。
以下是如何设置和查看该选项的几种方法:
内核参数(系统全局配置)
tcp_autocorking 是一个可调整的内核标志位,通过 /proc/sys/net/ipv4/tcp_autocorking 文件控制。
-
查看当前状态:
cat /proc/sys/net/ipv4/tcp_autocorking
- 输出
1表示开启(默认值)。 - 输出
0表示关闭。
- 输出
-
临时启用/禁用:
# 启用(推荐保持默认) echo 1 > /proc/sys/net/ipv4/tcp_autocorking # 禁用 echo 0 > /proc/sys/net/ipv4/tcp_autocorking
注意:此修改重启后会失效。
-
永久生效: 编辑
/etc/sysctl.conf或/etc/sysctl.d/99-tcp-optimize.conf文件,添加或修改:net.ipv4.tcp_autocorking = 1
然后执行
sysctl -p使配置生效。
使用 sysctl 命令(推荐方式)
这是更安全、更常用的方法,与直接操作/proc效果相同。
# 查看 sysctl net.ipv4.tcp_autocorking # 临时设置 sudo sysctl -w net.ipv4.tcp_autocorking=1 # 永久设置(写入配置文件) sudo sysctl -w net.ipv4.tcp_autocorking=1 >> /etc/sysctl.conf
Socket 选项级别(通常无需手动操作)
tcp_autocorking 是一个内核自动行为,没有对应的 setsockopt 选项名称(如 TCP_NODELAY 或 TCP_CORK),它的启用或禁用完全是系统级别的,对所有 TCP 连接生效。
- 它与 TCP_CORK 的区别:
TCP_CORK:应用程序主动告诉内核“请缓存数据,直到我取消 CORK 或缓冲区满再发送”。tcp_autocorking:内核自己判断“如果应用写小包且后续很可能还有数据,则自动执行类似于 CORK 的延迟行为”,不需要应用设置选项。
编译内核时(Kernel Config)
如果你是自行编译内核,可以通过内核配置选项 CONFIG_TCP_CORK 来编译支持,但不建议关闭。
- 相关配置:
TCP_CORK和TCP_AUTOCORKING通常默认集成在IP:TCP/IP networking中。
什么时候需要调整 tcp_autocorking?
| 场景 | 建议 | 原因 |
|---|---|---|
| 高吞吐、大文件传输 | 保持开启(默认1) | 自然合并小包,提升有效载荷占比,减少ACK开销。 |
| 低延迟、交互式应用 | 建议开启(默认1) | 自动 CORK 对延迟影响极小(毫秒级),且能显著减少小包导致的重传和拥塞。 |
| 极端低延迟、高频交易 | 可能需要关闭(设为0) | 即使极小延迟也不允许,关闭后,所有小包立即发送,但可能增加带宽浪费和 CPU 中断。 |
| 延迟敏感但数据流稳定 | 保持开启(需要配合 TCP_NODELAY) |
如果应用已设置 TCP_NODELAY,autocorking 依然可能自动触发微小延迟,可以同时禁用 tcp_autocorking。 |
调试与监控
你可以通过 ss -ti 命令查看具体 TCP 连接当前是否处于 autocorking 状态:
ss -ti | grep -E "cork|corked"
如果连接当前正在使用 autocorking,你可能会看到 corked 或 unacked 相关的状态信息(具体输出依赖于内核版本)。
- 选项名称:
net.ipv4.tcp_autocorking(Linux 内核参数)。 - 设置命令:
sysctl -w net.ipv4.tcp_autocorking=1。 - 本质:内核自动行为,非应用层
setsockopt选项。 - 默认推荐:保持 1(开启)以获得最佳平衡,仅在你明确知道关闭会带来延迟改善且容忍带宽浪费时改为 0。
标签: TCP_NODELAY