当前位置: 首页 > news >正文

高性能网络DPDK、RDMA、XDP初探

本文部分内容参考《linux高性能网络详解 从DKDP、RDMA到XDP》一书的内容完成

文章目录

  • 基础知识
    • CPU与内存
  • 内核协议栈方案存在问题
    • 上下文频繁切换
    • 数据复制
    • CPU消耗
  • corundum-一个开源的基于FPGA的100G网卡方案
  • DPDK
    • 出现原因
    • DPDK优点
    • DKDK内存管理技巧
    • UIO
  • RDMA
    • RDMA协议
    • RDMA软件架构
    • Soft-RoCE
    • RDMA基本元素
    • RDMA操作类型
  • XDP
    • XDP架构
    • xdp程序执行后返回值
    • XDP程序执行入口
  • 参考文章

基础知识

CPU与内存

直接看图
kernel-mm
其中包含了cache,numa及DMA等内容

MMU(Memory Management Unit)是CPU核中的一个硬件设备,其通过查询页表实现虚拟地址到物理地址的转换,其还负责管理哪些地址使能cache,哪些地址禁用cache。
页表存储了页,是通过分页,即把物理内存分成固定大小的块,每个块就是一个页,操作系统以页为单位进行内存的管理。页的大小一般为4kb,还有大页,有2M和1GB大小。
TLB转译后备缓冲区(Translation Lookaside Buffer)是专门用来缓存页表的cache,类似与CPU访问内存时cache是内存的缓存,而MMU查询页表时也是访问内存,而TLB就是对MMU来说内存的缓存。
当MMU进行地址转换时,如果在TLB中匹配到虚拟地址,就可以迅速找到目标页,然后经过计算得到最终的物理地址。而在TLB如果没匹配到虚拟地址,表示TLB未命中(TLB miss,和cache miss类比),就需要进行常规的查找。

内核协议栈方案存在问题

内核协议栈方案指 网络协议栈+网络设备驱动程序 的方案,其存在以下三个缺点

上下文频繁切换

用户态收发报文需要调用API,会在用户态和内核态频繁切换

数据复制

传统流程一次报文发送到对端需要5次拷贝,即1.发送端用户态到内核态 2.内核态到网卡 3.网卡到对端网卡 4.对端网卡到内核态 5.内核态到用户态
根因:1. 用户空间申请的数据缓存在虚拟地址连续,但物理地址不连续
2. 在内核与网卡之间DMA所需的缓存,包括发送和接收两个方向的,由于要提供给硬件访问,要求虚拟地址和物理地址都是连续的
3. 由于1和2就导致用户态到内核态(或者反过来)交换数据时必须进行数据复制

CPU消耗

由于报文需要在内核协议栈进行一系列的处理,各种封装解封装会消耗主cpu的时钟

corundum-一个开源的基于FPGA的100G网卡方案

corundum即为钢玉,100g网卡相当于千兆带宽的100倍,此方案包含了verilog,linux网络驱动程序、仿真框架等等源码,并且全部都是开源的。
其仿真框架基于Python的开源仿真框架,该框架包括整个系统,从驱动程序和PCIExpress接口的仿真模型到以太网接口,可以评估整个设计

以太网卡方案:
corundum

DPDK

出现原因

  1. 通用多核处理器引入网络数据处理领域
  2. 内核协议栈方案存在瓶颈,无法高性能的处理数据包
  3. 新方案保持与原有linux程序的兼容
  4. 适合以库的形式打包到linux发行版中,在用户需要时用来管理各种网络设备

DPDK优点

