一、DPDK原理
网络设备(路由器、交换机、媒体网关、SBC、PS网关等)需要在瞬间进行大量的报文收发,因此在传统的网络设备上,往往能够看到专门的NP(Network Process)处理器,有的用FPGA,有的用ASIC。这些专用器件通过内置的硬件电路(或通过编程形成的硬件电路)高效转发报文,只有需要对报文进行深度处理的时候才需要CPU干涉。但在公有云、NFV等应用场景下,基础设施以CPU为运算核心,往往不具备专用的NP处理器,操作系统也以通用Linux为主,网络数据包的收发处理路径如下图所示:
操作系统的虚拟机环境中处理流程,如下图所示:
由于数据包处理任务存在内核态与用户态的切换,以及多次的内存拷贝,系统消耗变大,以CPU为核心的系统存在很大的处理瓶颈。为了提升在通用服务器(COTS)的数据包处理效能,Intel推出了服务于IA(Intel Architecture)系统的DPDK技术。
DPDK是Data Plane Development Kit的缩写。简单说,DPDK应用程序运行在操作系统的User Space,利用自身提供的数据面库进行收发包处理,绕过了Linux内核态协议栈,以提升报文处理效率。与传统的数据包处理相比,DPDK具有以下特点:
- 轮询:在包处理时避免中断上下文切换的开销;
- 用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化;
- 亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中;
- 降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽;
- 软件调优:cache行对齐,预取数据,多元数据批量操作;
二、DPDK的基石UIO
为了让驱动运行在用户态,Linux提供UIO机制。使用UIO可以通过read感知中断,通过mmap实现和网卡的通讯。
上述资源均来自:
[1] https://blog.csdn.net/zhaoxinfan/article/details/78408945
[2] DPDK的基本原理、学习路线总结 https://zhuanlan.zhihu.com/p/347693559
[3] https://cloud.tencent.com/developer/article/1198333