文档

在容器(Docker)中配置eRDMA

更新时间:

eRDMA(Elastic Remote Direct Memory Access)是一种高性能网络通信技术,将eRDMA功能引入容器(Docker)环境可以实现容器应用程序绕过操作系统内核直接访问主机的物理eRDMA设备,从而提供更快的数据传输和通信效率,适用于在容器中需要大规模数据传输和高性能网络通信的应用场景。本文主要介绍如何在容器(Docker)中配置eRDMA。

实现原理

在容器环境中使用eRDMA功能时,使用Docker的--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功能。

  • 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的镜像源。

步骤一:部署并配置Docker

  1. 确认您的实例已添加ERI网卡、部署驱动程序,同时eRDMA设备工作正常。

    依据您实际的应用场景,具体部署流程可参考在企业级实例上配置eRDMA在GPU实例上配置eRDMA

  2. 在实例中安装Docker并下载对应的Docker镜像。具体操作,请参见:

  3. 运行以下命令,将eRDMA对应的字符设备暴露到容器中。

    sudo docker run --net=host --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm --ulimit memlock=-1 -t -i <IMAGE ID> /bin/bash

    其中:

    • --net=host:配置容器的通信模式为host。容器内的应用程序可以直接使用主机的网络接口和网络配置,从而实现与主机相同的网络通信能力。

    • --device=/dev/infiniband/uverbs0--device=/dev/infiniband/rdma_cm:将eRDMA对应的用户态字符设备暴露到容器中。

    • --ulimit memlock=-1:将maxlockedmemory设置为unlimited表示不限制非root用户锁定内存的数量。这可以确保eRDMA应用程序在非root用户下能够锁定所需的内存量,从而有效地使用eRDMA功能。

    • <IMAGE ID>:请根据实际环境填写Docker镜像的镜像ID,可以通过sudo docker images命令查看。

步骤二:在Docker内安装eRDMA驱动程序包

在容器内使用eRDMA还需要部署eRDMA的用户态驱动程序包。阿里云提供了yum、apt源,用于便捷部署相应的程序包。

重要

以下操作示例中,http://mirrors.cloud.aliyuncs.com表示内网源地址,如果您需要公网访问,需要将http://mirrors.cloud.aliyuncs.com替换为http://mirrors.aliyun.com使用公网会产生公网流量,进而可能产生额外费用。有关公网的计费规则,请参见公网带宽计费

CentOS 7/CentOS 8

  1. 在容器中运行以下命令,在/etc/yum.repos.d目录中创建一个erdma.repo源文件。

    sudo vim /etc/yum.repos.d/erdma.repo
  2. erdma.repo文件中添加如下内容,然后保存退出。

    [erdma]
    name = ERDMA Repository
    baseurl = http://mirrors.cloud.aliyuncs.com/erdma/yum/redhat/$releasever/erdma/$basearch/
    gpgcheck = 1
    enabled = 1
    gpgkey = http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY
  3. 运行以下命令,更新yum源缓存。

    sudo yum makecache
  4. 运行以下命令,安装用户态驱动包。

    sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y 

Alibaba Cloud Linux

  1. 在容器中运行以下命令,添加repo仓库。

    sudo yum-config-manager \
     --add-repo \
     http://mirrors.cloud.aliyuncs.com/erdma/yum/alinux/erdma.repo
    说明

    如果您的容器中没有安装yum-config-manager命令,请先运行sudo yum install -y yum-utils命令安装yum-utils包。yum-config-manager是yum-utils包的一部分,用于管理yum配置。

  2. 运行以下命令,更新yum源缓存。

    sudo yum makecache
  3. 运行以下命令,安装用户态驱动包。

    sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
  4. (可选)运行以下命令,安装NetACC。

    NetACC(Network Accelerator)是一个用户态网络加速库,它利用eRDMA的低时延、高吞吐、内核旁路、协议栈卸载等优势,通过兼容socket接口,实现对现有TCP应用的加速效果。更多信息,请参见NetACC使用说明

    sudo yum install netacc -y

Ubuntu 18.04/Ubuntu 20.04/Ubuntu 22.04

  1. 在容器中运行以下命令,添加PGP签名。

    • Ubuntu 18.04/Ubuntu 20.04

      wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo apt-key add -
    • Ubuntu 22.04

      wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg
  2. 运行以下命令,添加apt源。

    • Ubuntu 20.04

    echo "deb [ arch=amd64 ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu focal/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
    • Ubuntu 18.04

    echo "deb [ arch=amd64 ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu bionic/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
    • Ubuntu 22.04

    echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu jammy/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
  3. 运行以下命令,更新apt源。

    sudo apt update
  4. 运行以下命令,安装用户态驱动。

    sudo apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1
  • 本页导读 (1)
文档反馈