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的--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所在執行個體的執行個體規格支援eRDMA、已綁定彈性RDMA網卡、已部署eRDMA驅動程式,同時eRDMA裝置工作正常。
企業級CPU執行個體:請參見在企業級執行個體上使用eRDMA。
步驟二:(可選)為執行個體部署Docker
如果您的執行個體尚未部署Docker相關環境,無法使用Docker,您需要先在執行個體中安裝Docker。
具體操作如下所示:
遠端連線執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
執行以下命令,確認執行個體是否已部署Docker環境。
sudo docker -v
如果Docker已正確部署,則輸出具體版本號碼,如下所示:
如果Docker尚未部署或出現異常,則可能出現如下執行結果,請您參考為執行個體部署Docker。
為執行個體部署Docker。
步驟三:(可選)為Docker部署鏡像
如果您的Docker環境尚未部署任何鏡像,您可以根據實際應用需求,部署對應的鏡像。
本文以Alibaba Cloud Linux基礎鏡像為例,在Docker中下載Alibaba Cloud Linux鏡像(需要開通公網)。
具體操作如下所示:
遠端連線ECS執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
執行以下命令,啟動Docker服務。
sudo systemctl start docker
運行以下命令,下載Alibaba Cloud Linux的Docker鏡像。
sudo docker pull alibaba-cloud-linux-<image_version>-registry.<region_ID>.cr.aliyuncs.com/alinux<image_version>/alinux<image_version><:TAG>
其中:
<image_version>
:Alibaba Cloud Linux的版本,例如2或者3。<region_ID>
:Docker鏡像所在的地區,例如cn-hangzhou。(可選)
<:TAG>
:Docker鏡像的版本。如果填寫,表示下載指定版本的鏡像。如果不填,預設下載最新版本的鏡像。
樣本命令如下:
在杭州地區下載220901.1版本的Alibaba Cloud Linux 3 Docker鏡像
sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1
在杭州地區下載最新版本的Alibaba Cloud Linux 2 Docker鏡像
sudo docker pull alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2
運行以下命令,查看鏡像是否下載成功。
sudo docker images
樣本結果如下,表示已成功下載220901.1版本的Alibaba Cloud Linux 3 Docker鏡像和最新版本的Alibaba Cloud Linux 2 Docker鏡像。
步驟四:啟動容器並掛載eRDMA裝置
使用Docker的--device
選項將/dev/infiniband/rdma_cm
和/dev/infiniband/uverbsX
兩個字元裝置映射到容器中,這樣容器內的使用者態程式就可以繞過作業系統核心直接存取eRDMA裝置進行資料的收發。詳細資料,請參見實現原理。
具體操作如下所示:
遠端連線ECS執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
執行以下命令,啟動一個Docker容器執行個體並將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
命令查看。執行以下命令,查看目標鏡像ID:
sudo docker images
本樣本中,以步驟三中部署的Alibaba Cloud Linux鏡像為例,執行結果如下:
步驟五:為Docker容器部署eRDMA驅動程式套件
在容器內使用eRDMA還需要部署eRDMA的使用者態驅動程式套件,否則在容器內部無法識別eRDMA裝置資訊。阿里雲提供了yum、apt源,用於便捷部署相應的程式包。
具體操作如下所示:
遠端連線執行個體。
具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體。
進入目標容器內部。
如果您按照本文樣本執行了步驟四的命令,那麼已經直接進入Docker容器內部,直接在容器內安裝使用者態驅動包。
執行以下命令,查看目標容器ID。
sudo docker ps
本樣本中以步驟四中啟動的容器為例,執行結果如下所示:
執行以下命令,進入容器內部。
sudo docker exec -it <CONTAINER ID> /bin/bash
將CONTAINER ID替換為上一步您實際查詢的目標容器ID。
進入容器內部後,在容器內安裝使用者態驅動包。
重要以下操作樣本中,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
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
執行以下命令,在容器內部查看eRDMA裝置資訊。
ibv_devinfo
可以看到在容器內部,已經可以正常識別eRDMA裝置。
Docker容器內配置eRDMA完成後,您可以通過SMC-R或者NetACC將eRDMA整合到容器內部的TCP應用中,實現應用加速。詳細資料,請參見應用適配概述。