1)轮询:在包处理时避免中断上下文切换的开销,对于高速大突发数据量的网络中心,随时都有数据到达。由于中断处理会产生较大性能开销,因此其处理数据包时屏蔽了绝大部分中断。
2)用户态驱动:通过UIO技术将报文拷贝到应用空间处理,规避不必要的内存拷贝和系统调用,便于快速迭代优化。
3)亲和性与独占:传统内核运行时,调度器采用负载均衡机制,一个进程会在多个CPU核心上切换,造成额外开销,而DPDK特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中。
4)降低访存开销:Linux默认采用4KB分页管理机制,然而在大量使用内存时,将严重制约程序的运行性能。Linux2.6后开始支持HUGEPAGE,利用内存大页HUGEPAGE可以降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽。
5)软件调优:cache行对齐,预取数据,多元数据批量操作。
6)无锁队列:DPDK提供了一种低开销的无锁队列机制 Ring,Ring 既支持单生产者单消费者,也支持多生产者多消费者。内部实现没有使用锁,大大节省了使用开销。
7)使用rte_mbuf结构体来代替传统的sk_buff结构体,可以节省一次内存开销。

DKDK内存管理技巧

• 大页,作用是避免 TLB missp
•对于 NUMA 系统,优先选择和处理器属于同一NUMA节点的 DDR 中的大页,作用是缩短 CPU 对内存的访问时间。
•mempool,作用是提前(从而避免收发包时)从堆中申请内存空间。
• 每个核都有自己的mbuf cache,作用是避免多核竞争,提高从 mempool 中获取 mbuf的速度、也提高处理器核的 Cache命中率。
•多个通道和rank并行访问,作用是增大单位时间的内存访问量。

UIO

UIO用户态IO(userspace I/O)实现DKDK的基础,有了UIO,应用程序中的驱动程序可以直接访问寄存器控制硬件,但对于DPDK中断处理,仍需经过内核态
dpdk
DPDK使用UIO需要先将网卡的linux网络设备驱动程序解绑,加载linux自带的UIO(PCI)驱动设备程序uio_pci_generic
总结一下,DPDK 主要通过以下三个步骤使用UIO。

(1) 将设备和 UIO 设备驱动程序绑定。
(2)从UIO 设备驱动程序生成的系统文件中,获取设备内存/寄存器的物理地址和长度。
(3)进行地址映射,将物理地址映射为虚拟地址。此处获取的虚拟地址,即为 DPDK应用程序可访问的网卡的寄存器基地址,是下一步运行 DPDK网卡驱动程序的基础。

RDMA

DPDK技术解决了上下文频繁切换和复制的问题,但是没有解决CPU消耗的问题,而RDMA解决了全部这三个问题。RDMA将数据包解析和封装工作移交给硬件执行,因此需要引入专用的RDMA网卡甚至其他组网设备,在降低了CPU负载的同时,也增加了成本。
RDMA网卡对比与同等带宽的以太网卡的优势是具有更低时延
rdma

RDMA协议

见图,目前共有三种协议,而ROCE分为ROCEV1和ROCEV2,可同时支持以太网和RDMA。
rdma

RDMA软件架构

RDMA软件架构按层次可分为两部分,一是开源的rdma-core,其是RDMA的用户态部分;而另一部分是位于内核态的RDMA子系统,其是linux内核的一部分。整个架构适应于所有类型的RDMA网卡,不管网卡执行了哪种RDMA协议。
RDMA
上图中可分为控制通路和数据通路,对于控制通路:一般和控制有关的操作所需的权限较高,所以需要进入内核态处理,导致消耗的时间较长,不过实际进行的操作次数有限,属于低频且耗时的操作类型;对于数据通路:数据收发相关的操作所需的权限较低,直接在用户态处理取可,只有这样才能起到旁路(bypass)内核和快速收发数据的效果,并且在程序运行的大部分时间里,执行的都是这种高频操作。

Soft-RoCE

内核RDMA子系统位于drivers/infiniband下,为所有RDMA网络协议共用,而Soft-RoCE位于其下的sw目录,sw( software)目录下包含了几个具有特殊功能的软件模块,比如 sw/rxe 提供了 Soft-RoCE功能。Soft-RoCE 是ROCE 协议的致件实现版本,用于在普通以太网卡上搭建虚拟的 RoCE操作环境。

