摘要

  • Eric Dumazet 目前被列为 Linux 通用网络、TCP 与套接字维护者,并担任 Netdev Foundation 技术指导委员会成员。这些职责与其他维护者和审查者共同承担,因此赋予他重要的合并责任,但并未赋予他对网络栈的单独控制权。
  • 他最明确的具名贡献是 TCP Small Queues,他于 2012 年通过补丁系列引入该机制,以防止单个 TCP 流在传输层以下堆积过多数据。TSQ 将套接字的本地队列额度与数据包完成挂钩,从而在发送端减轻延迟和内存压力,但并未消除路径上的所有队列。
  • 他后来在 sch_fq 和 TCP 内部 pacing 方面的工作将发送时机转化为显式控制面。公平队列调度将流彼此分离,而 pacing 将数据包按时间分布。这些机制支持多种拥塞控制算法,包括使用 BBR 的环境,但 BBR 拥有独立的作者和设计历史。
  • 他最近的工作将数据结构布局、cache line 移动和每套接字状态与大舰队效率联系起来。更广泛的结论是,Linux 网络是一个对 CPU、内存、队列深度和时间进行核算的系统。经济影响可能显著,但公开证据不允许给出具体的财务数字或适用于所有硬件的统一性能结论。

一台快速的服务器可能被它自己的数据包拖慢

故事始于 Linux 主机内的发送队列。应用程序写入了数据,TCP 判定路径还能接受更多数据,内核就把数据交给了更底层。从应用程序的角度看,字节似乎已经离开,但它们可能仍在这台机器内部等待。

吞吐量可能保持高位,从而掩盖延迟。交互式请求可能排在大量传输之后,内存被绑定在缓冲区中,TCP 对“在途”数据的认知与本地堆积的数据越来越脱节。TCP Small Queues 通过限制套接字在 TCP 之下可以送入的数据量,并在数据包完成证明硬件确实前进后才重新允许发送,改变了这种关系。

公共记录工程细节丰富,而在个人传记上刻意克制

关于 Dumazet 的最有力证据来自 Linux 本身:MAINTAINERS 文件、补丁讨论、文档、演讲以及多年的公开审查。这些记录确立了他目前在网络、TCP 与套接字方面的职责,他在 Netdev Foundation 中的角色,以及通过维护者地址体现的与 Google 的公开关联。

但它们并未提供完整传记、目前经确认的职位头衔,或最终的补丁与审查数量。捏造这些细节会削弱文章。因此,本文聚焦于可核查的内容:机制、设计以及审查决策。Dumazet 展现出的是技术责任工程师的形象;他的工作只有经过他人审查、修改、测试和发布之后,才成为共享的基础设施。

维护者身份让他靠近决策,而非凌驾于社区之上

截至 2026 年 8 月 4 日,Linux 记录将他列为通用网络、TCP 与套接字维护者。维护者可以要求重新设计接口、拒绝一项无法持续支持多年的负担,或应用一项被接受的更改,并在其通往主线内核的路径上代表该子系统。

同样这些记录也表明权力是分散的。David S. Miller、Jakub Kicinski 和 Paolo Abeni 共同负责通用网络,Neal Cardwell 共同负责 TCP,专业审查者按补丁主题参与。更改还要经过架构、驱动程序、安全、测试、stable 分支以及最终的内核发布路径。Dumazet 的力量来自他在这个体系内的工作,而不是绕过它。

随着连接数量膨胀,Linux 细节成为基础设施经济

在一台小型设备上,每个套接字多几个字节或一次 cache miss 可能无人察觉。在一台承载数十万连接的服务器上,这些成本成倍上升,以至于与应用争夺 CPU、内存和能源。

“服务器经济”并不意味着公开的财务数字。它指的是技术成本如何转化为连接密度、留给服务的 CPU 时间、为网络保留的内存,以及破坏响应目标的延迟。发行版和运营商选择内核版本、qdisc、拥塞控制算法和网卡。Dumazet 并不控制这些选择;他改进的是这些选择所依赖的共同基础。

熟悉的 TCP 功能掩盖了密集的核算系统

TCP 通常被定义为可靠的字节流。但实现必须决定允许多少未确认数据、何时重传、如何核算内存、如何排序数据包,以及成千上万个套接字如何共享 CPU 和队列。

