本文目录导读:

tcp_autocorking 是 Linux 内核中一个用于优化小数据包发送的 TCP 特性(自动 Corking),它本身不是一个可以直接查询的“状态变量”,而是一个内核开关/特性。
要理解其“状态”,通常是从以下三个角度来查询和诊断:
全局开关状态(sysctl 参数)
这是最直接的“状态”,这个特性可以通过内核参数 net.ipv4.tcp_autocorking 来开启或关闭。
- 查看当前状态:
sysctl net.ipv4.tcp_autocorking # 或 cat /proc/sys/net/ipv4/tcp_autocorking
- 状态值解释:
1(默认值):开启,内核会尝试自动延迟小数据包的发送,以合并成更大的 TCP 段,提高网络利用率。0:关闭,内核不会进行自动 corking,小数据包会立即发送(可能增加网络交互次数,降低吞吐量)。
运行时状态与触发条件(诊断)
开启后,它并不是始终生效的,内核会根据特定条件动态决定是否启用,其“运行状态”取决于以下条件:
- 数据包条件:当前发送的数据量小于当前 TCP 拥塞窗口的一半。
- 数据包大小:当前发送的数据包大小小于当前预估的 MSS (Maximum Segment Size)。
- 套接字标记:该 socket 没有被应用程序显式地设置
TCP_NODELAY标志(即没有关闭 Nagle 算法)。 - 已缓存数据:该 TCP 连接的发送缓冲区中已经有未发出的数据在排队。
状态解释:
当上述条件全部满足时,内核会进入“自动 corking 状态”,将当前数据暂时缓存,等待后续更多数据一起发送,这会导致 tcp_push() 函数不立刻将数据推送到网络层,从而产生一定的延迟。
如何观察其效果(监控状态)
你无法直接通过 /proc 或 ss 看到 tcp_autocorking 是否正在作用于某个连接,但可以通过以下方式间接观察其影响:
ss -ti (查看 TCP 诊断信息)
这是最接近查看“连接状态”的方法,查看 TCP 连接的内核 Timestamp 和标志位。
ss -ti | grep -A1 "cork"
- 在输出中寻找
cork:- 如果该 socket 当前正在被内核自动 corking,
tstimestamp 字段附近会出现cork标志。 - 注意:
cork标志出现通常意味着该连接曾经或正在处于自动 cork 状态,Nagle 算法也在起作用,会看到nagle标志。
- 如果该 socket 当前正在被内核自动 corking,
perf 或 bpftrace 追踪
如果你需要更精确的实时状态,可以使用 bpftrace 追踪内核函数 tcp_autocork 的调用。
# 追踪所有 tcp_autocork 的调用并打印返回值
bpftrace -e 'kretprobe:tcp_autocork { printf("PID %d, cork=%d\n", pid, retval); }'
- 输出值
cork=1:表示内核决定此时对该 socket 执行自动 corking(即进入延迟发送状态)。 - 输出值
cork=0:表示内核决定不进行自动 corking(立即发送)。
如何回答“状态”?
如果你是在调试网络性能(如延迟突然升高、吞吐量异常),建议按以下步骤回答:
- 基础状态:执行
sysctl net.ipv4.tcp_autocorking,确认是1(开启)还是0(关闭)。 - 当前生效状态:执行
ss -ti查看特定连接,寻找cork标志。 - 行为状态:如果怀疑是自动 corking 造成了问题(小包延迟太高),可以尝试临时关闭它来对比:
# 临时关闭(不重启) sysctl -w net.ipv4.tcp_autocorking=0
观察问题是否消失,如果是,则说明自动 corking 是原因之一。
核心结论:tcp_autocorking 的“状态”默认是全局开启,但它是条件触发的,只在小数据包、有缓存且未禁用 Nagle 算法时激活。
标签: tcp_autocorking 状态