RDMA基本元素

WQ WQE QP QPN CQ CQN WR WC
借用一张图
WQE

RDMA操作类型

双端操作(需要两端CPU共同参与):RDMA Send ,RDMA Receive,适合传输控制信息
单端操作(不需要对端CPU共同参与):RDMA Write ,RDMA Read,适合对大量数据进行读写
RDMA Write ,RDMA Read才真正体现了Remote DMA
MR(Memory Region) 本质是一段特殊的内存
L_Key(Local key) R_Key(Remote key) 本质是一个数字
PD(protection domain) 允许应用配置哪些QP可以访问哪些MR,并在执行过程中由 硬件保证,解决安全问题

XDP

XDP程序是一种在网络收包方向上的网络设备驱动上下文中运行的ebpf程序,也是ebpf在其三大领域网络,可观测性,安全中安全领域的应用

XDP架构

xdp

xdp程序执行后返回值

其会返回四种结果

/* User return codes for XDP prog type.* A valid XDP program must return one of these defined values. All other* return codes are reserved for future use. Unknown return codes will* result in packet drops and a warning via bpf_warn_invalid_xdp_action().*/
enum xdp_action {XDP_ABORTED = 0,XDP_DROP,XDP_PASS,XDP_TX,XDP_REDIRECT,
};

代表四种操作,分别是出错中断,丢弃,继续上送内核协议栈,原路返回,转发到其他网卡

XDP程序执行入口

bpf_prog_run_xdp(bpf_prog_run)是xdp程序真正执行的函数

参考文章

业界第一个真正意义上开源100 Gbps NIC Corundum介绍
揭秘:普通电脑换上Xilinx Alveo U50 100G网卡传文件会有多快?
开源100 Gbps NIC Corundum环境搭建介绍(一)
DPDK documentation
RDMA Aware Networks Programming User Manual
xdp-tutorial

http://www.dtcms.com/a/298973.html

相关文章:

  • VTK交互——ClientData
  • Java程序员学从0学AI(六)
  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现轮船检测识别(C#代码UI界面版)
  • 热传导问题Matlab有限元编程 :工业级热仿真核心技术-搭建热传导求解器【含案例源码】
  • CSS3知识补充
  • 【企业架构】TOGAF概念之二
  • 基于深度学习的图像分类:使用Capsule Networks实现高效分类
  • 【Linux手册】操作系统如何管理存储在外设上的文件
  • 用 FFmpeg 把视频输出为图片序列
  • 创建 Vue 项目的 4 种主流方式
  • 小程序的客服咨询(与企业微信建立沟通)
  • [论文阅读] 人工智能 + 软件工程 | NoCode-bench:评估LLM无代码功能添加能力的新基准
  • 使用Python实现单词记忆软件
  • Day 22: 复习
  • Datawhale AI 夏令营—科大讯飞AI大赛(大模型技术)—让大模型理解表格数据(列车信息表)
  • 【影刀RPA_初级课程_我的第一个机器人】
  • .bat 打开方式恢复
  • 秋招Day20 - 微服务 - 概念
  • 大模型应用班-第2课 DeepSeek使用与提示词工程课程重点 学习ollama 安装 用deepseek-r1:1.5b 分析PDF 内容
  • Laravel 中使用 FPDI 实现 PDF 骑缝章功能
  • almalinux9.6-4070显卡-ollama-qwen2.5-7b
  • 服务器之光:Nginx--核心配置详解及演练
  • 企业如何选择适合的高防服务器?
  • Go语言unsafe包深度解析
  • docker 从主机复制文件到容器外进行编辑
  • Java面试题及详细答案120道之(041-060)
  • 1. 多线程开发
  • Ansible列出常见操作系统的发行版,Ansible中使用facts变量的两种方式
  • pytorch学习笔记-自定义卷积
  • 【CTF-WEB-SQL】SQL注入基本流程-错误注入(sql-labs的Less5)(updatexml)