すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:DockerコンテナでeRDMAを使用する

最終更新日:Dec 11, 2024

Elastic Remote Direct Memory Access (eRDMA) は、Dockerコンテナーで使用できる高性能ネットワークテクノロジーで、コンテナーアプリケーションがカーネルをバイパスしてホスト上の物理eRDMAデバイスに直接アクセスできるようにします。 eRDMAは、データ転送速度と通信効率の向上に役立ち、コンテナでの大規模なデータ転送と高性能ネットワーク通信を伴うシナリオに適しています。 このトピックでは、DockerコンテナでeRDMAを設定する方法について説明します。

制限事項

eRDMAは、次のDockerイメージでのみ使用できます。

  • Armベースおよびx86-basedインスタンスでサポートされるAlibaba Cloud Linux 3およびUbuntu 22.04イメージ

  • Alibaba Cloud Linux 2、CentOS 7、CentOS 8、Ubuntu 18.04、およびUbuntu 20.04イメージ (x86-basedインスタンスでのみサポート)

説明

Anolis OSイメージはサポートされていません。

DockerコンテナでのeRDMAの仕組み

DockerコンテナでeRDMAを使用する場合、/dev/infiniband/rdma_cmおよびdev/infiniband/uverbsXのeRDMA文字デバイスをコンテナにマッピング (マウント) できます。 これにより、コンテナ内のユーザ空間プログラムは、カーネルをバイパスし、データ転送のためにeRDMAデバイスに直接アクセスすることができる。 上記の文字デバイスをコンテナーにマップするには、コンテナーの実行に使用するdocker runコマンドで -- deviceパラメーターを設定します。

  • /dev/infiniband/rdma_cm: eRDMA接続の管理に使用します。 ユーザ空間プログラムは、このキャラクタデバイスを使用して、eRDMAデバイスへの接続を確立、閉鎖、および管理し、接続イベントを送信または受信することができる。

  • /dev/infiniband/uverbsX: ユーザースペースeRDMA操作に使用されます。 ユーザ空間プログラムは、このキャラクタデバイスを使用してeRDMAデバイスと通信することができる。 例えば、ユーザ空間プログラムは、キャラクタデバイスを使用してeRDMAデバイスに接続し、eRDMAエンドポイントを作成または削除し、メモリバッファを登録または登録解除することができる。

    説明

    /dev/infiniband/uverbsXXパラメーターは、デバイスのインデックス番号を指定します。 Xの値は、オペレーティングシステムおよび構成に基づいて変化し得る。 ls /dev/infiniband | grep uverbsコマンドを実行して、uverbs文字デバイスの名前を照会できます。

DockerコンテナでのeRDMAの設定

手順1: インスタンスのeRDMAの設定

DockerをデプロイするElastic Compute Service (ECS) インスタンスでeRDMAデバイスが期待どおりに動作するようにするには、次の操作を実行してインスタンスでeRDMAを設定します。インスタンスにeRDMAドライバをインストールします。

(オプション) 手順2: ECSインスタンスへのDockerのデプロイ

インスタンスでDockerを使用するには、インスタンスにDockerをインストールする必要があります。

以下の手順を実行します。

  1. ECS インスタンスに接続します。

    詳細については、「ワークベンチを使用したSSH経由のLinuxインスタンスへのログイン」をご参照ください。

  2. 次のコマンドを実行して、Dockerがインスタンスにデプロイされているかどうかを確認します。

    sudo docker -v

    Dockerバージョンが返されると、次の図に示すように、Dockerは期待どおりにデプロイされます。

    image

    次のコマンド出力は、Dockerがデプロイされていないか、期待どおりに機能しないことを示します。 次のステップに進み、Dockerをデプロイします。

    image

  3. インスタンスにDockerをデプロイします。 操作はオペレーティングシステムによって異なります。

(オプション) 手順3: Dockerイメージの作成

Dockerコンテナにイメージがデプロイされていない場合は、実際のアプリケーション要件に基づいてイメージを作成できます。

この例では、Alibaba Cloud LinuxベースイメージはDockerでダウンロードされます。これにはインターネット接続が必要です。

以下の手順を実行します。

  1. Dockerインスタンスが存在するECSインスタンスに接続します。

    詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。

  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イメージのリージョンID。 例:cn-hangzhou。

    • <:TAG>: オプション。 Dockerイメージのタグ。 このパラメーターを設定すると、指定されたDockerイメージバージョンがダウンロードされます。 このパラメーターを空のままにすると、最新のDockerイメージバージョンがダウンロードされます。

    イメージのリージョンとバージョン情報の表示

    1. Container Registry コンソールにログインします。

    2. 左側のナビゲーションウィンドウで、[アーティファクトセンター] をクリックします。

    3. Alibaba Cloud Linux 2 Dockerイメージの情報を表示するには、alinux2/alinux2をクリックします。 Alibaba Cloud Linux 3 Dockerイメージの情報を表示するには、alinux3/alinux3をクリックします。

      たとえば、次の図は、Alibaba Cloud Linux 3 Dockerイメージの情報を示しています。 ① セクションはDockerイメージが存在するリージョンを示し、② セクションはDockerイメージのバージョン情報を示します。

      image.png

    サンプルコマンド:

    • 中国 (杭州) リージョンでAlibaba Cloud Linux 3 Dockerイメージのバージョン220901.1をダウンロードするために使用されるサンプルコマンド:

      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

    コマンド出力は、Alibaba Cloud Linux 3 Dockerイメージのバージョン220901.1と最新バージョンのAlibaba Cloud Linux 2 Dockerイメージがダウンロードされたことを示しています。

    image.png

