Kernel bypass #2 DPDK

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 有以下好处

  1. TLB 命中率:更少的TLB entry,更容易命中TLB
  2. DMA 需要连续内存:连续的2M内存
  3. 锁定物理内存:Hugepage不会被swap

3. Mempool

DPDK的内存池,在HugePage上的一大块内存,每个buffer 固定大小,内部使用无锁 Ring 来维护 buffer 的空闲状态。以免触发 malloc。

4. mbuf

mbuf 是包在 DPDK 里面的 “sk buffer”

mbuf 结构体:

  1. 数据指针(指向 data 的起始位置)
  2. 数据长度(pkt_len, data_len)
  3. 入端口(port)
  4. 接收队列(queue)
  5. RSS hash 值
  6. VLAN / timestamp / …
  7. next 指针(mbuf chain)
  8. headroom
  9. data(DMA 直接写入的位置)
  10. tailroom

多包串联:如果一个包的payload 很大,一个mbuf 放不下,就会用next指针将多个mbuf 串成链。

5. Ring

rte_ring,DPDK 自带无锁队列

  • 支持SPSC / MPMC
  • 批量操作:一次入队32个指针,分摊 CAS 开销
  • Ring 里面存的是 mbuf 指针

Refs

一些文档:https://github.com/0voice/dpdk_engineer_manual

官方库:https://github.com/DPDK/dpdk

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注