RoCEv2网络部署----Mellanox网卡配置
RoCEv2网络部署----Mellanox网卡配置_roce网络配置-CSDN博客
Mellanox驱动加载与RoCE & soft-RoCE(RDMA)_roce网卡-CSDN博客
背景
处理器(cpu) 内存 I/o设备(外设)三者之间的关系
(1)没有DMA参与的访问方式:
假设I/O设备为一个普通网卡,为了从内存拿到需要发送的数据,然后组装数据包发送到物理链路上,网卡需要通过总线告知CPU自己的数据请求。然后CPU将会把内存缓冲区中的数据复制到自己内部的寄存器中,再复制到I/O设备的存储空间中。如果数据量比较大,那么很长一段时间内CPU都会忙于搬移数据,而无法投入到其他工作中去。
CPU的最主要工作是计算,而不是进行数据复制,这种工作属于白白浪费了它的计算能力。为了给CPU“减负”,让它投入到更有意义的工作中去,后来人们设计了DMA机制。
(2)有DMA参与的访问方式
可以看到总线上又挂了一个DMA控制器,它是专门用来读写内存的设备。有了它以后,当我们的网卡想要从内存中拷贝数据时,除了一些必要的控制命令外,整个数据复制过程都是由DMA控制器完成的。过程跟CPU复制是一样的,只不过这次是把内存中的数据通过总线复制到DMA控制器内部的寄存器中,再复制到I/O设备的存储空间中。CPU除了关注一下这个过程的开始和结束以外,其他时间可以去做其他事情。
DMA控制器一般是和I/O设备在一起的,也就是说一块网卡中既有负责数据收发的模块,也有DMA模块。
RDMA概念
RDMA( Remote Direct Memory Access )意为远程直接地址访问,通过RDMA,本端节点可以“直接”访问远端节点的内存。所谓直接,指的是可以像访问本地内存一样,绕过传统以太网复杂的TCP/IP网络协议栈读写远端内存,而这个过程对端是不感知的,而且这个读写过程的大部分工作是由硬件而不是软件完成的。
RoCE的协议层次
RoCE,它是三大RDMA协议之一。RoCE全称是RDMA over Converged Ethernet,即基于融合以太网的RDMA。用通俗的话讲,就是基于传统以太网的部分下层协议,在其基础上实现Infiniband的部分上层协议。
将RoCE v2的一个报文展开:
首先是二层的以太网链路帧,然后是IP报文头和UDP报文头,最后是各层级协议的校验。而Infiniband传输层报文实际上是UDP层的负载,也就是深蓝色背景的部分。UDP报文头中有一个字段Destination Port Number(目的端口号),对于RoCE v2来说固定是4791,当对端网卡收到报文后,会根据该字段识别是普通的以太网数据包,还是RoCE数据包,或者是其他协议的数据包,然后再进行解析。深蓝色背景的IB传输层部分又分成了IB报头,实际的用户数据(Payload)以及校验部分。IB传输层实际上有很多种报头以及对应的格式,我们以后再介绍。
RoCE的优势
为什么我们有了Infiniband协议之后,还要设计RoCE协议呢?最主要的原因还是成本问题:由于Infiniband协议本身定义了一套全新的层次架构,从链路层到传输层,都无法与现有的以太网设备兼容。也就是说,如果某个数据中心因为性能瓶颈,想要把数据交换方式从以太网切换到Infiniband技术,那么需要购买全套的Infiniband设备,包括网卡、线缆、交换机和路由器等等。商用级设备由于对可靠性有比较高的要求,所以这一套下来是非常昂贵的。而RoCE协议的出现解决了这一问题,如果用户想要从以太网切换到RoCE,那么只需要购买支持RoCE的网卡就可以了,线缆、交换机和路由器(RoCE v1不支持以太网路由器)等网络设备都是兼容的——因为我们只是在以太网传输层基础上又定义了一套协议而已。所以RoCE相比于Infiniband,主要还是省钱,当然性能上相比Infiniband还是有一些损失,毕竟人家是全套重新设计的。至于iWARP,相比于RoCE协议栈更复杂,并且由于TCP的限制,只能支持可靠传输,即无法支持UD等传输类型。所以目前iWARP的发展并不如RoCE和Infiniband,一般指RoCEv2。
Soft-RoCE
虽然RoCE相比Infiniband具有兼容性优势,价格也便宜,但是实际应用的时候依然需要专用的网卡支持。有的读者可能会问,TCP/IP协议栈不是由软件实现的吗,只是在UDP层基础上加了层内容,为什么会对硬件有依赖?RoCE本身确实可以由软件实现,也就是本节即将介绍的Soft-RoCE,但是商用的时候,几乎不会有人用软件实现的RoCE。RDMA技术本身的一大特点就是“硬件卸载”,即把本来软件(CPU)做的事情放到硬件中实现以达到加速的目的。CPU主要是用来计算的,让它去处理协议封包和解析以及搬运数据,这是对计算资源的浪费。所以RoCE网卡会把TCP/IP协议栈放到硬件中实现以解放CPU,让它去做更重要的事。我们说回Soft-RoCE,它由IBM和Mellanox牵头的IBTA RoCE工作组实现。本身的设计初衷有几点:
(1)降低RoCE部署成本
Soft-RoCE可以使不具备RoCE能力的硬件和支持RoCE的硬件间进行基于IB语义的交流,这样可以免于替换网络中的一些非关键节点的旧型号网卡。
(2)相比TCP提升性能
虽然软件实现IB传输层带来了一定的开销,但是相比基于Socket-TCP/IP的传统通信方式,Soft-RoCE因为减少了系统调用(只在软件通知硬件下发了新SQ WQE时才会使用系统调用),发送端的零拷贝以及接收端的只需要单次拷贝等原因,仍然带来了性能上的提升。
(3)便于开发和测试RDMA程序
有了Soft-RoCE,我们基于Verbs API编写的程序,就可以不依赖于硬件执行起来,也可以很方便的跑在虚拟机里。
实现原理
Soft-RoCE就是把本来应该卸载到硬件的封包和解析工作,又拿到软件来做。其本身是基于Linux内核的TCP/IP协议栈实现的,网卡本身并不感知收发的数据包是RoCE报文,其驱动程序按照IB规范中的报文格式将用户数据封装成IB传输层报文,然后把报文整体当做数据填入Socket Buffer当中,由网卡进行下一步收发包处理。
下面这张图取自IBTA对于Soft-RoCE的介绍文章[1],左边是需要硬件的普通RoCE,右边是Soft-RoCE。可以看出普通RoCE是把协议栈卸载到RoCE NIC网卡实现的,而Soft-RoCE则是在软件协议栈中实现的。
针对虚拟机操作:
ubuntu-20.04操作系统:
sudo apt-get install open-vm-tools
sudo apt-get install open-vm-tools-desktop
1
2
确认当前内核是否支持RXE
cat /boot/config-$(uname -r) | grep RXE
1
当CONFIG_RDMA_RXE=m或者=y,则表示当前操作系统可以使用RXE
如果该选项值为n或者搜索不到RXE,那么很遗憾你可能需要重新编译内核。编译内核时需要使能以下几个选项:
CONFIG_INET
CONFIG_PCI
CONFIG_INFINIBAND
CONFIG_INFINIBAND_VIRT_DMA
1
2
3
4
安装用户态动态链接库
我们在“RDMA概述”一文中提到过,用户态库指的就是rdma-core。但是在Ubuntu等操作系统中它可能不是一个而是多个软件包组成的。我使用的Ubuntu 20.04 LTS版本使用默认的安装参数的情况下,已经装有这几个软件包。
如果版本跟我不一致的话,那么可以尝试安装一下以下几个软件包:
sudo apt-get install libibverbs1 ibverbs-utils librdmacm1 libibumad3 ibverbs-providers rdma-core
1
这几个软件包的作用如下:
如果读者想看一下软件包里都包括哪些内容,那么可以使用dpkg命令查看包内容,比如:
dpkg -L libibverbs1
1
安装完上述软件之后,可以执行ibv_devices看看有没有报错,这是个基于verbs接口编写的小程序,用来获取并打印出当前系统中的RDMA设备列表:
ibv_devices
1
iproute2
iproute2是用来替代net-tools软件包的,是一组开源的网络工具集合,比如用更强大ip命令替换了以前常用的ifconfig。我们需要其中的rdma工具来对RXE进行配置。一般的操作系统都已经包含了,安装也很简单:
sudo apt-get install iproute2
1
perftest
perftest是一个基于Verbs接口开发的开源RDMA性能测试工具,可以对支持RDMA技术的节点进行带宽和时延测试。相比于rdma-core自带的示例程序 ,功能更加强大,当然也更复杂。使用如下命令安装:
sudo apt-get install perftest
1
配置RXE网卡步骤:
(1)首先我们需要加载内核驱动,modprobe会自动加载依赖的其他驱动。
modprobe rdma_rxe
1
(2)然后进行用户态配置:
sudo rdma link add rxe_0 type rxe netdev ens33
1
其中rxe_0是你希望的RDMA的设备名,可任意取名。ens33为Soft-RoCE设备所绑定的网络设备名,也就是我们刚才ifconfig看到的网卡名,每个虚拟机可能都不一样。
接着我们用rdma工具查看是否添加成功:
rdma link
1
查看这个虚拟RDMA设备的信息:
ibv_devinfo -d rxe_0
1
注意:网上一些写的比较早的教程说用rxe_cfg配置Soft-RoCE,该工具已经在2020年1月末被rdma工具取代。
执行perftest测试
一端执行:
ib_send_bw -d rxe_0
1
另一端执行:
ib_send_bw -d rxe_0 <server_ip>
1
使用wireshark 可以看到RoCE报文了。
注意
Mellanox网卡可以当作RDMA网卡使用也可以当作使用,依据所加载的驱动不同而不同。
(1) 加载MLNX_OFED_LINUX-5.7-1.0.2.0-ubuntu20.04-x86_64.tgz驱动时,当作RDMA使用。
下载网站:驱动下载:https://network.nvidia.com/products/infiniband-drivers/linux/mlnx_ofed/
安装与卸载命令:
./mlnxofedinstall --force #--force可以加也可以不加,安装驱动命令
./uninstall.sh #卸载驱动
1
2
(2)加载mlnx-en-5.7-1.0.2.0-ubuntu20.04-x86_64.tgz驱动时,当作以太网卡使用。
下载网卡:驱动下载:https://network.nvidia.com/products/ethernet-drivers/linux/mlnx_en/
安装与卸载命令:
./install --force #force可加可不加,加载程序
./uninstall.sh #卸载程序
1
2
以上的驱动模块会被加载到/lib/modules/5.15.0-43-generic/updates/dkms目录,卸载也是从这个目录删除的。
/lib/modules/5.15.0-43-generic/updates/dkms #查看目录驱动文件
/lib/modules/5.15.0-43-generic/build/Module.symvers #查看模块路径
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/wangwenzhou0624/article/details/125783529