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/uverbsX
のX
パラメーターは、デバイスのインデックス番号を指定します。 Xの値は、オペレーティングシステムおよび構成に基づいて変化し得る。ls /dev/infiniband | grep uverbs
コマンドを実行して、uverbs文字デバイスの名前を照会できます。
DockerコンテナでのeRDMAの設定
手順1: インスタンスのeRDMAの設定
DockerをデプロイするElastic Compute Service (ECS) インスタンスでeRDMAデバイスが期待どおりに動作するようにするには、次の操作を実行してインスタンスでeRDMAを設定します。インスタンスにeRDMAドライバをインストールします。
エンタープライズレベルのCPUベースのインスタンスでeRDMAを設定する方法については、「エンタープライズレベルのインスタンスでeRDMAを設定する」をご参照ください。
(オプション) 手順2: ECSインスタンスへのDockerのデプロイ
インスタンスでDockerを使用するには、インスタンスにDockerをインストールする必要があります。
以下の手順を実行します。
ECS インスタンスに接続します。
詳細については、「ワークベンチを使用したSSH経由のLinuxインスタンスへのログイン」をご参照ください。
次のコマンドを実行して、Dockerがインスタンスにデプロイされているかどうかを確認します。
sudo docker -v
Dockerバージョンが返されると、次の図に示すように、Dockerは期待どおりにデプロイされます。
次のコマンド出力は、Dockerがデプロイされていないか、期待どおりに機能しないことを示します。 次のステップに進み、Dockerをデプロイします。
インスタンスにDockerをデプロイします。 操作はオペレーティングシステムによって異なります。
Alibaba Cloud LinuxまたはCentOS: 「Dockerのインストール」をご参照ください。
Ubuntu: 「UbuntuへのDockerエンジンのインストール」をご参照ください。
(オプション) 手順3: Dockerイメージの作成
Dockerコンテナにイメージがデプロイされていない場合は、実際のアプリケーション要件に基づいてイメージを作成できます。
この例では、Alibaba Cloud LinuxベースイメージはDockerでダウンロードされます。これにはインターネット接続が必要です。
以下の手順を実行します。
Dockerインスタンスが存在する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イメージのリージョンID。 例:cn-hangzhou。<:TAG>
: オプション。 Dockerイメージのタグ。 このパラメーターを設定すると、指定されたDockerイメージバージョンがダウンロードされます。 このパラメーターを空のままにすると、最新のDockerイメージバージョンがダウンロードされます。
サンプルコマンド:
中国 (杭州) リージョンで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
次のコマンドを実行して、イメージがダウンロードされているかどうかを確認します。
sudo docker images
コマンド出力は、Alibaba Cloud Linux 3 Dockerイメージのバージョン220901.1と最新バージョンのAlibaba Cloud Linux 2 Dockerイメージがダウンロードされたことを示しています。
ステップ4: コンテナを起動し、eRDMAデバイスをマウントする
DockerコンテナでeRDMAを使用する場合、/dev/infiniband/rdma_cm
およびdev/infiniband/uverbsX
のeRDMA文字デバイスをコンテナにマッピング (マウント) できます。 これにより、コンテナ内のユーザ空間プログラムは、カーネルをバイパスし、データ転送のためにeRDMAデバイスに直接アクセスすることができる。 上記の文字デバイスをコンテナーにマップするには、コンテナーの実行に使用するdocker runコマンドで -- device
パラメーターを設定します。 詳細については、このトピックの「DockerコンテナーでのeRDMAの仕組み」をご参照ください。
以下の手順を実行します。
Linux ECSインスタンスに接続します。
詳細については、「ワークベンチを使用した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
: コンテナーをホスト
ネットワークモードにします。 ホスト・ネットワーク・モードで動作するコンテナ内のアプリケーション・プログラムは、ホストのネットワーク・インターフェースおよびネットワーク構成への直接アクセスを有し、ホストと同じネットワーク通信能力を提供する。-- device=/dev/infiniband/uverbsX
および-- device=/dev/infiniband/rdma_cm
: eRDMAに使用されるユーザースペース文字デバイスをコンテナーにマッピングします。文字デバイス名を表示するには、次のコマンドを実行します。
uverbsX
のXは、uverbs文字デバイスのインデックスを指定します。ls /dev/infiniband | grep uverbs
-- 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イメージが使用されています。 次のコマンド出力が返されます。
手順5: DockerコンテナーにeRDMAドライバーをインストールする
コンテナーでeRDMAを使用するには、ユーザースペースeRDMAドライバーパッケージをインストールする必要があります。 これにより、コンテナはeRDMAデバイス情報を認識することができる。 Alibaba Cloudは、必要なパッケージのデプロイに役立つYYellowdog Updater Modified (YUM) およびAdvanced Package Tool (APT) リポジトリを提供しています。
以下の手順を実行します。
Linux ECSインスタンスに接続します。
詳細については、「ワークベンチを使用したSSH経由のLinuxインスタンスへのログイン」をご参照ください。
コンテナーにアクセスします。
手順4でコマンドを実行すると、すでにDockerコンテナにアクセスできます。 ユーザースペースeRDMAドライバーパッケージをコンテナーにインストールします。
次のコマンドを実行して、コンテナIDを照会します。
sudo docker ps
この例では、ステップ4で開始されたコンテナが使用されます。 サンプルコマンド出力:
次のコマンドを実行して、コンテナにアクセスします。
sudo docker exec -it <CONTAINER ID> /bin/bash
コンテナIDを前の手順で照会したコンテナのIDに置き換えます。
コンテナーにアクセスした後、ユーザースペースドライバーパッケージをコンテナーにインストールします。
重要次の例では、http://mirrors.cloud.aliyuncs.com で始まるURLはリポジトリの内部URLです。 インターネット経由でリポジトリにアクセスする場合は、http://mirrors.cloud.aliyuncs.com を http://mirrors.aliyun.com に置き換えてパブリックURLを取得します。 インターネット経由でリポジトリにアクセスすると、インターネットとの間でデータが転送されます。 データ転送料金が請求される場合があります。 インターネットとの間でのデータ転送の課金方法については、「パブリック帯域幅」をご参照ください。
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
コンテナで次のコマンドを実行して、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設定の管理に使用されます。次のコマンドを実行して、YUMキャッシュを更新します。
sudo yum makecache
次のコマンドを実行して、ユーザースペースドライバーパッケージをインストールします。
sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y
Ubuntu 18.04、Ubuntu 20.04、およびUbuntu 22.04
オペレーティングシステムのバージョンに基づいてコンテナーで次のいずれかのコマンドを実行し、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
オペレーティングシステムのバージョンに基づいて次のいずれかのコマンドを実行し、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 (Remote Direct Memory Access) またはネットワークアクセラレータ (NetACC) を介した共有メモリ通信を使用して、アプリケーションの高速化のためにコンテナ内のTCPアプリケーションにeRDMAを統合できます。 詳細については、「eRDMAとアプリケーションの適応の概要」をご参照ください。