实现可能在协议上正确,但在操作上糟糕:过深的本地积压、突发、锁竞争,或者消耗缓存的结构。Dumazet 工作中贯穿的主线是核算。字节被记到套接字账上,完成事件返还额度,发送时间被计算,流被分离,热字段与冷字段被区分。目标是只使用必要的资源,而不在主机内部建立第二张隐藏网络。

在 TSQ 之前,发送端会建立自己已无法控制的积压

在 TCP Small Queues 之前,TCP 能将大量数据交给 qdisc 和驱动程序。拥塞窗口在路径层面可能合理,但传输层之下仍可能堆积很长的本地队列。当更紧急的流出现时,应用程序无法收回已向下推送的数据。

这削弱了反馈。TCP 会读取远端确认,但有些数据尚未真正离开主机。队列还消耗内存,尤其是许多流都这样做时。系统需要在保持吞吐量的同时,防止每个套接字把低层当作无限缓冲区。

2012 年的 TSQ 补丁系列把本地队列预算还给了套接字

2012 年的补丁限制了每个套接字在 TCP 之下可以放置的数据量。当本地额度耗尽时,发送停止;当数据包完成时,套接字重新获得发送更多数据的权利。

思路很简单:核算本地字节,并把完成事件当作低层路径确实前进的证据。但其意义在于把控制权交还给理解流的传输层。让链路保持忙碌不再需要预先存入大批数据。应用程序在无需修改代码的情况下,受益于更自律的内部基础。

数据包完成成为主机内实用的反馈信号

完成事件可能看起来只是资源清理。TSQ 把它当作信息:TCP 之下释放了容量,可以为套接字授予新的额度。

这种本地反馈补充了远端 ACK。前者描述传输层以下各层的进展,后者描述路径进展;qdisc、驱动程序和网卡统计则描述其他部分。没有任何单一信号能解释全部。TSQ 让其中的一个信号有助于限制本地过度发送,而不会取消端到端的拥塞控制。

TSQ 消除了 bufferbloat 的一个重要来源,但不是全部队列

TSQ 并未根除 bufferbloat。它处理的是 TCP 之下的发送端积压。队列仍存在于 qdisc、驱动程序、网卡、接入网络、路由器、交换机以及接收端。

更准确的说法更有用:TSQ 降低了单个套接字在主机内部建立大型隐藏队列的能力。它可以降低延迟和内存占用,使 TCP 状态更接近硬件进展,但它不能替代主动队列管理、队列调优或拥塞控制。

限制、offload 和工作负载决定 TSQ 的收益大小

影响取决于本地限制、数据包大小、qdisc、设备队列、分段以及流混合情况。具有短事务的交互式服务与大规模复制任务受益方式不同。

2012 年之后实现也在演进。后来的贡献者调整了限制、集成和边缘情况。原始思路可以归功于 Dumazet,同时也应承认当前形态是长期集体维护的结果。

sch_fq 分离流并把时间引入调度

Dumazet 在 2013 年发布了 sch_fq 的基础工作。调度器为每条流维护状态和一个按时间排序的结构,然后根据目标发送时间放行数据包。新流获得快速服务,而被 pacing 的流等待自己的时间片。

该设计解决两个问题:阻止大量流独占本地队列,并为 TCP 提供实现发送时间的地方。它并不保证所有应用获得相同结果;它提供的是更自律的策略和一个实用的 pacing 执行面。

公平队列是政策选择,不是绝对公平的承诺

“公平”一词可能让人觉得这个机制提供的比实际更多。在队列中分离流并不等于应用性能相等。数据包大小、路径、接收端、拥塞控制算法、offload 和连接数量仍然很重要。

甚至流的定义也是一种政策。一个应用可能打开许多连接,而另一个只用一个。sch_fq 在本地减少单条流的支配地位,但它并未规定用户之间或机构之间的公平。它是一个调度工具,不是全面的公平裁判。

pacing 把速率估计转化为一系列发送时间

拥塞控制算法可能选择正确的平均值,然后一次性允许发送这些数据。平均值仍然正确,但突发会暂时填满队列。

pacing 将数据包分布在时间上。它可以稳定队列、改善共享,并使拥塞模型得到更精确的转译。实现依赖时间戳、定时器、qdisc、分段和网卡。软件中的速率只有在变成线路上的真实间隔时才会成为事实。

pacing 和拥塞控制解决两个不同的问题

