摘要

  • Eric Dumazet 目前担任 Linux 通用网络、TCP 与 sockets 的维护者,并是 Netdev Foundation 技术指导委员会(TSC)成员。这些职责与其他维护者和评审者共同承担:代表强集成责任,而非对内核网络的排他性权威。
  • 他署名最清晰的贡献是 TCP Small Queues,于 2012 年引入,目的是阻止单个 TCP 流在传输层以下的队列中堆积过多数据。通过把 socket 的本地信用与数据包完成事件挂钩,TSQ 降低了发送端的延迟和内存压力,但没有消除路径上的所有队列。
  • 后来在sch_fq和内核 pacing 上的工作,把传输时刻变成了显式控制。公平队列分离不同流;pacing 在时间上分散数据包。这些机制支撑多种拥塞控制,包括使用 BBR 的环境,但 BBR 有自己的作者和演进历史。
  • Dumazet 最近的工作把结构布局、缓存行流量和每 socket 状态与大机群的效率联系起来。启示是:Linux 网络也是 CPU、内存、队列深度和时间的核算。经济影响可能显著,但公开数据不允许给出精确财务价值,也不能承诺所有系统获得相同收益。

一个高速服务器仍可能在自己的数据包后面浪费时间

故事始于传输队列。应用写入了数据,TCP 认为还能发送更多,内核把这些字节交给更底层。从应用视角看,它们似乎已经离开;实际上,它们可能仍在本机等待。

高吞吐掩盖了延迟。交互式请求排在大批量传输之后,缓冲区占用内存,“在途”数据的含义与只是在本机堆积的数据不再一致。TCP Small Queues 通过限制单个 socket 能放到 TCP 之下的数据量,并在硬件实际完成工作时返还发送能力,改变了这种关系。

公开记录在工程上丰富,在传记上刻意受限

最可靠的证据来自内核本身:MAINTAINERS、补丁讨论、文档、演讲和多年公开评审。它们支撑他目前在通用网络、TCP 和 sockets 的职责、他在 Netdev Foundation 的参与,以及通过维护者邮箱可见的 Google 关联。

没有完整且经授权的传记、经核实的当前公司职位、补丁总量统计或他时间的精确分配。用看似合理的细节填补这些空白会降低准确性。本档案聚焦于可观察的机制和决策。Dumazet 是一名承担技术责任的工程师,他的工作只有在经过他人评审、修改、测试和部署后才成为基础设施。

维护者身份让他接近决策,而不是高于社区

截至 2026 年 8 月 4 日,Linux 记录将他列在通用网络、TCP 和 sockets 条目下。维护者可以要求重新设计接口、拒绝维护成本过高的方案、合入已接受的更改,并代表子系统推动合并到主线。

同一来源也显示权威是共享的。David S. Miller、Jakub Kicinski 和 Paolo Abeni 出现在通用网络条目;Neal Cardwell 共同维护 TCP,专业评审者按补丁范围工作。架构、驱动、安全、测试、稳定版和内核最终流程构成其他边界。Dumazet 的影响力大,正因为他在这个分布式系统内运作。

当连接数增长时,Linux 变成了经济基础设施

在一台小机器上,每个 socket 多几个字节或一次额外缓存未命中可能无关紧要。在承载数十万连接的服务器上,成本成倍放大,直到与应用争抢 CPU、内存和能耗。

“服务器经济”不是公开的节省金额。它是把技术开销转化为密度、剩余 CPU 能力、为网络保留的内存以及本地队列造成的延迟。发行版和运营者选择内核、qdisc、拥塞算法和网卡。Dumazet 不控制这些选择;他改进的是公共起点。

TCP 熟悉的功能背后隐藏着一套密集的核算系统

TCP 被描述为可靠的字节流,但它必须决定可以挂起多少数据、何时重传、如何核算内存、如何排序数据包,以及如何在数千个 socket 之间分配 CPU 和队列。

实现可能正确但性能很差:本地积压过大、突发流量、锁,或者浪费缓存的结构。Dumazet 工作的主线正是核算。字节归属到 socket,完成事件返还信用,发送时间被计算,热字段与冷字段分离。目标是在不制造主机内部第二个隐藏网络的情况下,保持链路高效。

在 TCP Small Queues 之前,发送端可能制造一个自己已无法控制的积压

在 TSQ 之前,TCP 可以把过多流量交给 qdisc 和驱动。拥塞窗口可能正确,而本地队列仍在传输层以下扣留数据包。当更紧急的流出现时,应用无法收回这些数据。

这削弱了反馈:TCP 观察路径上的确认,但部分数据尚未离开主机。它还消耗内存,尤其是许多流同时这样做时。必须在不牺牲吞吐的情况下,避免每个 socket 把下层当作无限存储。

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

