接前一篇文章:零知识学习之DPDK与RDMA(2)—— 认识DPDK(2)
本文内容参考:
《Linux高性能网络详解 从DPDK、RDMA到XDP》 刘伟著 人民邮电出版社
https://blog.51cto.com/u_15301988/5181201
特此致谢!
上一回讲解了DPDK体系结构的第1部分内容——核心组件,本回开始讲解第2部分内容——轮询模式驱动。
一、认识DPDK
3. DPDK体系结构
(1)核心组件
(2)轮询模式驱动
DPDK的源码中已经包含了很多网卡的驱动程序,这些驱动程序都采用了轮询模式。
轮询模式驱动程序(poll mode driver,PMD)需要提供一系列API,用于配置设备、创建队列、发送数据包、接收数据包等。PMD直接访问接收队列和发送队列的描述符以及寄存器,无须处理任何中断(除了链路状态更新中断),即可在用户态的应用程序中快速接收、处理和发送数据包。
1)两种数据包处理模式
为了支持处理数据包的应用程序,DPDK提供了两种模式:运行到完成模式和流水线模式。运行到完成模式属于同步模式,流水线模式属于异步模式。
- 运行到完成(run-to-completion)模式
接收时,通过API轮询特定网络接口的接收队列描述符/寄存器,以获取数据包。然后,在同一核上处理数据包。处理完毕后,通过其它API将数据包放置在网络接口的发送队列描述符中,进行数据发送。
运行到完成模式的示意图如下所示:
运行到完成模式下,一个核运行一个包处理循环,该循环包括以下三步:
a)通过PMD提供的接收API从硬件接收数据包;
b)处理接收到的数据包;
c)通过PMD提供的发送API把数据包发送出去。
- 流水线(pipeline)模式
接收时,一个核上运行的程序通过API轮询一个或多个网络接口的接收队列描述符/寄存器。数据包被接收后,通过环形队列传递给另一个核。另一个核会继续处理数据包,处理完毕后,通过API将数据包放在网络接口的发送队列描述符中,进行数据发送。
流水线模式的示意图如下所示:
流水线模式下,一个或多个核负责接收数据包,并将数据包放入环形队列。其它核会从环形队列中取出数据包,并负责处理和发送。
接收数据包的核执行接收循环,该循环包括以下两步:
a)通过PMD提供的接收API从硬件接收数据包;
b)把接收到的数据包放入环形队列。
负责处理数据包的核执行包处理循环,该循环有三步:
a)从环形队列取出数据包;
b)处理接收到的数据包;
c)如果需要的话,通过PMD提供的发送API把数据包发送出去。
更过内容请看下回。