首页/系统/Linux 内核与性能调优速查/net.ipv4.tcp_autocorking 小包合并
sysctl 内核参数72 条

net.ipv4.tcp_autocorking 小包合并

内核在发送路径尝试合并小数据(队列中已有未发送数据时避免立即发出),默认开启;减少包数但可能略增延迟。

什么是 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_NODELAYsocket 选项关闭 Nagle,小包立即发送
TCP_CORK应用可控聚合显式要求攒够再发,配合使用
吞吐导向且带宽成本敏感的场景保持默认有利;延迟敏感的交互式服务可以评估关闭,但必须用真实流量压测对比,而不是凭理论推断。
关闭 autocorking 会增加小包数量与中断开销,在 PPS 已经吃紧或按包计费的链路上可能带来相反的效果。

易错点

  • 它与 TCP_NODELAY/Nagle 是不同层面的机制,排查小包延迟时都要检查,只改一处往往没效果
  • 关闭会增加小包数量与中断开销,必须用真实流量验证后再决定,不能只看单次延迟测试
  • 把抓包中看不到“一次 write 一个包”当成应用有 bug,实际可能只是合并行为正常生效
  • 临时关闭后未写入持久化配置或未恢复,形成配置漂移,后续排查基于错误的基线

数据来源与参考

  • Linux 内核 Documentation/networking/ip-sysctl.rst
  • man 7 tcp
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