[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f7EW4uG5RfkQ9C6fRd7l4yZHennjWIOMyr5l3S_58zdc":3},{"item":4,"related":44},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":35,"sourceName":35,"sourceUrl":36,"status":37,"seoTitle":7,"seoDescription":9,"canonicalUrl":38,"isFeatured":39,"sno":40,"sortOrder":41,"publishedAt":42,"updatedAt":43,"createdAt":43},"ccf00154-c4a8-4439-a8e8-4151b1c20721","article","AF_XDP：Linux 怎样把高速网卡数据直接交给用户程序？","linux-af-xdp-fast-packet-path","AF_XDP 是 Linux 面向高性能收发包的套接字接口，可把 XDP 处理后的数据送入用户态环形队列。本文从网卡、缓冲区和队列讲清数据路径，并说明所谓零拷贝依赖驱动与硬件支持。","普通网络应用发送数据时，数据包通常会经过内核网络栈的多个处理环节。对多数网站和客户端，这种通用路径很合适；但在高包速率的负载均衡、监控或网络设备中，逐包处理成本可能成为瓶颈。AF_XDP 是 Linux 提供的一种面向高性能收发包的套接字接口，让应用能在更靠近网卡的位置处理数据。\n\n## 从 XDP 到用户态队列\n\nXDP 程序可以在网络包进入常规网络协议栈前做快速判断，例如丢弃、转发或送往特定路径。AF_XDP 进一步提供 socket，让 XDP 程序把符合条件的数据包重定向到用户空间。应用与内核通过共享的 UMEM 缓冲区以及多组环形队列协调工作：RX 队列交付收到的数据包，TX 队列提交待发送数据，Fill 和 Completion 队列负责缓冲区补充与回收。\n\n可以把它想成机场行李分拣线。XDP 是入口处的快速分拣员，先按规则决定包裹该走哪条传送带；AF_XDP 则让专门的处理团队直接在对应传送带旁取货，减少不必要的中间站。对需要高速筛选、分析或定制协议处理的程序，这种路径可能有用。\n\n## “零拷贝”不是无条件按钮\n\nAF_XDP 可工作在不同模式下。若网卡驱动和设备支持相应能力，数据可以在设备与用户态共享的内存区域中传递，避免某些额外复制；若条件不满足，则可能采用复制路径。内核文档明确说明，零拷贝要看驱动、设备和队列配置，不能仅凭应用使用 AF_XDP 就断言数据从未复制。\n\n高性能也意味着应用需要承担更多资源管理责任：正确安排队列、缓冲区所有权和批量收发；处理队列耗尽、丢包及设备卸载差异；并确保程序不会因忙轮询而耗尽 CPU。它不是“把内核整个绕过去”的万能捷径，XDP、驱动和内核仍参与关键路径。\n\nAF_XDP 适合对每包成本敏感、且愿意投入专门调优的网络程序。理解它时，重点不是“用户态一定更快”，而是数据包从哪里进入、通过哪些环形队列传递、实际采用复制还是零拷贝模式，以及这份性能收益是否值得额外复杂度。\n\n来源：[Linux 内核文档：AF_XDP](https:\u002F\u002Fwww.kernel.org\u002Fdoc\u002Fhtml\u002Flatest\u002Fnetworking\u002Faf_xdp.html)","\u002Fuploads\u002F2026-10-17\u002Ffdcc8edb-927f-41dc-8802-1e9053c47bfa.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31],{"id":24,"name":25,"slug":26},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":28,"name":29,"slug":30},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":32,"name":33,"slug":34},"8d35e42e-9f5b-4dd9-b30f-dc2c53d06096","硬件","hardware","Linux Kernel Documentation","https:\u002F\u002Fwww.kernel.org\u002Fdoc\u002Fhtml\u002Flatest\u002Fnetworking\u002Faf_xdp.html","published",null,false,45,0,"2026-10-17T00:00:00.000Z","2026-10-17T03:08:33.177Z",[45,54,62],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":52,"createdAt":53},"5f2d281d-4673-42f3-b5e4-4cc68974abc6","SR-IOV：一张实体网卡怎样变成多个可分配给虚拟机的设备？","sriov-pci-device-virtual-functions","SR-IOV 允许支持该能力的 PCIe 设备由物理功能创建多个虚拟功能，供不同工作负载更直接地使用。本文解释 PF\u002FVF 分工、性能价值，以及为什么硬件虚拟化本身不等于完整隔离。","\u002Fuploads\u002F2026-10-13\u002F8b63e99b-a5e9-4f90-bbdb-81b28a2a38be.jpg",44,"2026-10-13T00:00:00.000Z","2026-10-13T02:13:46.843Z",{"id":55,"type":6,"title":56,"slug":57,"summary":58,"coverUrl":59,"authorName":14,"sno":60,"publishedAt":52,"createdAt":61},"2ff97b85-3142-4a75-924f-e6afa339d700","NVMe ZNS：为什么有些 SSD 要求数据按区域顺序写？","nvme-zns-zoned-namespace","ZNS 把 SSD 命名空间划分为必须顺序写入的区域，让主机参与闪存数据布局与回收。本文解释这种分工如何减少无效搬运，也说明它给文件系统和应用带来的管理成本。","\u002Fuploads\u002F2026-10-13\u002Fd2d45247-533f-4b02-b1a8-56f14d1dade3.jpg",46,"2026-10-13T02:13:43.485Z",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":68,"publishedAt":42,"createdAt":69},"0376ac9f-8733-4176-bab5-0d693977ea1e","MTE：处理器怎样给内存加上“标签”，揪出越界访问？","arm-mte-memory-tagging-extension","Arm 的 Memory Tagging Extension 为指针和内存区域附加小型标签，访问时由硬件比对，帮助发现部分越界读写和释放后使用。本文拆解标签如何工作、能抓住哪些错误，以及它为何不是内存安全的万能保险。","\u002Fuploads\u002F2026-10-17\u002Fb3ba5676-d466-4a2a-bf38-f1bc77aaff05.jpg",50,"2026-10-17T03:08:27.651Z"]