2012 年的补丁按 socket 限制了排在 TCP 之下的数据量。本地信用耗尽时,socket 停止发送;数据包完成时,它恢复发送许可。

思想很小:核算本地字节,并用完成事件作为进展信号。控制权回到真正理解该流的传输层。不再需要一次性投入大批数据来保持链路繁忙。从未听说过 TSQ 的应用继承了更自律的行为。

数据包完成事件变成了主机内部的有用信号

完成事件看起来可能只是清理工作。TSQ 把它当作信息:下层推进了,因此 socket 可以获得新的信用。

这种本地反馈补充了远端确认。一个描述 TCP 之下的进展;另一个描述路径上的进展。qdisc、驱动和网卡的统计展示其他观察点。没有任何单一信号能解决所有问题。TSQ 利用其中一个来限制本地过量,而不替代端到端拥塞控制。

TSQ 减少了 bufferbloat 的一个来源,而不是路径上的所有队列

TSQ 没有消除 bufferbloat。它限制发送端的本地积压。队列仍存在于 qdisc、驱动、网卡、接入链路、路由器、交换机和接收端。

更准确的表述更有用:该机制降低单个 socket 制造过大隐藏队列的能力。它可以降低延迟和内存占用,并使 TCP 状态更接近设备进展。它不替代主动队列管理、合理配置或拥塞控制。

限制、卸载和工作负载决定 TSQ 能带来多少帮助

效果取决于本地限制、数据包大小、qdisc、设备队列、分段和流量混合。交互式服务和大规模复制对它的反应不同。

实现自 2012 年以来也一直在演进。其他贡献者调整了集成并修复了多个案例。把 Dumazet 列为起源是合理的,但不应把当前机制说成一块冻结且只属于他的作品。

sch_fq分离了流,并把时间放进调度器

2013 年,Dumazet 发布了sch_fq调度器。它按流维护状态,并用按时间排序的结构按发送时刻释放数据包。新流可以较早获得服务;受 pacing 限制的流等待自己的时刻。

该设计避免大批量传输独占本地队列,并给 TCP 一个执行 pacing 的位置。它不保证应用之间完全平等;它提供了更自律的服务策略和发送时间戳的实用接口。

公平队列是一种政策选择,不是结果平等的承诺

“公平”并不意味着所有应用都会获得相同性能。数据包大小、路径、接收端、拥塞、卸载和连接数都会继续改变结果。

流本身的定义也是政策。一个应用可以打开许多连接,另一个只打开一个。sch_fq减少本地独占,但不替用户或企业决定公平。对运营者来说,它是仲裁工具,不是普遍保证。

Pacing 把估算速率转化为一串发送时刻

算法可能选对了速率,却仍以突发方式放出。平均值看起来不错,但队列受到冲击。

Pacing 在时间上分散数据包。它可以稳定队列、改善共存,并更准确地表达拥塞模型。实现依赖时间戳、定时器、qdisc、分段和网卡。软件速率只有转化为链路上的物理时刻才是真实的。

Pacing 和拥塞控制解决的是不同部分

拥塞控制决定可以使用多少路径;pacing 决定被允许的数据何时发出。好的模型可能被突发毁掉,完美的 pacing 也可能执行错误的速率。

Dumazet 的基础设施让多种算法能在时间上表达速率。每个模型属于它自己的设计者。

BBR 使用 pacing,但有自己的作者和历史

BBR 常因依赖 pacing 且诞生于 Google 环境而与 Dumazet 关联。这不意味着他是唯一发明者。该算法有独立的作者、模型和版本。

Dumazet 的贡献是基础性的:队列、pacing、探测和 socket 使其他控制算法可行。这一表述既承认他的重要性,也保留 Neal Cardwell 和其他拥塞控制工程师的功劳。

TSO 节省 CPU,也可能重新制造 pacing 想避免的突发

TCP 分段卸载(TSO)允许把大段交给网卡,由网卡之后拆分。这降低了每包成本,但把硬件插在时间决策和实际发送之间。

如果大块一次发出,网卡可能制造突发。TSQ、qdisc、TSO、驱动和硬件必须作为一个系统处理。省下的 CPU 如果没有协调,可能恶化延迟。

量子、时间戳和网卡行为必须描述同一种现实

内核使用量子、定时器分辨率、时间戳、卸载单位和物理队列。过大的量子会重新制造突发;过小的量子消耗 CPU;不同粒度的网卡改变输出。

因此 qdisc 是容量规划的一部分。开发者必须测量完整路径,只引用拥塞控制或链路速度的基准测试会忽略大部分机制。

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

2017 年,Dumazet 发布了 TCP 内部 pacing。传输层获得了按速率和定时器保留流量的更强能力,而不再完全依赖特定调度规则。

