DPDK与传统收发报文的区别

1.去除中断

       传统的收发报文方式都必须采用硬中断来做通讯,每次硬中断大约消耗100微秒,这还不算因为终止上下文所带来的Cache Miss。

       DPDK采用轮询模式驱动(PMD)。
       PMD由用户空间的特定的驱动程序提供的API组成,用于对设备和它们相应的队列进行设置。
       特点:去除中断,避免内核态和用户态内存拷贝,减少系统开销,从而提升I/O吞吐能力

2.处理数据包的环境

       传统的处理数据包,数据必须从内核态用户态之间切换拷贝带来大量CPU消耗,全局锁竞争。

       DPDK处理数据包在用户态进行。

3.收发包的开销

       传统收发包都有系统开销。

       DPDK采用Ring Queue(环形队列)和HUGEPAGE(大页内存)。
       Ring Queue:针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销。
       如果有多个核可能需要同时访问一个网卡,那DPDK中会为每个核准备一个单独的接收队列/发送队列,这样避免了竞争,也避免了cache一致性问题。
       HUGEPAGE:利用内存大页HUGEPAGE降低TLB(Translation Lookaside Buffer) miss,利用内存多通道交错访问提高内存访问有效带宽,降低访存开销。

4.多核情况

       传统方式,内核工作在多核上,为了可以全局一致,即使采用Lock Fr

### DPDK PMD 收发机制 #### 接收中断配置差异 在VFIO模式下,允许每个队列接收(RX)中断事件,并且这种情况下支持多个MSI-X向量。然而,在UIO模式中,RX中断其他中断原因共享同一个向量。当同时启用了RX中断链路状态变化(LSC)中断(即`intr_conf.lsc == 1 && intr_conf.rxq == 1`),只有前者能够正常工作[^3]。 #### 发送接收路径中的关键组件 对于数据包的发送接收操作,DPDK提供了高效的轮询模式驱动(PMD),用于直接访问网络接口卡(NICs)硬件资源而无需操作系统内核介入。PMD通过内存映射的方式管理NIC寄存器以及描述符环(buffer descriptors rings),从而实现零拷贝的数据传输性能优化。 - **接收过程**:当物理网卡接收到新到达的数据帧时,会将其存储到预先分配好的缓冲区中;随后更新对应的描述符并触发CPU上的软中断(如果已启用的话)通知上层应用读取这些数据。 - **发送过程**:应用程序准备待发送的数据报,并填充至指定位置的DMA引擎可触及的记忆区域里;接着修改相应描述符的状态位告知设备可以开始传送该批负载了。 为了进一步提升效率,DPDK还集成了多种加速技术如Hash表(`librte_hash`)最长前缀匹配查找(`librte_lpm`)来辅助完成复杂的路由决策任务,确保快速准确地定位目标地址信息[^1]。 ```c // 示例代码展示如何初始化一个简单的以太网端口用于收发处理 #include <rte_ethdev.h> static void init_port(uint8_t port_id){ struct rte_eth_rxconf rxq_conf; struct rte_eth_txconf txq_conf; // 配置接收队列参数... memset(&rxq_conf, 0, sizeof(rxq_conf)); // 配置发送队列参数... memset(&txq_conf, 0, sizeof(txq_conf)); // 启动端口 rte_eth_dev_start(port_id); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值