DPDK 知识了解

Intel DPDK​全称Intel Data Plane Development Kit

DPDK​应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。

基本组件

EAL (Environment Abstraction Layer

为应用提供了一个通用接口,隐藏了与底层库与设备打交道的相关细节。

EAL​实现了DPDK​运行的初始化工作,基于大页表的内存分配多核亲缘性设置,原子和锁操作,并将PCI设备地址映射到用户空间

核心思想

  • hugetlbfs​: 这样有两个好处:第一是使用hugepage的内存所需的页表项比较少,第二是TLB冲突概率降低。

  • 减少内存访问:少用数组和指针,多用局部变量;少用全局变量;一次多访问一些数据;自己管理内存分配;进程间传递指针而非整个数据块

  • 避免False Sharing​: 多核CPU​中每个核都拥有自己的L1/L2 cache​,当运行多线程程序时,尽管算法上不需要共享变量,但实际执行中两个线程访问同一cache line​的数据时就会引起冲突,每个线程在读取自己的数据时也会把别人的cache line​读进来,这时一个核修改改变量,CPU​的cache​一致性算法会迫使另一个核的cache​中包含该变量所在的cache line​无效,这就产生了false sharing​(伪共享)问题. Falsing sharing​会导致大量的cache​冲突,应该尽量避免。访问全局变量和动态分配内存是false sharing​问题产生的根源,当然访问在内存中相邻的但完全不同的全局变量也可能会导致false sharing​,多使用线程本地变量是解决false sharing的根源办法

  • cache​对齐,这也是程序开发中需要关注的。Cache line​是CPU​从内存加载数据的最小单位,一般L1 cache​的cache line​大小为64字节。如果CPU​访问的变量不在cache​中,就需要先从内存调入到cache​,调度的最小单位就是cache line​。因此,内存访问如果没有按照cache line​边界对齐,就会多读写一次内存和cache了。

  • 降低内存访问开销:

    • 借助大页降低TLB miss
    • 利用内存多通道交错访问提高内存访问的有效带宽
    • 利用内存非对称性感知避免额外的访存延迟
    • 少用数组和指针,多用局部变量
    • 少用全局变量
    • 一次多访问一些数据
    • 自己管理内存分配;进程间传递指针而非整个数据块

Mbuf

单帧结构

image

巨型帧结构

image

RSS (Receive-Side Scaling,接收方扩展)

RSS就是根据关键字通过哈希函数计算出哈希值,再由哈希值确定队列。

image

哈希函数一般选取微软托普利兹算法(Microsoft Toeplitz Based Hash)或者对称哈希。

硬件加速与功能卸载

网卡硬件卸载功能

各种网卡支持的硬件卸载的功能:

image

DPDK​提供了硬件卸载的接口,利用rte_mbuf​数据结构里的64位的标识(ol_flags)来表征卸载与状态

接收时

image

发包时VLAN Tag的插入

DPDK​中,在调用发送函数前,必须提前设置mbuf​数据结构,设置PKT_TX_VLAN_PKT​位,同时将具体的Tag​信息写入vlan_tci字段。

参考链接

  1. https://tonydeng.github.io/sdn-handbook/dpdk/