qdisc 对排序和策略仍然重要。逻辑更接近承载意图的子系统,但最终发送仍分布在 TCP、调度器、驱动和网卡之间。这是逐层演进,不是完全替代。

队列规则仍是影响服务的运营决策

Linux 为不同目标提供多种 qdisc。sch_fq适合 pacing;FQ-CoDel 结合按流分离和主动队列管理。它们并不相同。

默认设置因发行版和环境而异。云镜像、网络设备和容器主机可能做不同选择,卸载也可能改变执行位置。上游提供机制;运营者决定它是否真正塑造服务。

每个 socket 几个字节也会变成机群级约束

每条连接保存序号、定时器、拥塞状态、队列和计数器。在大规模下,每个字节都被放大,每个频繁字段都占用缓存。

每个 socket 更少的内存可以提高密度;更好的布局减少缓存未命中和一致性流量。这是与服务器经济最直接的桥梁,但无法据此计算普遍财务收益,也无法以此给个人工作定价。

当缓存行在每个数据包上都被触碰时,它就变成了基础设施

CPU 移动整条缓存行。热数据与冷字段相邻会让无用字节被搬运;两个 CPU 修改同一缓存行会产生一致性开销,即使它们改动的是不同值。

Dumazet 最近的工作采用这种物理视角。分离冷热字段可以减少随数据包和 socket 数量增长的内存流量。收益取决于处理器和负载;生产环境的一次剖析不能成为普遍定律。

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

2024 年的演讲从剖析开始:哪些字段是热的,哪些缓存行在移动,哪些结构占据内存。工具可以建议重排,但不能替代关于对齐、锁、兼容性和可维护性的评审。

在成熟基础设施中,大收益可能来自消除一次缓存未命中或移动一个字段,而不是发布新算法。它不那么显眼,但在规模上起决定作用。

超大规模剖析是强证据,也是不完整的公开科学

大型运营者能看到难以复现的流量和硬件。他们能发现微基准测不出的成本。Dumazet 与 Google 的关联正属于这种背景。

部分负载和数据仍属私有。一场演讲可以展示方法和方向而不公开所有输入。这需要限定条件,而不是丢弃。最佳结果是更多私有观察转化为公开测试和工作负载。

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

虽然主线在发送路径,Dumazet 的经历也覆盖 socket 和接收路径。入站数据包需要轮询、分配、分类、排队和跨 CPU 分发。高速率下,锁和共享状态成为成本。

Linux 通过迁移工作、批量操作和减少争用来缓解。原则相同:在保证正确性的前提下使用足够协调,不让核算吞噬应用。

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

把数据包或完成事件批量处理可以摊薄锁、调用和缓存开销。NAPI、驱动和卸载都依赖这一点。

批量需要等待聚集成形,并可能以突发方式到达。大批量提高效率也增加等待。TSQ、公平队列和 pacing 不消灭批量;它们施加限制以保留反馈和延迟。

TCP 性能来自可能互相抵消的层次

算法定义意图;TCP 生成数据包;TSQ 限制积压;qdisc 排序;TSO 聚合;驱动映射;网卡发送;网络再增加队列和丢包。

精确 pacing 可能被粗略分段破坏;低延迟 qdisc 可能被过量入队抵消;紧凑布局可能因新锁而失效。Dumazet 在这些接缝上工作,改善已安装的路径而不是忽略它。

公开评审把局部优化变成共享基础设施

一项改进最初是一种声明:更低的延迟、内存或 CPU。要进入 Linux,它必须面对 netdev 的要求:方法论、通用抽象、罕见架构、测试和未来成本。

维护者可以拆分补丁系列、拒绝厂商专属接口或推迟补丁。这比私有变更慢,但更可持续。Dumazet 的权威包括评估的不仅是今天的结果,还有明天的维护。

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

修复通常进入net;新功能进入net-next。这避免把紧急维护与下一版本的重大重构混在一起。

边界需要判断。一个修复可能改变行为;一个功能可能暴露旧缺陷。维护者拆分系列以明确风险,并防止商业时间表取代技术就绪度。

评审、拒绝和重新设计不会出现在提交统计里

提交统计衡量可见的作者身份,但衡量不了一句迫使重新设计的话,或一次避免多年成本的拒绝。合入补丁意味着承担集成责任,不意味着发明了想法。

本档案结合可归属的机制与管理工作。TSQ、sch_fq、pacing 和布局是清晰的,但不足以概括数十年的评审,也不能把所有合入的补丁都说成个人创作。

测试降低风险,但无法代表 Linux 将遇到的每台机器

构建、自测、KUnit、syzbot、实验室和下游测试能发现回归,但不能覆盖所有 CPU、网卡、qdisc 和负载。

为超大规模优化的改进可能损害稀有设备。经验、兼容性和回滚仍然必要。测试强化治理,但不消除判断。

