什么是 tcp_autocorking
应用调用 write 发送小段数据时,如果发送队列里还有未发出的数据,内核会自动把这次的小包与队列中的数据合并成更大的报文再发出去,减少报文数量与中断开销。这就是 net.ipv4.tcp_autocorking 的作用,默认开启。它与 Nagle 算法、TCP_NODELAY 是不同层面的机制:Nagle 关注的是等待确认与满报文,autocorking 关注的是“队列里已有数据就再等等”,因此排查小包延迟时要全部检查。
基本信息
| 参数路径 | net.ipv4.tcp_autocorking |
|---|---|
| 默认值 | 1(开启) |
| 作用 | 队列有未发数据时延迟当前小包的发送以合并 |
| 相关机制 | Nagle 算法、TCP_NODELAY、TCP_CORK |
| 生效范围 | 内核全局,影响发送路径决策 |
| 观测 | 抓包看小包数量与发送间隔、ss -ti 的发送队列 |
典型使用场景
- 小包计数偏高:确认是否由 autocorking 与 Nagle 共同造成的合并行为
- 交互式服务延迟敏感:评估关闭后是否改善响应时间
- 高频写小数据的应用:理解为什么抓包里看不到“一次 write 一个包”
- 吞吐与包数权衡:与带宽成本、PPS 限额相关时评估合并收益
- 与 TCP_NODELAY 配置组合分析,避免两处设置互相抵消
查看与调整
查看与调整
sysctl net.ipv4.tcp_autocorking # 期望值 1
sysctl -w net.ipv4.tcp_autocorking=0 # 临时关闭(需评估)
ss -tin state established | head -4 # 看发送队列与计时器
tcpdump -i eth0 -nn 'tcp port 8080 and tcp[tcpflags] & tcp-push != 0' -c 20 # 观察小包与 PSH
# 应用侧对照:setsockopt(TCP_NODELAY) 关闭 Nagle 但不等同于关闭 autocorking
# 持久化:写入 /etc/sysctl.d/ 下的配置文件后 sysctl -p相关机制对照
| 机制 | 层级 | 行为 |
|---|---|---|
| autocorking | 内核发送路径 | 队列有数据时延迟当前小包合并发送 |
| Nagle | 内核协议实现 | 未确认数据较少时等待凑满或等确认 |
| TCP_NODELAY | socket 选项 | 关闭 Nagle,小包立即发送 |
| TCP_CORK | 应用可控聚合 | 显式要求攒够再发,配合使用 |
吞吐导向且带宽成本敏感的场景保持默认有利;延迟敏感的交互式服务可以评估关闭,但必须用真实流量压测对比,而不是凭理论推断。
关闭 autocorking 会增加小包数量与中断开销,在 PPS 已经吃紧或按包计费的链路上可能带来相反的效果。