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

Elastic Compute Service:eRDMAに基づく高性能bRPCアプリケーションのデプロイ

最終更新日:Nov 20, 2024

Elastic Remote Direct Memory Access (eRDMA) をサポートするElastic Compute Service (ECS) インスタンスに、より優れたリモートプロシージャコール (bRPC) アプリケーションをデプロイできます。 このようにして、eRDMAによって提供される低レイテンシ、高スループット、および低CPU使用率を最大限に活用して、bRPCアプリケーションのデータ伝送効率を最適化できます。 これは、高いメッセージスループットを必要とし、レイテンシに敏感なシナリオに適しています。 このトピックでは、eRDMAをサポートするECSインスタンスにbRPCアプリケーションをデプロイする方法と、eRDMAを使用する場合のbRPCアプリケーションのパフォーマンス改善をテストする方法について説明します。

説明
  • bRPCは、C ++ で書かれた高性能で汎用のリモートプロシージャ呼び出しフレームワークです。 bRPCは、サービスの開発と展開を簡素化するための豊富な機能とツールを提供します。 bRPCは、検索、ストレージ、機械学習、および広告のシナリオで一般的に使用されます。 bRPCを使用して、同時実行性が高く、レイテンシーの低いマイクロサービスや大規模な分散システムを構築できます。 bRPCの詳細については、「入門」をご参照ください。

  • eRDMAは、Alibaba Cloudによって開発されたリモートダイレクトメモリアクセス (RDMA) サービスであり、低レイテンシ、高スループット、高弾力性で高いネットワークパフォーマンスを保証します。 詳細については、「概要」をご参照ください。

ステップ1: 準備をする

2つのeRDMA対応ECSインスタンスを作成します。 一方のECSインスタンスはサーバーとして機能し、もう一方のインスタンスはクライアントとして機能します。 インスタンスの作成時に、次の項目に注意してください。

  • インスタンスタイプ: 選択したインスタンスタイプはeRDMAをサポートする必要があります。 詳細については、「エンタープライズレベルのインスタンスでのeRDMAの設定」トピックの制限セクションをご参照ください。 例: ecs.g8a.8xlarge.

  • イメージ: 選択したイメージはeRDMAをサポートする必要があります。 詳細については、「エンタープライズレベルのインスタンスでのeRDMAの設定」トピックの制限セクションをご参照ください。 例: Alibaba Cloud Linux 3.2104 LTS 64ビット

  • eRDMAドライバ:

    [eRDMAドライバーの自動インストール] を選択します。 その後、ECSインスタンスの作成中にeRDMAドライバーが自動的にインストールされます。

    説明

    インスタンスの起動後、eRDMAドライバーがインストールされるまで3〜5分待ちます。 詳細については、「エンタープライズレベルのインスタンスでのeRDMAの設定」をご参照ください。

  • ネットワーク

    • 各インスタンスがインターネットにアクセスできるようにする必要があります。

    • デフォルトでは、同じ仮想プライベートクラウド (VPC) 内のインスタンスは、内部ネットワークを介して相互に通信できます。

    • Elastic network interface (ENI): ENIセクションの右側にあるeRDMA Interfaceを選択します。

その他のパラメーターについては、「カスタム起動タブでインスタンスを作成する」をご参照ください。

ステップ2: bRPCのデプロイとコンパイル