拥塞控制算法决定路径使用多少;pacing 决定被允许的数据何时离开。突发可能破坏一个好模型,而完美的 pacing 可能执行一个糟糕的速率。

Dumazet 的工作是使能架构,让不同算法把速率转化为时间。每个拥塞模型的设计和归属仍属于其作者。

BBR 使用 pacing 架构,但拥有独立的作者和历史

BBR 经常与 Dumazet 联系在一起,因为它依赖 pacing,并且诞生在 Google TCP 环境中。这种关联并不使他成为唯一发明者。BBR 有独立的作者、模型和版本。

准确的表述是:队列、pacing、测量指标和套接字核算让后来的算法变得可部署。这种表述保留了 Dumazet 的价值,同时把 BBR 的功劳留给 Neal Cardwell 和其他拥塞控制工程师。

TSO 节省 CPU,也可能重新制造 pacing 试图防止的突发

TCP Segmentation Offload 允许内核把大段数据交给网卡,由网卡稍后拆分。这降低了每包成本,但在时机决策和真实发送之间增加了一层硬件。

如果大段数据作为整体被释放,网卡可能产生突发。应当把 TSQ、qdisc、TSO、驱动程序和硬件作为一个整体来理解。如果优化不与流量形态配合,它可能对 CPU 有利,却对时间有害。

quantum、时间戳和网卡行为必须就同一现实达成一致

内核以调度单位、定时器精度、时间戳、offload 单位和硬件队列运行。过大的 quantum 会重新引发突发,过小的会消耗 CPU,而网卡实现差异会改变线路上的实际行为。

因此 qdisc 是容量规划的一部分,而不是细节。开发人员必须测量完整路径;任何只提及拥塞算法或链路速率的基准测试都遗漏了重要部分。

TCP 内部 pacing 降低了对特定 qdisc 的依赖

2017 年,Dumazet 发布了 TCP 内部的 pacing。传输层更有能力根据自己的速率和定时器延迟发送,而不必完全依赖某个 qdisc 按预期方式存在。

qdisc 并非变得不重要;它仍然排序并执行政策。一部分逻辑移向拥有意图的层级,但最终时机仍是 TCP、qdisc、驱动程序和网卡共同作用的结果。

qdisc 选择仍然是运营者的决定,会真正改变服务

Linux 为不同目标提供队列。sch_fq 适合 pacing;FQ-CoDel 结合了流分离和主动队列管理。二者不是一回事。

发行版、云镜像、设备和容器主机的默认设置各不相同,offload 可能把执行转移到硬件。内核提供能力;运营者决定它是否会成为服务中的真实行为。

每个套接字多几个字节会变成整支舰队的约束

每条连接都带有序列号、定时器、拥塞状态、队列和核算字段。在规模巨大时,每个字节都会被放大,每个频繁访问的字段都成为缓存负担。

降低每个套接字的内存可以提高密度,更好的布局可以减少 cache miss 和核间一致性流量。这是与服务器经济最强的一环,但它不允许得出通用的节省比例或个人财务价值。

当每次数据包都触碰 cache line 时,它就成为基础设施

处理器移动的是完整的 cache line,而不是单独的源字段。如果热数据与冷字段相邻,就会移动不必要的字节;如果不同核心修改同一 line 中的值,就会产生一致性竞争。

Dumazet 最近的工作正是以这种物理视角阅读代码。分离热字段和冷字段可以减少随数据包和套接字数量放大的内存移动。结果取决于处理器和工作负载,因此不能把某个舰队的 profile 当作所有系统的通则。

2024 年的结构工作展示了成熟的性能工程阶段

2024 年的演讲从 profiling 开始:哪些字段是热的,哪些 line 在移动,哪些结构主导内存。工具可以建议布局,但不能替代关于对齐、锁、兼容性和可维护性的审查。

在成熟的架构中,收益可能来自消除一次 cache miss 或移动一个字段,而不是新算法。这不够光鲜,但可能决定大规模场景下的实际性能。

超大规模 profile 是强证据,但通用知识仍不完整

大型运营商看到的连接数量、网卡和流量规模难以复现。他们能暴露实验室中看不到的成本。Dumazet 与 Google 的关联提供了这类生产证据。

但部分工作负载、工具和数据仍是私有的。演讲可以解释方法和大方向,却不必公开所有输入。需要做的是约束结论,并尽可能把私有观察转化为公开测试和 CI。

