eRDMA(Elastic Remote Direct Memory Access)是一种高性能网络通信技术,将eRDMA功能引入容器(Docker)环境可以实现容器应用程序绕过操作系统内核直接访问主机的物理eRDMA设备,从而提供更快的数据传输和通信效率,适用于在容器中需要大规模数据传输和高性能网络通信的应用场景。本文主要介绍如何在容器(Docker)中配置eRDMA。
目前仅支持在以下Docker镜像中使用eRDMA功能。 Alibaba Cloud Linux 3/Ubuntu 22.04的镜像源(ARM和x86实例均支持) Alibaba Cloud Linux 2/CentOS 7/CentOS 8/Ubuntu 18.04/Ubuntu 20.04的镜像源(仅x86实例支持) 说明 暂不支持Anolis OS的镜像源。 在容器环境中使用eRDMA功能时,使用Docker的 说明 确认Docker所在实例的实例规格支持eRDMA、已绑定弹性RDMA网卡、已部署eRDMA驱动程序,同时eRDMA设备工作正常。 企业级CPU实例:请参见在企业级实例上配置eRDMA。 GPU实例:请参见在GPU实例上配置eRDMA。 如果您的实例尚未部署Docker相关环境,无法使用Docker,您需要先在实例中安装Docker。 具体操作如下所示: 远程连接实例。 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 执行以下命令,确认实例是否已部署Docker环境。 如果Docker已正确部署,则输出具体版本号,如下所示: 如果Docker尚未部署或出现异常,则可能出现如下执行结果,请您参考为实例部署Docker。 为实例部署Docker。 如果您的Docker环境尚未部署任何镜像,您可以根据实际应用需求,部署对应的镜像。 本文以Alibaba Cloud Linux基础镜像为例,在Docker中下载Alibaba Cloud Linux镜像(需要开通公网)。 具体操作如下所示: 远程连接ECS实例。 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 执行以下命令,启动Docker服务。 运行以下命令,下载Alibaba Cloud Linux的Docker镜像。 其中: 示例命令如下: 在杭州地域下载220901.1版本的Alibaba Cloud Linux 3 Docker镜像 在杭州地域下载最新版本的Alibaba Cloud Linux 2 Docker镜像 (可选) 运行以下命令,查看镜像是否下载成功。 示例结果如下,表示已成功下载220901.1版本的Alibaba Cloud Linux 3 Docker镜像和最新版本的Alibaba Cloud Linux 2 Docker镜像。 使用Docker的 具体操作如下所示: 远程连接ECS实例。 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 执行以下命令,启动一个Docker容器实例并将eRDMA对应的字符设备映射到容器中。 参数说明如下: 执行以下命令,查看字符设备名称( 执行以下命令,查看目标镜像ID: 本示例中,以步骤三中部署的Alibaba Cloud Linux镜像为例,执行结果如下: 在容器内使用eRDMA还需要部署eRDMA的用户态驱动程序包,否则在容器内部无法识别eRDMA设备信息。阿里云提供了yum、apt源,用于便捷部署相应的程序包。 具体操作如下所示: 远程连接实例。 具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。 进入目标容器内部。 如果您按照本文示例执行了步骤四的命令,那么已经直接进入Docker容器内部,直接在容器内安装用户态驱动包。 执行以下命令,查看目标容器ID。 本示例中以步骤四中启动的容器为例,执行结果如下所示: 执行以下命令,进入容器内部。 将CONTAINER ID替换为上一步您实际查询的目标容器ID。 进入容器内部后,在容器内安装用户态驱动包。 重要 以下操作示例中,http://mirrors.cloud.aliyuncs.com表示内网源地址,如果您需要公网访问,需要将http://mirrors.cloud.aliyuncs.com替换为http://mirrors.aliyun.com。使用公网会产生公网流量,进而可能产生额外费用。有关公网的计费规则,请参见公网带宽计费。 CentOS 7/CentOS 8 Alibaba Cloud Linux Ubuntu 18.04/Ubuntu 20.04/Ubuntu 22.04 在容器中运行以下命令,在 在 运行以下命令,更新yum源缓存。 运行以下命令,安装用户态驱动包。 执行以下命令,在容器内部查看eRDMA设备信息。 可以看到在容器内部,已经可以正常识别eRDMA设备。 Docker容器内配置eRDMA完成后,您可以通过SMC-R或者NetACC将eRDMA集成到容器内部的TCP应用中,实现应用加速。详细信息,请参见应用适配概述。使用限制
实现原理
--device
选项将/dev/infiniband/rdma_cm
和/dev/infiniband/uverbsX
两个字符设备映射到容器中,这样容器内的用户态程序就可以绕过操作系统内核直接访问eRDMA设备进行数据的收发。/dev/infiniband/rdma_cm
:用于eRDMA连接管理的字符设备。用户态程序可以通过对这个字符设备的操作,与eRDMA设备进行连接的建立、销毁和管理,包括创建和销毁连接、发送和接收连接事件等操作。/dev/infiniband/uverbsX
:用于用户空间eRDMA操作的字符设备。用户态程序可以通过对这个字符设备的操作,与eRDMA设备进行通信,包括打开设备、创建和销毁eRDMA通信端点、注册和注销内存缓冲区等操作。/dev/infiniband/uverbsX
中的X
是设备的索引号,可能会因系统和配置而异,您可以运行ls /dev/infiniband | grep uverbs
命令查看字符设备名称。在Docker容器中配置eRDMA
步骤一:为实例配置eRDMA
步骤二:(可选)为实例部署Docker
sudo docker -v
步骤三:(可选)为Docker部署镜像
sudo systemctl start docker
sudo docker pull alibaba-cloud-linux-<image_version>-registry.<region_ID>.cr.aliyuncs.com/alinux<image_version>/alinux<image_version><:TAG>
sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1
sudo docker pull alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2
<image_version>
:Alibaba Cloud Linux的版本,例如2或者3。<region_ID>
:Docker镜像所在的地域,例如cn-hangzhou。<:TAG>
:Docker镜像的版本。如果填写,表示下载指定版本的镜像。如果不填,默认下载最新版本的镜像。sudo docker images
步骤四:启动容器并挂载eRDMA设备
--device
选项将/dev/infiniband/rdma_cm
和/dev/infiniband/uverbsX
两个字符设备映射到容器中,这样容器内的用户态程序就可以绕过操作系统内核直接访问eRDMA设备进行数据的收发。详细信息,请参见实现原理。sudo docker run --net=host --device=/dev/infiniband/uverbsX --device=/dev/infiniband/rdma_cm --ulimit memlock=-1 -t -i <IMAGE ID> /bin/bash
--net=host
:配置容器的通信模式为host
。容器内的应用程序可以直接使用主机的网络接口和网络配置,从而实现与主机相同的网络通信能力。--device=/dev/infiniband/uverbsX
和--device=/dev/infiniband/rdma_cm
:将eRDMA对应的用户态字符设备暴露到容器中。uverbsX
中的X):ls /dev/infiniband | grep uverbs
--ulimit memlock=-1
:将maxlockedmemory
设置为unlimited
表示不限制非root用户锁定内存的数量。这可以确保eRDMA应用程序在非root用户下能够锁定所需的内存量,从而有效地使用eRDMA功能。<IMAGE ID>
:请根据实际环境填写Docker镜像的镜像ID,可以通过sudo docker images
命令查看。sudo docker images
步骤五:为Docker容器部署eRDMA驱动程序包
sudo docker ps
sudo docker exec -it <CONTAINER ID> /bin/bash
/etc/yum.repos.d
目录中创建一个erdma.repo
源文件。sudo vim /etc/yum.repos.d/erdma.repo
erdma.repo
文件中添加如下内容,然后保存退出。[erdma]
name = ERDMA Repository
baseurl = http://mirrors.cloud.aliyuncs.com/erdma/yum/redhat/$releasever/erdma/$basearch/gpgcheck = 1enabled = 1gpgkey = http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY
sudo yum makecache
sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
ibv_devinfo