DPDK最初动机很简单,网络处理器的软件解决方案,证明IA多核处理器能够支撑高性能数据包处理。
什么是DPDK?对于用户来说,它可能是一个出色的包数据处理性能加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。DPDK在主流Linux包含,比如Debian, Fedora,Redhat, Ubuntu, FreeBSD。
DPDK代码在www.dpdk.org上自由提交,软件发布时间是1年4次,分别是2017年2月、5月8月和11月。本质上,是一个软件优化。进一步讲,是对Linux的网络运行环境进行优化。
一张图示,大致包含这些软件模块,最核心的是Core与PMD。PMD- 基于轮询的用户态驱动。轮询,这一点很直接,为了避免中断上下文切换的开销。LINUX也采用该方法改进对大吞吐数据的处理,效果很好。
用户态驱动,在这种工作方式下,既规避了不必要的内存拷贝又避免系统调用。一个间接的影响在于,用户态驱动不受限于内核现有的数据格式和行为定义。有个假设: 很多应用都是在用户态,亲和性和独占,DPDK工作在用户态,线程的调度仍旧依赖内核。利用线程的CPU亲和绑定的方式,特定任务可以被指定只在某个核上工作。
好处是避免线程在不同核间频繁切换,核间线程切换容易导致因cache miss和cache write back造成的大量性能损失。如果更进一步地限定某些核不参与linux系统调度,就能使线程独占该核,保证更多cache hit的同时,也避免了同一个核内的多任务切换开销。
降低访存开销,网络数据包处理是一种典型的I/O密集型(I/O bound)工作负载。无论是CPU指令还是DMA,对于内存子系统(Cache+DRAM)都访问频繁。利用一些已知的高效方法来减少访存的开销能够有效提升性能。比如利用内存大页能有效降低TLB miss,比如利用内存多通道的交错访问能有效提高内存访问的有效带宽,再比如利用对于内存非对称性的感知可以避免额外的访存延迟,比如Hugepage。
DPDK很强调软件优化,四处吸取营养,比如结构的cache line对齐(cache alignment),比如数据在多核间访问避免跨cache line共享(false sharing),比如适时地预取数据(prefeching),再如多元数据批量操作(multi-buffer)。简单说,可以在一个例子中阅读,著名的l3fwd(链接http://www.dpdk.org/browse/dpdk/tree/examples/l3fwd)
DPDK 大量利用IA新硬件技术,DDIO,SIMD等等。在网卡驱动上,花了很多力,充分挖掘网