锁和接收队列属于同一个资源故事

本文聚焦发送路径,但 Dumazet 的记录也包括套接字和接收路径。到达的数据包需要轮询、内存、分类、队列以及跨核交付。在高速率下,共享状态和锁会变成成本。

Linux 通过批处理、工作转移和减少竞争来降低这些成本。原则相同:既要足够协调以保证正确,又不能让核算吃掉应用容量。

批处理提高吞吐量,也改变延迟和公平

把数据包或完成事件批量处理,可以分摊锁、调用和缓存移动的成本。NAPI、驱动程序和 offload 都依赖这一点。

但批量需要等待凑齐,而且可能以突发形式到达。批量越大,摊薄效果越好,但第一个元素的等待时间或单个流的占用时间也越长。TSQ、公平队列和 pacing 并不是要对抗批处理,而是给它设定边界,以保住反馈和延迟。

TCP 性能由可能互相抵消的各个层共同形成

拥塞算法决定意图,TCP 制造数据包和时机,TSQ 限制积压,qdisc 排序,TSO 聚合,驱动程序准备内存,网卡发送,然后网络添加自己的队列和丢失。

粗糙的 offload 可能抵消精细的 pacing,过度的入队可能压垮低延迟 qdisc,新锁可能抹平布局收益。Dumazet 的工作之所以重要,正是因为他处理这些层之间的连接。

公开补丁审查把局部优化变成共享架构

一项更改始于性能承诺:更低的延迟、内存或 CPU。要进入 Linux,它必须面对 netdev 关于测量、通用性、罕见架构、测试和未来成本的提问。

维护者可能要求拆分补丁系列,拒绝供应商专属抽象,或推迟尚未准备好的更改。这条路比内部补丁慢,但更持久。Dumazet 的部分职责就是判断 Linux 能否支持一项更改很多年。

net 和 net-next 把紧急修复与未来开发分开

修复通常进入 net,功能和重构进入 net-next。这样可以防止把当前维护与下一版本的更改混在一起。

边界需要判断。“修复”可能改变行为,而“功能”可能暴露旧缺陷。维护者要求拆分系列以展示风险;供应商的发布期限本身不足以成为合并理由。

审查、拒绝和重新设计不会体现在提交数量里

提交数衡量可见的作者身份,却无法衡量一次迫使接口改变的审查,或一次阻止长期负担的拒绝。应用补丁是合并责任,不等于声称发明了思路。

本文应同时记录可归因的 TSQ、sch_fq、pacing 和布局工作,以及无法简化为排行榜的维护职责。而且并非 Dumazet 合并的所有内容都是他的个人发明。

测试降低风险,但无法覆盖 Linux 将遇到的每台设备

构建、selftest、KUnit、syzbot、驱动程序实验室和下游部署能发现许多回归,但无法覆盖每种 CPU、网卡、qdisc 和工作负载。

一项优化可能改善超大规模环境,却损害罕见设备。经验、兼容性和回滚仍然必要。测试加强治理,但不会取消判断。

回移到 stable 是在主线之后做出的第二个决定

补丁进入主线并不自动进入所有 stable 分支。它必须是真实、范围有限且低风险的修复,然后发行版还要再做一次决定。

性能更改往往依赖旧分支中不存在的上下文。影响是分阶段传播的:upstream、stable、发行版、云、配置。没有任何一个人控制整条链条。

当前 TCP 和套接字维护是有意共享的

MAINTAINERS 在 Dumazet、Neal Cardwell 和其他人之间分配责任。这减少了对单个人的依赖,并融合了拥塞、套接字、驱动程序和测试方面的知识。

但共享需要清晰的归属。重叠区域可能在所有人都以为别人负责时出现真空。健康的交接要转移理由、测试和权限,而不仅仅是名字。

Netdev Foundation 可以提供资金,而不成为合并权威

该基金会在 Linux Foundation 监督下支持 CI、工具、差旅和研究,Dumazet 是技术指导委员会成员。资助并不保证补丁被接受。

深度维护需要资金、时间和硬件。承认这一点并不意味着把上游合法性转移给资助方。资金应当增强社区做决定的能力,而不是购买例外。

Google 的关联提供工程能力,但不拥有 Linux TCP

Google 邮箱证明了关联,却未证明完整的职位头衔。超大规模公司可以资助 profiling、硬件和审查时间,这些在上游之后惠及所有人。

