dpdk
DPDK(Data Plane Development Kit)是一套专为用户态高性能网络包处理设计的开发库和驱动程序框架,广泛用于构建网络设备驱动、虚拟交换机、NFV、SDN、vRouter、L4-L7负载均衡器等场景。
DPDK 架构图概览
+---------------------------------------------+
| 应用层 |
| (vSwitch, Firewall, Router...) |
+------------------↑--------------------------+
| DPDK APIs |
+------------------↑--------------------------+
| PMD (Poll Mode Drivers) |
| (Ethernet, Crypto, Timer, Event, etc.) |
+------------------↑--------------------------+
| EAL (Environment Abstraction Layer) |
+------------------↑--------------------------+
| 内核态 UIO / VFIO / igb_uio |
+------------------↑--------------------------+
| 硬件设备 NIC |
+---------------------------------------------+
核心原理组成
- 用户态驱动(Poll Mode Driver, PMD)
- DPDK 不依赖 Linux 内核网络协议栈(绕过 kernel network stack),而是通过用户态驱动绕过内核,直接访问网卡。
- 不使用中断方式(提高性能),而是轮询(polling)方式持续从网卡读取数据包。
- 常见 PMD 类型包括:ixgbe, i40e, mlx5, virtio, net_tap 等。
- EAL (Environment Abstraction Layer)
- 对操作系统的抽象封装层,屏蔽平台差异,提供统一的:
- hugepage 内存管理
- 核心绑定(CPU affinity)
- PCI 设备枚举
- 原子操作、日志、定时器等
- HugePages 内存机制
- DPDK 使用大页(HugePages)内存分配方式提升 DMA 效率。
- 原因:
- 减少页表数量,提升 TLB 命中率
- 减少页表遍历时间
- 支持物理连续内存,便于 DMA 映射
- 零拷贝原理(Zero-copy)
- 应用直接操作 DMA 映射后的 buffer,无需中间缓冲区和多次 memcpy。
- 包含 mbuf 缓冲结构:
struct rte_mbuf {
void *buf_addr;
uint16_t data_off;
uint16_t data_len;
uint16_t pkt_len;
...
};
- 多核并行处理
- 将多个逻辑核绑定到 RX/TX 队列,天然支持多核并发。
- 支持 RSS(Receive Side Scaling)、Flow Director 等硬件队列分发技术。
- 应用线程直接轮询 NIC RX 队列,无锁化设计。
- VFIO / UIO 驱动模式
- VFIO:提供更安全和隔离的设备映射方式,推荐用于生产。
- UIO/igb_uio:较简单的设备映射方式,多用于开发/测试。
- 都允许 DPDK 直接 mmap 硬件寄存器,绕过内核。
收发包流程简述(以接收为例)
[网卡] --> DMA --> [HugePage 内存中的 mbuf pool] --> PMD 轮询 --> 应用读取
简化版代码:
rte_pktmbuf_alloc(...);
rte_eth_rx_burst(port_id, queue_id, pkts, MAX_BURST);
for (i = 0; i < nb_rx; i++) {
struct rte_mbuf *mbuf = pkts[i];
process_packet(mbuf);
rte_pktmbuf_free(mbuf);
}
性能优化设计
| 机制 | 作用 |
|---|
| Poll 模式 | 避免中断延迟,提高包处理速度 |
| NUMA 支持 | 支持非一致性内存访问,避免跨 NUMA 节点访问性能损失 |
| HugePage | 提升 DMA 性能,减少页表开销 |
| Zero Copy | 避免多次拷贝,加快传输速率 |
| Lockless Queue | 多核并发使用无锁环形队列,提高吞吐 |
典型应用场景
- 虚拟交换机(如 OVS-DPDK)
- vRouter(如 Tungsten Fabric vRouter)
- NFV 功能链(如防火墙、负载均衡)
- 高性能 L7 proxy(如 Envoy with DPDK)
- Packet Generator、网络测试工具(如 pktgen-dpdk)
与内核协议栈的对比
| 特性 | Linux 内核 | DPDK 用户态 |
|---|
| 抽象层级 | 多层协议栈 | 直接控制网卡 |
| 处理延迟 | 高(多次切换) | 低(轮询,无系统调用) |
| 并发处理 | 较弱 | 高性能多核并发 |
| 应用开发 | 简单(Socket API) | 复杂(低层操作) |
| 可控性 | 受限 | 高度可控 |
常用命令与工具
# 探测网卡
dpdk-devbind.py --status
# 绑定网卡
dpdk-devbind.py --bind=vfio-pci 0000:03:00.0
# 启动 DPDK 应用(示例)
./build/my_dpdk_app -l 0-3 -n 4 --proc-type auto -- -p 0x1
DPDK 层次结构源码组件(简要)
| 目录 | 说明 |
|---|
lib/ | 所有模块库(EAL、mbuf、net、ring、mempool) |
drivers/net/ | 各类网卡驱动 |
examples/ | 官方示例程序 |
usertools/ | 各种实用工具(如 dpdk-devbind.py) |