软件优化方案:Intel DPDK

Intel DPDK软件优化网络处理性能

DPDK(Data Plane Development Kit)数据面的开发包:

  • 绕过Linux的内核协议栈,使用户态直接访问内存缓冲区,进行数据包的收发和处理;
  • 不采用中断,而是采用轮询(Poll Mode Driver, PMD)

DPDK框架图

通过mmap和外设共享内存,实现零拷贝

DPDK核心思想:穷尽一切手段优化性能

  1. 用户态模式下的PMD Driver
    • 去除了中断影响,减少了操作系统内核的开销,消除了IO吞吐瓶颈;
    • 避免了内核态和用户态的报文拷贝;
    • 用户态下软件崩溃,不会影响系统的稳定性;
    • Intel提供的PMD驱动,充分利用指令和网卡的性能;
  2. Huge Page和内存缓冲区管理
    • 提供2M和1G的大页,减少了TLB miss,TLB Miss严重影响了报文转发性能;
    • 高效的内存缓冲区,能灵活的组织报文,包括多buffer接收,分片/重组,都能够轻松应对;
  3. 向量指令
    • 明显的降低内存等待开销,提升CPU的流水线效率;
  4. 避免缓存不命中
  5. 避免分支预测错误
  6. 控制平面与数据平面相分离
    • 内核态负责“控制平面”:内核仅负责控制指令的处理;
    • 用户态负责“数据平面”:将数据包处理、内存管理、处理器调度等任务转移到用户态空间去完成,避免繁重的模式切换;
  7. 用多核编程代替多线程技术
    • 绑核:设置CPU亲和性,减少彼此间调度切换;
    • 无锁环形队列:解决资源竞争问题;
  8. CPU核尽量使用所在NUMA节点的内存
    • 避免跨NUMA内存访问;
  9. 核心库
    • 包括系统抽象内存管理、无锁环、缓存池;
  10. 流分类
    • 支持精准匹配、最长匹配和通配符匹配,提供常用的包处理表操作
  11. 软件加速库
    • 一些常用的包处理软件库集合,比如IP分片、报文重组、排序等
  12. QoS
    • 提供网络服务质量相关组件,比如限速和调度;
  13. 数据包分组架构
    • 提供了搭建复杂的多核流水线模型的基础组件;

无锁环

  • 首尾相连的数组,充当缓存

  • 针对多生产者、多消费者的队列

  • 不加锁,并行读写性能非常高

  • 特殊点:元素定长,4字节或4字节的整数倍

内存池

内存对齐

内存条分多通道的,不同的通道空间可以同时访问

双通道:每条通道连接独立的总线;

内存空间需要对齐

  • 因为连接着相同的数据总线,所以同一通道内的数据不能被同时获取

私有缓存

托普利哈希Toeplitz Hash

用于接受端数据包处理的负载均衡,尽量将数据均匀的划分到不同的CPU上,减少哈希碰撞。

DPDK的使用特点

  • DPDK本身只是2层协议栈,不提供socket接口

    • 适合于软件虚拟的路由场景
  • 如果要用于应用程序,提供socket抽象

    1. 类微内核方案:将DPDK+TCP/IP协议栈作为一个服务器,为每个应用单独维护socket fd和进程间的对应关系

    2. LibOS方案:需要逐个应用添加协议栈支持

    3. 架构对比

  • 有更多基于DPDK开发的完整协议栈款架

硬件优化方案:RDMA

在远端无感的情况下,直接读取远端内存数据,绕开内核协议栈

参考资料:

视频:https://www.bilibili.com/video/BV1vS421d7LT?spm_id_from=333.788.videopod.sections&vd_source=93e39300d281cef5ad42ab13d4028d04