问题在于部分证据是私有的,而且大型舰队的优先级更明显。公开审查是平衡点:补丁在 Google 之外也必须保持通用、可理解且可接受。公司提供时间和证据,但不拥有这个栈。

下游运营者决定上游改进是否会改变服务

发行版选择内核和回移,云选择 qdisc 和拥塞控制,设备运行旧版本,网卡供应商决定能力,应用塑造流量形态。没有关于 TSQ 或 sch_fq 使用情况的可靠全球普查。

机制可能存在却未启用,也可能默认运行而用户不知道其名称。Dumazet 的影响广泛且间接:他改变共同选项,然后每个运营者将其转化为实践。

用户态栈在专业工作负载上竞争,而非 Linux 的所有角色

DPDK、VPP 和应用栈绕过内核的部分来追求高速率和精细控制,但它们通常需要专用核心、huge pages、设备绑定和独立的运营模型。

Linux TCP 提供更广泛的集成,包括套接字、安全、命名空间、监控和驱动程序。Dumazet 的工作降低了通用路径的成本,但并未声称它对每种场景都是最优。旁路方案适用于特殊场景,而 Linux 是大多数场景的共同基础。

Linux 保持默认地位,因为集成比原始包速率更广

栈必须快速、兼容、安全、可观测,并在数千种设备上得到支持。独立路径可能提供更高的 pps,却增加运营和支持成本。

应用使用普通套接字,并继承 TSQ、pacing 和内存核算。这种不可见性是基础设施优势的一部分:即使用户不知道作者的名字,影响仍然存在。

更快的主机并不证明网络路径更好

更好的本地队列无法修复拥塞的接入链路、过载的接收端或丢包的路由器。TSQ 和 pacing 调整发送端,但不控制整条路径。

它们可以减少延迟的一个来源,让发送更平滑,但应用结果仍由发送端、接收端、网络和配置共同决定。

单一基准测试不代表每台服务器、网卡和工作负载

数据包大小、连接数、CPU、缓存、网卡、offload、qdisc、定时器、内核版本和工作负载都会改变结果。来自 Google 的 profile 揭示了真实成本,却无法预测其他舰队的精确百分比。

好的报告会说明测量条件。Dumazet 的演讲是带归属的运营证据;而泛化需要公开测试和独立测量。

接班是技术问题,因为部分设计存在于人的记忆中

可能存在因旧网卡、仍在使用的 API 或多年前修复过的回归而产生的奇怪限制。仅凭代码并不总能解释原因。

资深维护者承载这些历史,由此产生一定的关键人物风险。文档、测试、档案和新维护者把个人记忆转化为机构知识。良好的接班保留原则,同时允许为新硬件调整实现。

硬件 pacing 和设备内存可能再次移动边界

现代网卡能够调度数据包、管理更多队列、提供遥测和本地内存。它们降低 CPU 占用,并把行为转移到固件。

挑战是协调性的:Linux 必须表达意图、观察硬件实际做了什么,并在出现差异时恢复。API、时间戳和错误变得与速率一样重要。Dumazet 的原则依然成立:靠近意图方的核算、反馈、隐藏队列的边界,以及对边界的清晰表达。

下一个收益可能来自缓存经济,而非新的传输公式

还会出现其他拥塞算法,但大型主机上的实际收益可能来自拆分结构、移除锁、调整批量,或阻止 cache line 在核心之间跳动。

这些是没有品牌标签的更改,却惠及许多算法。2024 年的工作展示了一个成熟阶段:栈按物理成本被衡量。问题从“哪个协议会赢?”变成“每条连接在无声中消耗了机器多少资源?”

Dumazet 的持久贡献是资源纪律,而非孤胆英雄神话

一种糟糕的叙事让他独自成为现代 TCP 和 BBR 的发明者;另一种叙事把个人从社区中抹去。证据支持更精确的中间立场。

他提出了 TSQ,为 sch_fq 的基础做出贡献,开发了 TCP 内部 pacing,展示了布局的重要性,并且在共享维护体系中承担责任。他贡献的核心是把数据包和套接字视为对有限 CPU 时间、内存、队列和缓存局部性的索取。

最终影响分布在设计、审查、合并和运营之间。提交容易归因,但舰队密度或得以避免的故障很难归因。这种困难不为夸大也不为抹除辩护;它说明基础设施价值源于可识别的工程决策和集体执行。