[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f9ySTnsEVrP8PpNzulBVURdnCMNHN1aYoZ7KzHzI3wW8":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":36,"sourceUrl":37,"status":38,"seoTitle":7,"seoDescription":9,"canonicalUrl":35,"isFeatured":39,"sno":40,"sortOrder":41,"publishedAt":42,"updatedAt":43,"createdAt":43},"c73f0837-c815-4975-9594-980ecda0ba97","article","DPDK Poll Mode Driver：为什么有些网卡程序宁可轮询，也不等中断？","dpdk-poll-mode-driver-network-performance","DPDK PMD 通过用户态持续轮询网卡队列换取低延迟数据路径，但会占用专用 CPU 核心。本文解释收益、资源代价与适用场景。","传统网卡驱动常依赖中断：有数据包到来时，设备通知 CPU 处理。DPDK 的 Poll Mode Driver（PMD，轮询模式驱动）采取不同思路：应用在用户态持续检查网卡队列描述符，发现数据就直接处理，而不是等待每个包触发中断。\n\n可以把两种方式想象成前台等待电话和专人盯着传送带。中断像来一件货就按铃，空闲时不必一直查看；轮询则是工作人员持续盯着传送带，一有货立刻拿走。若包率很高、处理延迟要求严格，避免频繁中断与上下文切换可能提升处理效率。DPDK 将以太网设备队列、缓冲区和用户态数据路径组合起来，常用于网络功能、虚拟交换和高性能数据面。\n\n收益来自明确的代价：轮询线程常驻 CPU，即使暂时没有数据也会消耗处理器时间。很多部署会为网卡队列分配专用核心，并精心安排队列与核心、内存 NUMA 节点之间的对应关系。若核心不足、突发流量低或应用只是偶尔收包，轮询可能浪费资源，甚至挤压其他工作负载。它不等于“免费降低延迟”。\n\nPMD 还要求应用使用相应的用户态框架与驱动路径，正确管理巨页、设备权限、队列、缓冲区和包生命周期。绕过常规内核网络栈后，通用操作系统工具与协议功能不一定以原样提供，监控、故障排查和安全隔离都要重新设计。不能把 PMD 当成普通服务器“开启一项设置就更快”的通用优化。\n\n判断是否值得用，要先了解真正瓶颈：是系统调用和中断成本，还是网络带宽、应用处理逻辑、内存复制或上游设备？再按真实包大小、包速率和突发模式做测量，同时观察 CPU 占用、尾延迟和每包成本。DPDK 能把数据路径控制权交给应用，但高性能系统也因此要求更细致的资源规划。\n\nPoll Mode Driver 的核心思想，是用持续轮询换取及时响应与更可控的数据处理路径。它适合高包率、愿意预留专用核心的场景；对一般应用，内核驱动和中断机制往往更省心、更节能。\n\n来源：[DPDK 官方文档：Ethernet Device API](https:\u002F\u002Fdoc.dpdk.org\u002Fguides\u002Fprog_guide\u002Fethdev\u002Fethdev.html)","\u002Fuploads\u002F2026-10-06\u002Faf72ff9d-904f-4669-b963-4dd680762df2.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},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":28,"name":29,"slug":30},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug",{"id":32,"name":33,"slug":34},"8d35e42e-9f5b-4dd9-b30f-dc2c53d06096","硬件","hardware",null,"DPDK Official Documentation：Ethernet Device API","https:\u002F\u002Fdoc.dpdk.org\u002Fguides\u002Fprog_guide\u002Fethdev\u002Fethdev.html","published",false,44,0,"2026-10-06T00:00:00.000Z","2026-10-06T07:51:30.502Z",[45,54,62],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":51,"publishedAt":52,"createdAt":53},"d4a1ef13-fa42-41f3-a9d2-635f47d801d0","RISC-V PMP：处理器怎样给不同特权级划出内存禁区？","riscv-pmp-physical-memory-protection","RISC-V PMP 由高特权级软件配置物理内存区域访问规则，并由处理器在较低权限代码访问时执行检查。本文区分 PMP 与虚拟内存，介绍它在固件和嵌入式安全中的作用及实现边界。","\u002Fuploads\u002F2026-10-13\u002Fecfdd306-c8d2-4bfa-984e-7f579fd86f61.jpg",41,"2026-10-13T00:00:00.000Z","2026-10-13T02:13:39.212Z",{"id":55,"type":6,"title":56,"slug":57,"summary":58,"coverUrl":59,"authorName":14,"sno":51,"publishedAt":60,"createdAt":61},"5e0c84da-6011-41e8-b1f7-726c8bf0b30a","RCU：读多写少的系统，为什么敢让读者几乎不加锁？","rcu-read-copy-update-explained","RCU 把共享数据的更新与旧版本回收拆开，让读者以极低成本读取，同时等待所有旧读者离开后再释放内存。本文用导览图解释它的读侧、宽限期与适用边界。","\u002Fuploads\u002F2026-09-26\u002F3398ce37-ca4f-4cc3-84b3-fe931d2f055d.jpg","2026-09-27T00:00:00.000Z","2026-09-26T16:25:40.784Z",{"id":63,"type":6,"title":64,"slug":65,"summary":66,"coverUrl":67,"authorName":14,"sno":68,"publishedAt":60,"createdAt":69},"3ee91529-a5cf-40b1-ab91-69df08e489ea","Hazard Pointers：无锁数据结构删除节点后，谁来保证它还没被读到？","hazard-pointers-memory-reclamation","Hazard Pointers 让线程在访问节点前公开保护标记，删除者延迟回收并扫描这些标记，从而避免悬空指针与部分 ABA 风险。","\u002Fuploads\u002F2026-09-26\u002Ffd52a815-7e19-4622-9182-6ca2df8e8144.jpg",42,"2026-09-26T16:25:44.416Z"]