DPDK(Data Plane Development Kit) 是一套用户态高性能包处理库,能绕过 Linux 内核网络栈的数据面路径,直接从用户态程序操作NIC硬件收发数据包。
内核只留一个极薄的 UIO/VFIO 驱动做硬件访问授权,数据完全走用户态。
1. PMD(Poll Mode Driver)
传统的内核路径是中断驱动,DPDK 采用轮询驱动,让用户态线程持续轮询网卡 RX/TX descriptor ring,检查描述符状态并批量收发包。
2. HugePage
DPDK 强依赖 Hugepage,在 rte_eal_init() 里面 mmap /dev/hugepages/rtemap_*。Hugepage 有以下好处
- TLB 命中率:更少的TLB entry,更容易命中TLB
- DMA 需要连续内存:连续的2M内存
- 锁定物理内存:Hugepage不会被swap
3. Mempool
DPDK的内存池,在HugePage上的一大块内存,每个buffer 固定大小,内部使用无锁 Ring 来维护 buffer 的空闲状态。以免触发 malloc。
4. mbuf
mbuf 是包在 DPDK 里面的 “sk buffer”
mbuf 结构体:
- 数据指针(指向 data 的起始位置)
- 数据长度(pkt_len, data_len)
- 入端口(port)
- 接收队列(queue)
- RSS hash 值
- VLAN / timestamp / …
- next 指针(mbuf chain)
- headroom
- data(DMA 直接写入的位置)
- tailroom
多包串联:如果一个包的payload 很大,一个mbuf 放不下,就会用next指针将多个mbuf 串成链。
5. Ring
rte_ring,DPDK 自带无锁队列
- 支持SPSC / MPMC
- 批量操作:一次入队32个指针,分摊 CAS 开销
- Ring 里面存的是 mbuf 指针
发表回复