稳定版回溯补丁需要在主线之后再做一次决定

主线补丁不会自动进入所有稳定分支。它必须是真的修复、边界清晰且安全。发行版还要再做一次决定。

性能相关改动可能依赖旧分支缺失的代码。影响按阶段扩散:上游、稳定版、发行版、云和配置。没有人控制整条链。

当前 TCP 和 sockets 的维护是被有意共享的

MAINTAINERS在 Dumazet、Neal Cardwell 和其他评审者之间分配工作。这降低对单个人的依赖,并组合拥塞控制、socket、驱动和测试的知识。

多元结构要求清晰的归属。重叠区域若人人等待他人,就会产生空白。健康的继任分散权威,并保留决策的原因。

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

该基金会在 Linux Foundation 之下,支持 CI、工具、差旅和研究。Dumazet 参与 TSC。拨款不保证补丁合并。

这种区分是健康的:深度维护需要资金,但上游合法性来自公开证据。资助应增强决策能力,而不是购买特例。

Google 关联带来能力,但不拥有 Linux TCP

Google 邮箱证明关联,而非完整职位。超大规模厂商可以资助剖析、硬件和评审,之后惠及整个生态。

不对称在于其工作负载和数据并非完全公开。公开评审是对冲:补丁必须通用,并能在 Google 之外被接受。公司提供时间和证据;它不拥有栈。

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

发行版选择内核;云选择 qdisc 和拥塞控制;网络设备选择版本;厂商选择能力;应用产生流量。没有对 TSQ 或sch_fq使用情况的完整普查。

机制可能存在但未启用,或默认启用却未被察觉。Dumazet 的影响广泛而间接:改变公共选项集合;每个运营者把它转化为实际体验。

用户态网络栈争夺专门工作负载,而不是 Linux 的全部功能

DPDK、VPP 和自有栈绕开内核的部分以获取高速率,代价是专用核、大页和独立运营模型。

Linux 集成 socket、安全、命名空间、可观测性和驱动。Dumazet 的工作降低通用路径的成本,但没说它适合一切。旁路服务特定场景;Linux 仍是广泛基础。

Linux 仍是默认选择,因为集成比原始速度更重要

一个协议栈需要快速、兼容、安全、可观测且可维护。一条孤立路径可能有更高的每秒包数,但运营成本更高。

Linux 应用继承 TSQ、pacing 和按 socket 的资源核算。这种不可见是优势:即使用户不知道作者名字,收益仍在。

更快的主机并不能证明网络路径改善了

更短的本地队列不能修复拥塞的接入链路、慢速目的地或丢包路由器。TSQ 和 pacing 管理发送端,而不是整个路径。

它们可以减少一个延迟源并让流量更规律,但不保证应用结果。端到端性能仍取决于应用、接收端、路由和配置。

一个基准测试无法代表所有服务器、网卡和工作负载

数据包大小、连接数、CPU、缓存、网卡、卸载、qdisc、定时器、内核和负载都会改变结果。Google 的剖析可以揭示真实成本,但不能预测另一个机群的百分比。

好的沟通保留条件。Dumazet 的演讲是可归属的运营证据;要推广还需要公开测试和独立测量。

继任是技术问题,因为部分设计存活在记忆中

古怪的限制可能源于旧网卡、仍被使用的 API 或多年前解决的回归。代码不一定讲述这段历史。

资深维护者携带上下文。文档、测试、归档文件和新评审者把私人记忆转化为机构知识。继任需要保留原则,并允许适应未来硬件。

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

现代网卡对数据包编程、控制队列并暴露遥测或本地内存。它们降低 CPU 并让行为向固件转移。

Linux 需要表达意图、观察结果,并在模型出现分歧时恢复。驱动 API、时间戳和错误变得和速率一样重要。原则不变:反馈、限制隐藏队列和可观测性。

缓存经济可能带来比新传输公式更大的收益

新算法还会出现,但下一项实质收益可能来自更好的布局、锁或批处理。它没有醒目品牌,却能惠及多个应用。

2024 年的工作展示了一个按物理成本评估的成熟栈。问题从“哪种协议胜出?”变成“每条连接消耗多少机器资源?”。

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

夸张的说法会把他变成现代 TCP 和 BBR 的发明者;另一种说法会让他消失在社区中。证据允许精确表述。

Dumazet 引入了 TSQ,签署了sch_fq的基础工作,开发了内部 pacing,并展示布局的重要性。他还在一个共享系统中维护关键领域。他的贡献是把数据包和 socket 视为对时间、内存、队列和 CPU 局部性的请求。

最终影响在设计、评审、集成和运营中分散。一个提交可归属;一台更密的机群或一次被避免的故障不可归属。这种困难不授权夸大或抹去:它表明基础设施价值源于一条集体链条,其中包含可识别的个人决策。