全部產品
Search
文件中心

Elastic Compute Service:在容器(Docker)中使用eRDMA

更新時間:Nov 22, 2024

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裝置工作正常。

步驟二:(可選)為執行個體部署Docker

如果您的執行個體尚未部署Docker相關環境,無法使用Docker,您需要先在執行個體中安裝Docker。

具體操作如下所示:

  1. 遠端連線執行個體。

    具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

  2. 執行以下命令,確認執行個體是否已部署Docker環境。

    sudo docker -v

    如果Docker已正確部署,則輸出具體版本號碼,如下所示:

    image

    如果Docker尚未部署或出現異常,則可能出現如下執行結果,請您參考為執行個體部署Docker

    image

  3. 為執行個體部署Docker。

步驟三:(可選)為Docker部署鏡像

如果您的Docker環境尚未部署任何鏡像,您可以根據實際應用需求,部署對應的鏡像。

本文以Alibaba Cloud Linux基礎鏡像為例,在Docker中下載Alibaba Cloud Linux鏡像(需要開通公網)。

具體操作如下所示:

  1. 遠端連線ECS執行個體。

  2. 執行以下命令,啟動Docker服務。

    sudo systemctl start docker
  3. 運行以下命令,下載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鏡像的版本。如果填寫,表示下載指定版本的鏡像。如果不填,預設下載最新版本的鏡像。

    如何查看鏡像所在的地區以及鏡像版本資訊?

    1. 登入Container Registry控制台

    2. 在左側導覽列選擇製品中心

    3. 單擊alinux2/alinux2或者alinux3/alinux3,查看Alibaba Cloud Linux 2和Alibaba Cloud Linux 3的Docker鏡像版本資訊。

      例如Alibaba Cloud Linux 3的Docker鏡像資訊如下,①表示Docker鏡像所在的地區,②表示Docker鏡像的版本資訊。

      image.png

    樣本命令如下:

    • 在杭州地區下載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
  4. 運行以下命令,查看鏡像是否下載成功。

    sudo docker images

    樣本結果如下,表示已成功下載220901.1版本的Alibaba Cloud Linux 3 Docker鏡像和最新版本的Alibaba Cloud Linux 2 Docker鏡像。

    image.png

步驟四:啟動容器並掛載eRDMA裝置

使用Docker的--device選項將/dev/infiniband/rdma_cm/dev/infiniband/uverbsX兩個字元裝置映射到容器中,這樣容器內的使用者態程式就可以繞過作業系統核心直接存取eRDMA裝置進行資料的收發。詳細資料,請參見實現原理

具體操作如下所示:

  1. 遠端連線ECS執行個體。

    具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

  2. 執行以下命令,啟動一個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

      image

    • --ulimit memlock=-1:將maxlockedmemory設定為unlimited表示不限制非root使用者鎖定記憶體的數量。這可以確保eRDMA應用程式在非root使用者下能夠鎖定所需的記憶體量,從而有效地使用eRDMA功能。

    • <IMAGE ID>:請根據實際環境填寫Docker鏡像的鏡像ID,可以通過sudo docker images命令查看。

      執行以下命令,查看目標鏡像ID

      sudo docker images

      本樣本中,以步驟三中部署的Alibaba Cloud Linux鏡像為例,執行結果如下:

      image

    本樣本中執行命令

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

步驟五:為Docker容器部署eRDMA驅動程式套件

在容器內使用eRDMA還需要部署eRDMA的使用者態驅動程式套件,否則在容器內部無法識別eRDMA裝置資訊。阿里雲提供了yum、apt源,用於便捷部署相應的程式包。

具體操作如下所示:

  1. 遠端連線執行個體。

    具體操作,請參見使用Workbench工具以SSH協議登入Linux執行個體

  2. 進入目標容器內部。

    如果您按照本文樣本執行了步驟四的命令,那麼已經直接進入Docker容器內部,直接在容器內安裝使用者態驅動包

    1. 執行以下命令,查看目標容器ID。

      sudo docker ps

      本樣本中以步驟四中啟動的容器為例,執行結果如下所示:

      image

    2. 執行以下命令,進入容器內部。

      sudo docker exec -it <CONTAINER ID> /bin/bash

      CONTAINER ID替換為上一步您實際查詢的目標容器ID。

  3. 進入容器內部後,在容器內安裝使用者態驅動包。

    重要

    以下操作樣本中,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

    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
  4. 執行以下命令,在容器內部查看eRDMA裝置資訊。

    ibv_devinfo

    image

    可以看到在容器內部,已經可以正常識別eRDMA裝置。

Docker容器內配置eRDMA完成後,您可以通過SMC-R或者NetACC將eRDMA整合到容器內部的TCP應用中,實現應用加速。詳細資料,請參見應用適配概述