ステップ4: コンテナを起動し、eRDMAデバイスをマウントする

DockerコンテナでeRDMAを使用する場合、/dev/infiniband/rdma_cmおよびdev/infiniband/uverbsXのeRDMA文字デバイスをコンテナにマッピング (マウント) できます。 これにより、コンテナ内のユーザ空間プログラムは、カーネルをバイパスし、データ転送のためにeRDMAデバイスに直接アクセスすることができる。 上記の文字デバイスをコンテナーにマップするには、コンテナーの実行に使用するdocker runコマンドで -- deviceパラメーターを設定します。 詳細については、このトピックの「DockerコンテナーでのeRDMAの仕組み」をご参照ください。

以下の手順を実行します。

  1. Linux ECSインスタンスに接続します。

    詳細については、「ワークベンチを使用した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: コンテナーをホストネットワークモードにします。 ホスト・ネットワーク・モードで動作するコンテナ内のアプリケーション・プログラムは、ホストのネットワーク・インターフェースおよびネットワーク構成への直接アクセスを有し、ホストと同じネットワーク通信能力を提供する。

    • -- device=/dev/infiniband/uverbsXおよび -- device=/dev/infiniband/rdma_cm: eRDMAに使用されるユーザースペース文字デバイスをコンテナーにマッピングします。

      文字デバイス名を表示するには、次のコマンドを実行します。 uverbsXXは、uverbs文字デバイスのインデックスを指定します。

      ls /dev/infiniband | grep uverbs

      image

    • -- ulimit memlock=-1: maxlockedmemory (max locked-in-memory address space) をunlimitedに設定します。これは、非ルートユーザーがロックできるメモリの最大量を無制限に指定します。 これにより、root以外のユーザーは、eRDMAアプリケーションがeRDMA機能を有効にするために必要なメモリ量をロックできます。

    • <IMAGE ID>: DockerイメージのIDを指定します。 このパラメーターを実際のDockerイメージIDに置き換えます。 DockerイメージのIDを照会するには、sudo docker imagesコマンドを実行します。

      次のコマンドを実行して、画像のIDを照会します。

      sudo docker images

      この例では、ステップ3でデプロイされた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

手順5: DockerコンテナーにeRDMAドライバーをインストールする

コンテナーでeRDMAを使用するには、ユーザースペースeRDMAドライバーパッケージをインストールする必要があります。 これにより、コンテナはeRDMAデバイス情報を認識することができる。 Alibaba Cloudは、必要なパッケージのデプロイに役立つYYellowdog Updater Modified (YUM) およびAdvanced Package Tool (APT) リポジトリを提供しています。

以下の手順を実行します。

  1. Linux ECSインスタンスに接続します。

    詳細については、「ワークベンチを使用したSSH経由のLinuxインスタンスへのログイン」をご参照ください。

  2. コンテナーにアクセスします。

    手順4でコマンドを実行すると、すでにDockerコンテナにアクセスできます。 ユーザースペースeRDMAドライバーパッケージをコンテナーにインストールします

    1. 次のコマンドを実行して、コンテナIDを照会します。

      sudo docker ps

      この例では、ステップ4で開始されたコンテナが使用されます。 サンプルコマンド出力:

      image

    2. 次のコマンドを実行して、コンテナにアクセスします。

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

      コンテナIDを前の手順で照会したコンテナのIDに置き換えます。

  3. コンテナーにアクセスした後、ユーザースペースドライバーパッケージをコンテナーにインストールします。

    重要

    次の例では、http://mirrors.cloud.aliyuncs.com で始まるURLはリポジトリの内部URLです。 インターネット経由でリポジトリにアクセスする場合は、http://mirrors.cloud.aliyuncs.comhttp://mirrors.aliyun.com に置き換えてパブリックURLを取得します。 インターネット経由でリポジトリにアクセスすると、インターネットとの間でデータが転送されます。 データ転送料金が請求される場合があります。 インターネットとの間でのデータ転送の課金方法については、「パブリック帯域幅」をご参照ください。

    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. コンテナで次のコマンドを実行して、YUMリポジトリを追加します。

      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. オペレーティングシステムのバージョンに基づいてコンテナーで次のいずれかのコマンドを実行し、GNU Privacy Guard (GPG) キーを追加します。

      • 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 (Remote Direct Memory Access) またはネットワークアクセラレータ (NetACC) を介した共有メモリ通信を使用して、アプリケーションの高速化のためにコンテナ内のTCPアプリケーションにeRDMAを統合できます。 詳細については、「eRDMAとアプリケーションの適応の概要」をご参照ください。