首页/系统/Linux 内核与性能调优速查/tcp_limit_output_bytes 与排队延迟
网络栈调优98 条

tcp_limit_output_bytes 与排队延迟

该参数限制单个 TCP socket 在内核 qdisc 上可排队的字节数, 是权衡吞吐与本地排队延迟的重要开关。

发送侧排队上限

net.ipv4.tcp_limit_output_bytes 限制单个 TCP 套接字在内核发送路径(qdisc 与驱动队列)上可排队等待的字节数。它的作用是抑制本地缓冲膨胀:若允许某个连接堆太多数据在本地队列,RTT 之外还会叠加本地排队时延,表现为延迟抖动。配合驱动的字节队列限制机制,这个参数把排队控制在合理范围,属于吞吐与本地排队延迟之间的权衡。默认值随内核版本变化,应先查询本机现值。

基本信息

参数名net.ipv4.tcp_limit_output_bytes
作用单个套接字在发送侧可排队的字节上限
相关机制BQL(驱动侧字节队列限制)
默认值随内核版本演进,本机现值以 sysctl 为准
方向调大提升突发吞吐,调小降低本地排队延迟

典型使用场景

  • 延迟敏感服务出现难以解释的长尾延迟
  • 大带宽高 RTT 链路上吞吐压不满
  • 排查本地排队导致的延迟抖动
  • 与拥塞算法、qdisc 一起评估端到端行为
  • 统一容器与宿主网络基线时核对取值

查看与变更

查看与变更
sysctl net.ipv4.tcp_limit_output_bytes
sysctl -w net.ipv4.tcp_limit_output_bytes=262144
ss -tin state established | head -20        # 看连接的 cwnd、rtt 与重传
ip -s link show dev ens5 | head -20         # 网卡队列与丢包统计
tc -s qdisc show dev ens5                   # 查看 qdisc 排队情况
nstat -az | grep -iE 'Retrans|TCPLost' | head

方向与代价

方向收益代价
调大发送侧可排队更多,短时突发吞吐更好本地排队时延上升,长尾延迟可能变差
调小本地排队更少,延迟更可控高带宽链路可能压不满带宽
保持默认内核按版本与场景整定的折中极端场景下不是最优
默认值随内核版本演进差异明显,调整前先查本机现值,横向比较要在相同内核版本的机器之间进行。
把它当吞吐开关盲目调大,会掩盖本应排查的应用发送模型问题(例如单连接逐条等待响应),同时放大本地排队延迟。

易错点

  • 当吞吐开关盲目放大:掩盖应用发送模型问题,排队延迟被放大
  • 没有前后对比就固化:忽略内核默认值与设备差异
  • 忽略 BQL:驱动侧字节队列限制同样影响排队行为,需一起看
  • 在单台机器上验证就推广:网络路径不同,结论不可直接套用
  • 只看平均 RTT:本地排队主要体现在尾部延迟,应看分位数据

数据来源与参考

  • Linux Documentation/networking/ip-sysctl.txt
  • 内核源码 net/ipv4/tcp_output.c
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