eRDMA 対応の Elastic Compute Service (ECS) インスタンスに bRPC をデプロイすることで、レイテンシーの短縮、スループットの向上、CPU 使用率の削減を実現します。
-
bRPC は、C++ で記述された高性能で汎用的な RPC フレームワークです。サービスの開発とデプロイを簡素化するツールを提供します。一般的なユースケースには、検索、ストレージ、機械学習、広告などがあります。bRPC は、高同時実行・低レイテンシーのマイクロサービスや大規模な分散システムに適しています。詳細については、「bRPC のビルド手順」をご参照ください。
-
eRDMA (elastic Remote Direct Memory Access) は、低レイテンシー、高スループット、高弾力性を提供するクラウドネイティブの RDMA ネットワークサービスです。詳細については、「eRDMA の概要」をご参照ください。
ステップ 1:環境の準備
サーバーとクライアントとして、eRDMA 対応の ECS インスタンスを 2 台作成します。次の設定項目を指定します。
-
インスタンスタイプ:eRDMA 対応のインスタンスタイプを選択します。詳細については、「制限」をご参照ください。このトピックでは、ecs.g8a.8xlarge を使用します。
-
イメージ:eRDMA と互換性のあるイメージを選択します。詳細については、「制限」をご参照ください。このトピックでは、Alibaba Cloud Linux 3.2104 LTS 64 ビットを使用します。
-
eRDMA ドライバーのインストール:[eRDMA ドライバーのインストール] を選択します。インスタンスの起動中にドライバーが自動的にインストールされます。
説明インスタンスの起動後、ドライバーのインストールが完了するまで 3〜5 分お待ちください。詳細については、「エンタープライズレベルのインスタンスで eRDMA を有効にする」をご参照ください。
-
ネットワーク:
-
両方のインスタンスでインターネットアクセスを有効にします。
-
同じ VPC 内では、デフォルトでサービス間接続が有効になっています。
-
ENI の場合、NIC の横にある [Elastic RDMA インターフェイス] を選択します。
-
その他のパラメーターについては、「インスタンスのカスタマイズと購入」をご参照ください。
ステップ 2:bRPC のデプロイとコンパイル
両方のインスタンスで bRPC をデプロイしてコンパイルします。以下の手順では、Alibaba Cloud Linux 3 を例として使用します。その他のオペレーティングシステムについては、「bRPC のコンパイル」をご参照ください。
-
両方の ECS インスタンスにログインします。詳細については、「Workbench を使用した Linux インスタンスへのログイン」をご参照ください。
-
eRDMA と bRPC の接続の確立モードを変更して、互換性を確保します。
説明デフォルトでは、eRDMA は RDMA_CM を使用して接続を確立し、bRPC はアウトオブバンド (OOB) モードを使用します。両方の接続モードを変更して、互換性を確保する必要があります。
sudo sh -c "echo 'options erdma compat_mode=Y' >> /etc/modprobe.d/erdma.conf" sudo dracut --force sudo rmmod erdma sudo modprobe erdma compat_mode=Y -
メモリロックの制限を解除します。eRDMA アプリケーションは通常、大量のメモリを必要とします。
-
limits.confファイルを編集します。sudo vi /etc/security/limits.conf -
ファイルの末尾に次の行を追加して保存します。
* soft memlock unlimited * hard memlock unlimited
-
-
bRPC アプリケーションをデプロイします。
sudo yum install git gcc-c++ make openssl-devel gflags-devel protobuf-devel protobuf-compiler leveldb-devel -y git clone https://github.com/apache/brpc.git -
eRDMA での bRPC のパフォーマンスを向上させるために、両方のインスタンスで次のパッチを適用します。
-
brpcディレクトリに、erdma-multi-sge.patchという名前のファイルを作成します。cd ~/brpc sudo vi erdma-multi-sge.patch -
次の内容を追加して保存します。
diff --git a/src/brpc/rdma/rdma_helper.cpp b/src/brpc/rdma/rdma_helper.cpp index cf1cce95..d2592cbb 100644 --- a/src/brpc/rdma/rdma_helper.cpp +++ b/src/brpc/rdma/rdma_helper.cpp @@ -619,7 +619,7 @@ void DeregisterMemoryForRdma(void* buf) { } int GetRdmaMaxSge() { - return g_max_sge; + return 4; } int GetRdmaCompVector() { -- 2.39.3 -
パッチを bRPC のソースコードに適用します。
patch -p1 < erdma-multi-sge.patch -
bRPC のソースコードをコンパイルします。
sh config_brpc.sh --with-rdma --headers="/usr/include" --libs="/usr/lib64 /usr/bin" make -j cd example/rdma_performance; make -j
-
ステップ 3:パフォーマンステスト
eRDMA を使用する場合と使用しない場合で bRPC のパフォーマンスをテストし、結果を比較します。
-
次の 2 つのシナリオで bRPC のパフォーマンスをテストします。
eRDMA を使用する場合
-
サーバーで、eRDMA を有効にしてサーバーを起動します。
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true -
クライアントで、eRDMA を有効にしてサーバーに接続します。
./client --servers=<server private IP address>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true --queue_depth=16パラメーター:
-
<server private IP address>をサーバーのプライベート IP アドレスに置き換えます。 -
--attachment_size:各 bRPC コールに添付されるデータサイズです。値を大きくすると eRDMA をより有効に活用できますが、メモリ管理の複雑さが増します。テスト要件に基づいて設定してください。 -
--queue_depth:キューが保持できる同時リクエストの数です。キューデプスを大きくするとトラフィックの急増に対応しやすくなりますが、より多くのメモリを消費します。テスト要件に基づいて設定してください。
-
eRDMA を使用しない場合
-
サーバーで、TCP を使用してサーバーを起動します。
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false -
クライアントで、TCP を使用してサーバーに接続します。
./client --servers=<server private IP address>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false --queue_depth=16パラメーター:
-
<server private IP address>をサーバーのプライベート IP アドレスに置き換えます。 -
--attachment_size:各 bRPC コールに添付されるデータサイズです。値を大きくすると eRDMA をより有効に活用できますが、メモリ管理の複雑さが増します。テスト要件に基づいて設定してください。 -
--queue_depth:キューが保持できる同時リクエストの数です。キューデプスを大きくするとトラフィックの急増に対応しやすくなりますが、より多くのメモリを消費します。テスト要件に基づいて設定してください。
-
-
-
両方のシナリオの結果を比較します。
Avg-Latencyフィールドでレイテンシーを、QPSフィールドでスループットを確認し、eRDMA のパフォーマンス向上を評価します。