高性能网络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与内存
直接看图
其中包含了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接口的仿真模型到以太网接口,可以评估整个设计
以太网卡方案:
DPDK
出现原因
- 通用多核处理器引入网络数据处理领域
- 内核协议栈方案存在瓶颈,无法高性能的处理数据包
- 新方案保持与原有linux程序的兼容
- 适合以库的形式打包到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使用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协议
见图,目前共有三种协议,而ROCE分为ROCEV1和ROCEV2,可同时支持以太网和RDMA。
RDMA软件架构
RDMA软件架构按层次可分为两部分,一是开源的rdma-core,其是RDMA的用户态部分;而另一部分是位于内核态的RDMA子系统,其是linux内核的一部分。整个架构适应于所有类型的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
借用一张图
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程序执行后返回值
其会返回四种结果
/* 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