DPDK学习1.2 -- 最佳实践
DPDK使用的,用以解决应对高性能数据包处理的技术:
1. 轮询 -- 可以避免上下文切换的开销
2. 用户态驱动 -- 规避了不必要的内存拷贝,又避免了系统调用
一个间接的影响在于,用户态驱动不受限于内核现有的数据格式和行为定义。对mbuf 头格式的 重定义、对网卡DMA 操作[1]的重新优化可以获得更好的性能。而用户态驱动也便于快速地迭代优化,甚至对不同场景进行不同的优化组合。
3. 亲和性与独占 -- DPDK工作在用户态,线程的调度仍然依赖内核。
利用线程的CPU 亲和绑定的方式,特定任务可以被指定只在某个核上工作。好处是可避免线程在不同核间频繁切换,核间线程切换容易导致因 cache miss 和 cache write back 造成的大量性能损失。如果更进一步地限定某些核不参与Linux 系统调度,就可能使线程独占该核,保证更多cache hit 的 同时,也避免了同一个核内的多任务切换开销。
4. 降低访存开销 -- 网络数据包处理是一种典型的I/O 密集型(I/O bound)工作负载
无论是 CPU 指令还是DMA,对于内存子系统(Cache+DRAM)都会访问频繁。利用一些已知的高效方法来减少访存的开销能够有效地提升性能。比如利用内存大页能有效降低TLB miss, 比如利用内存多通道的交错访问[2]能有效提高内存访问的有效带宽,再比如利用对于内存非对称性的感知可以避免额外的访存延迟。而cache 更是几乎所有优化的核心地带。
5. 软件调优 --
这里其实指代的是一系列调优实践,比如结构的cache line对齐,比如数据在多核间访问避免跨cache line共享,比如适时地预取数据,再如多元数据批量操作。这些具体的优化策略散布在DPDK 各个角落。
6. 利用IA新硬件技术
拿 Intel® DDIO 技术来讲,这个 cache 子系统对DMA 访存的硬件创新直接助推了性能跨越式的增长。有效利用SIMD(Single Instruction Multiple Data)并结合超标量技 术(Superscalar)对数据层面或者对指令层面进行深度并行化,在性能的进一步提升上也行之 有效。另外一些指令(比如cmpxchg),本身就是lockless 数据结构的基石,而crc32 指令对 与 4 Byte Key 的哈希计算也是改善明显。
7. 充分挖掘网卡的潜能 --
经过 DPDK I/O 加速的数据包通过 PCIe 网卡进入系统内存,PCIe 外设到系统内存之间的带宽利用效率、数据传送方式(coalesce 操作)等都是直接影响I/O 性能的因素。在现代网卡中,往往还支持一些分流(如RSS,FDIR 等)和卸载(如Chksum, TSO 等)功能。DPDK 充分利用这些硬件加速特性,帮助应用更好地获得直接的性能提升。
8. DPDK I/O虚拟化
[1]DMA操作:DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序.那么DMA控制器与CPU怎样分时使用内存呢?通常采用以下三种方法:(1)停止CPU访内存;(2)周期挪用;(3)DMA与CPU交替访问内存.
[2]交错内存:内存交错技术(DRAM Bank Interleave)是威盛(VIA)芯片组用来提升内存性能的一种技术,能提供更多的传输管道与更高的内存频宽,使内存在同一时间内能同时进行多个写/读的操作,从而有效地提高系统性能。内存交错运行模式主要有2路交错(2-Bank Interleave)和4路交错(4-Bank Interleave)两种。出于保证系统稳定的考虑,很多基于VIA芯片组的主板在默认情况下关闭了内存交错模式或默认最多以2路方式来运行。进行内存性能的优化时,可在BIOS中通过简单设置将其打开激活。