2つのECSインスタンス (サーバーとクライアント) にbRPCをデプロイしてコンパイルします。 この例では、Alibaba Cloud Linux 3オペレーティングシステムが使用されています。 他のオペレーティングシステムにbRPCを展開する方法については、「bRPCのビルド」をご参照ください。

  1. 2つのECSインスタンスに順番にログインします。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、eRDMAの接続確立モードをbRPCと互換性があるように変更します。

    説明

    デフォルトでは、eRDMAはRDMA_CMモードで接続を確立し、bRPCは帯域外 (OOB) モードで接続を確立します。 したがって、eRDMAの接続確立モードをbRPCと互換性があるように変更する必要があります。

    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
  3. メモリロックを解除します。 大きなメモリスペースを必要とするeRDMA対応アプリケーションでは、データ伝送効率を向上させるためにメモリロックをロック解除する必要があります。

    1. 次のコマンドを実行して、limits.confファイルを変更します。

      sudo vi /etc/security/limits.conf
    2. 次の内容をファイルの最後に追加し、ファイルを保存して閉じます。

      * soft memlock unlimited
      * hard memlock unlimited
  4. 次のコマンドを実行して、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
  5. eRDMAを使用してbRPCをテストする場合、パフォーマンスを向上させるために、サーバーとクライアントに次のパッチをインストールすることをお勧めします。

    1. 実際の環境に基づいてbrpcディレクトリにファイルを作成します。 たとえば、ファイル名はerdma-multi-sge.patchです。 サンプルコマンド:

      cd ~/brpc
      sudo vi erdma-multi-sge.patch
    2. 次のコンテンツをファイルに追加し、ファイルを保存して閉じます。

      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
    3. 次のコマンドを実行して、パッチファイルをbRPCのソースコードに適用します。

      patch -p1 < erdma-multi-sge.patch
    4. 次のコマンドを実行して、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のパフォーマンスをテストし、テスト結果を比較して、eRDMAがbRPCにもたらすパフォーマンスの改善を評価します。

  1. 次のシナリオでbRPCのパフォーマンスをテストします。

    eRDMAを使用した場合のテストパフォーマンス

    1. サーバーで次のコマンドを実行して、サーバーを起動し、eRDMA経由の通信を有効にします。

      ./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true
    2. クライアントで次のコマンドを実行して、サーバーに接続し、eRDMA経由の通信を有効にします。

      ./client --servers=<Private IP address of the server>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=true --queue_depth=16

      次のパラメータに注意してください。

      • <サーバーのプライベートIPアドレス>: パラメーター値をサーバーの実際のプライベートIPアドレスに置き換えます。

      • -- attachment_size: 各bRPCコールにアタッチされるデータまたは転送されるデータのサイズを指定します。 このパラメータは、データ伝送の効率に影響します。 大ブロックデータ伝送は、eRDMAの利点をより効率的に利用することができる。 しかし、データサイズが大きすぎると、メモリ管理の複雑さが増す。 実際のテスト要件に基づいてこのパラメーターを設定することを推奨します。

      • -- queue_depth: リクエストキューの深さ、つまりキュー内の同時リクエスト数を指定します。 キューの深さの値が大きいほど、同時実行性の高いシナリオでの大量のリクエストにうまく対処でき、キューがいっぱいになることによるリクエストの拒否を防ぎます。 しかしながら、キュー深さの大きすぎる値は、より多くのメモリリソースを占有し得る。 実際のテスト要件に基づいてパラメーターを設定することを推奨します。

    eRDMAを使用しない場合のテストパフォーマンス

    1. サーバーで次のコマンドを実行して、サーバーを起動し、TCP経由の通信を有効にします。

      ./server --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false
    2. クライアントで次のコマンドを実行して、サーバーに接続し、TCP経由の通信を有効にします。

      ./client --servers=<Private IP address of the server>:8002 --rpc_timeout_ms=-1 --attachment_size=1024 --rdma_gid_index=1 --rdma_prepared_qp_cnt=0 --use_rdma=false --queue_depth=16

      次のパラメータに注意してください。

      • <サーバーのプライベートIPアドレス>: パラメーター値をサーバーの実際のプライベートIPアドレスに置き換えます。

      • -- attachment_size: 各bRPCコールにアタッチされるデータまたは転送されるデータのサイズを指定します。 このパラメータは、データ伝送の効率に影響します。 大ブロックデータ伝送は、eRDMAの利点をより効率的に利用することができる。 しかし、データサイズが大きすぎると、メモリ管理の複雑さが増す。 実際のテスト要件に基づいてこのパラメーターを設定することを推奨します。

      • -- queue_depth: リクエストキューの深さ、つまりキュー内の同時リクエスト数を指定します。 キューの深さの値が大きいほど、同時実行性の高いシナリオでの大量のリクエストにうまく対処でき、キューがいっぱいになることによるリクエストの拒否を防ぎます。 しかしながら、キュー深さの大きすぎる値は、より多くのメモリリソースを占有し得る。 実際のテスト要件に基づいてパラメーターを設定することを推奨します。

  2. 2つのテストの結果を取得して、Avg-latencyフィールドを表示することによるレイテンシとQPSフィールドを表示することによる帯域幅の観点から、eRDMAがbRPCにもたらすパフォーマンスの改善を評価します。