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
確認您的執行個體已添加ERI網卡、部署驅動程式,同時eRDMA裝置工作正常。
依據您實際的應用情境,具體部署流程可參考在企業級執行個體上配置eRDMA。
在執行個體中安裝Docker並下載對應的Docker鏡像。具體操作,請參見:
Alibaba Cloud Linux/CentOS鏡像:安裝Docker並使用(Linux)
Ubuntu鏡像:Ubuntu協助
運行以下命令,將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
在容器中運行以下命令,在
/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 = 1 enabled = 1 gpgkey = http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY
運行以下命令,更新yum源緩衝。
sudo yum makecache
運行以下命令,安裝使用者態驅動包。
sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
Alibaba Cloud Linux
在容器中運行以下命令,添加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配置。運行以下命令,更新yum源緩衝。
sudo yum makecache
運行以下命令,安裝使用者態驅動包。
sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
(可選)運行以下命令,安裝NetACC。
NetACC(Network Accelerator)是一個使用者態網路加速庫,它利用eRDMA的低時延、高吞吐、核心旁路、協議棧卸載等優勢,通過相容socket介面,實現對現有TCP應用的加速效果。更多資訊,請參見NetACC使用說明。
sudo yum install netacc -y
Ubuntu 18.04/Ubuntu 20.04/Ubuntu 22.04
在容器中運行以下命令,添加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
運行以下命令,添加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
運行以下命令,更新apt源。
sudo apt update
運行以下命令,安裝使用者態驅動。
sudo apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1