bRPC は、C++ で記述された高性能・汎用のリモートプロシージャコール(RPC)フレームワークです。Elastic Remote Direct Memory Access(eRDMA)対応の ECS インスタンス上でデプロイすると、低遅延、高スループット、CPU 使用率の削減といった恩恵が得られ、検索、ストレージ、機械学習、広告配信など、同時実行数が多く、遅延の影響を受けやすいワークロードに最適です。
本ガイドでは、eRDMA 対応の ECS インスタンス 2 台に bRPC をデプロイし、TCP との比較によるパフォーマンス向上をベンチマークする手順を説明します。
eRDMA の概要については、「eRDMA の概要」をご参照ください。bRPC ドキュメントについては、「入門」をご参照ください。
操作手順の概要
| ステップ | 説明 | 必須? |
|---|---|---|
| ステップ 1 | eRDMA 対応の ECS インスタンスを 2 台作成 | 必須 |
| ステップ 2 | bRPC のデプロイとコンパイル | 必須 |
| ステップ 3 | パフォーマンステストの実行 | 必須 |
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
ECS インスタンスを作成できる権限を持つ Alibaba Cloud アカウント
Linux コマンドライン操作に慣れていること
ステップ 1:eRDMA 対応の ECS インスタンスの作成
ECS インスタンスを 2 台作成します。1 台をサーバー、もう 1 台をクライアントとして使用します。インスタンス作成時に、以下の設定を構成してください。
インスタンスタイプ
eRDMA をサポートするインスタンスタイプを選択します。対応するタイプの一覧については、「エンタープライズ向けインスタンスへの eRDMA の構成」の「使用制限」セクションをご参照ください。例: ecs.g8a.8xlarge。
イメージ
eRDMA をサポートするイメージを選択します。対応するイメージの一覧については、同様の「使用制限」セクションをご参照ください。例: Alibaba Cloud Linux 3.2104 LTS 64 ビット。
eRDMA ドライバー
eRDMA ドライバーの自動インストール を選択します。インスタンス起動後にドライバーが自動的にインストールされます。eRDMA ドライバーのインストール を選択します
インスタンス起動後、ドライバーのインストール完了まで 3~5 分待ちます。詳細については、「エンタープライズ向けインスタンスへの eRDMA の有効化」をご参照ください。
ネットワーク
両方のインスタンスでインターネットアクセスを有効化します。
同一の仮想プライベートクラウド(VPC)内のインスタンスは、デフォルトで内部ネットワーク経由で通信します。
弾性ネットワークインターフェイス(ENI)セクションで、右側の eRDMA インターフェイス を選択します。
その他のすべてのパラメーターについては、「ECS インスタンスの作成」をご参照ください。
ステップ 2:bRPC のデプロイとコンパイル
このセクションのすべての手順を、両方のインスタンスで実行します。以下の手順では、Alibaba Cloud Linux 3 を使用します。他のオペレーティングシステムについては、「RDMA を使用した bRPC のビルド」をご参照ください。
各 ECS インスタンスにログインします。手順については、「Linux インスタンスへの接続」をご参照ください。
eRDMA を帯域外(Out-of-Band:OOB)接続モードに切り替えます。デフォルトでは 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大規模な RDMA ワークロード向けにメモリのロックを解除します。大量のデータを転送する eRDMA アプリケーションは、効率的に動作するためにロックされていないメモリを必要とします。
制限設定ファイルを開きます。
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 パフォーマンスパッチの適用。このパッチは、RDMA 操作で使用される最大スキャッター/ギャザー(scatter/gather)エントリ数を修正することでパフォーマンスを向上させます。パフォーマンス最適化が必要ない場合は、このステップをスキップできます。
brpcディレクトリ内にパッチファイルを作成します。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パッチを適用します。
patch -p1 < erdma-multi-sge.patch
RDMA サポート付きで 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 有効時および TCP 専用時の 2 種類の構成でベンチマークを実行し、結果を比較します。
eRDMA を使用したテスト
サーバーで、eRDMA を使用してサーバーを起動します。
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=trueクライアントで、eRDMA を使用してサーバーに接続します。
./client --servers=<server-private-ip>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true --queue_depth=16
TCP を使用したテスト
サーバーで、TCP を使用してサーバーを起動します。
./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=falseクライアントで、TCP を使用してサーバーに接続します。
./client --servers=<server-private-ip>: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> | サーバーインスタンスのプライベート IP アドレス | — |
--attachment_size | 各 bRPC 呼び出しに添付されるデータのサイズ(バイト単位)。値が大きいほど eRDMA のスループット優位性をより活かせますが、メモリ管理のオーバーヘッドも増加します。 | 1024 |
--queue_depth | キュー内の同時リクエスト数。値が高いほど負荷が重い状況でのスループットが向上しますが、消費メモリ量も増加します。 | 16 |
結果の解釈
両方のテスト実行から出力される以下のフィールドを比較します。
| フィールド | 指標 |
|---|---|
Avg-Latency | 平均遅延 — 数値が小さいほど良好 |
QPS | 1 秒あたりのリクエスト数(スループット) — 数値が高いほど良好 |
eRDMA テストで Avg-Latency が低く、QPS が高い場合、eRDMA がご利用のワークロードにおける bRPC のパフォーマンスを向上させていることが確認できます。
次のステップ
実際のワークロード特性に応じて、
--attachment_sizeおよび--queue_depthを調整してください。追加の構成オプションおよびサポートされているシナリオについては、「eRDMA の概要」をご参照ください。