eRDMA 対応の Elastic Compute Service (ECS) インスタンスに Kafka クラスターをデプロイすることで、eRDMA の低レイテンシー、高スループット、低 CPU 使用率という利点を活用できます。これにより、Kafka クラスター内のノード間のデータ転送効率が最適化され、高スループットと低レイテンシーが要求されるアプリケーションに最適です。このトピックでは、eRDMA 対応の ECS インスタンスに Kafka クラスターをデプロイし、eRDMA のパフォーマンス上の利点をテストする方法について説明します。
-
Kafka は、大量のデータストリームを効率的に処理および保存するために使用される分散ストリーミングプラットフォームです。リアルタイムのメッセージパブリッシングおよびサブスクリプションをサポートし、ログ集約、イベントソーシング、リアルタイム分析などのシナリオで広く使用されています。詳細については、Apache Kafka ドキュメントをご参照ください。
-
eRDMA (Elastic Remote Direct Memory Access) は、Alibaba Cloud のパフォーマンス専有型 RDMA ネットワークサービスであり、低レイテンシー、高スループット、高い弾力性を特徴としています。詳細については、「eRDMA の概要」をご参照ください。
ステップ 1:ECS インスタンスの準備
クラスターをデプロイするには、ブローカーおよび ZooKeeper サービスをホストし、ストレステスト環境をデプロイするために、複数の ECS インスタンスを準備する必要があります。
-
ブローカー:クラスターの中核となるデータノードで、メッセージの保存、転送、管理を担当します。
-
ZooKeeper:Kafka クラスターに分散サービスコーディネーションと管理を提供します。
-
ストレステストインスタンス:デプロイされた Kafka クラスターのパフォーマンスを検証するために使用します。
このトピックでは、1 つの ZooKeeper インスタンス、3 つのブローカーインスタンス、1 つのストレステストインスタンスの計 5 つの ECS インスタンスを使用します。次の表に、インスタンスの構成要件を示します。
選択するインスタンスタイプは eRDMA をサポートしている必要があります。eRDMA がサポートするインスタンスタイプの一覧については、「制限事項」をご参照ください。
|
目的 |
必要なインスタンス |
クラウドディスク要件 |
ネットワーク要件 |
イメージ要件 |
|
ブローカーのホスティング |
3 インスタンス。インスタンスタイプの例:ecs.g8a.2xlarge |
ESSD PL3 クラウドディスクを選択し、必要に応じて容量を指定します。 |
|
Alibaba Cloud Linux 3.2104 LTS 64 ビット |
|
ZooKeeper のホスティング |
1 インスタンス。インスタンスタイプの例:ecs.g8a.xlarge |
特別な要件はありません |
||
|
性能テストの実行 |
1 インスタンス。インスタンスタイプの例:ecs.g8a.16xlarge |
特別な要件はありません |
ステップ 2:ツールと Kafka のインストール
ステップ 1 で準備した 5 つの ECS インスタンスにログインして、SMC-R、Java、および Kafka をインストールします。
eRDMA を使用する場合、SMC-R をデプロイする必要があります。SMC-R はカーネル空間で実行され、SMC-R プロトコルスタックが eRDMA リソースを使用、管理、および維持します。詳細については、「Shared Memory Communications (SMC) の有効化と設定」をご参照ください。
-
各 ECS インスタンスにログインします。
詳細については、「ワークベンチを使用して Linux インスタンスにログインする」をご参照ください。
-
(必須) すべてのインスタンスのカーネルバージョン (
uname -rを実行して確認) が5.10.134-16.3以上であることを確認します。インスタンスのカーネルバージョンが5.10.134-16.3未満の場合は、次のコマンドを実行してカーネルを最新バージョンにアップグレードします。sudo yum update kernel sudo reboot -
各インスタンスで次のコマンドを実行して、smc-tools ツールセットをインストールします。
sudo yum install smc-tools -y -
各インスタンスで次のコマンドを実行して eRDMA デバイスを確認し、検出されることを検証します。
smcr dev出力例:
Net-Dev IB-Dev IB-P IB-State Type Crit #Links PNET-ID eth0 erdma_0 1 ACTIVE 0x107f No 0 -
各インスタンスで次のコマンドを実行して IPv6 を無効にします。
説明Alibaba Cloud の eRDMA デバイスと SMC は IPv6 をサポートしていません。IPv6 を無効にすることで、トラフィックが IPv4 を介して RDMA チャンネル経由で正しくルーティングされるようになります。
sudo sysctl net.ipv6.conf.all.disable_ipv6=1 -
次のコマンドを実行して Java と Git をインストールします。
sudo yum install java-11-openjdk-1:11.0.21.0.9-2.0.3.al8 java-11-openjdk-devel-1:11.0.21.0.9-2.0.3.al8 git -y -
次のコマンドを実行して Kafka パッケージをダウンロードし、解凍します:
wget https://archive.apache.org/dist/kafka/3.5.0/kafka_2.13-3.5.0.tgz tar -xf kafka_2.13-3.5.0.tgz
ステップ 3:Kafka ZooKeeper とブローカーの起動
-
すべてのインスタンスにログインします。
-
各インスタンスの
/etc/hostsファイルを変更します。すべてのインスタンスのプライベート IP アドレスとホスト名のマッピングを/etc/hostsファイルに追加します。
-
Zookeeper インスタンスで、次のコマンドを実行して Zookeeper を起動します。
bash $HOME/kafka_2.13-3.5.0/bin/zookeeper-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/zookeeper.properties -
3 つのブローカーインスタンスでブローカーを起動します。
説明eRDMA 機能を使用せずにテストする場合は、コマンドから
smc_runを削除してください。-
最初のブローカーインスタンスで、ブローカー ID を
broker 0に設定し、ブローカーを起動します。<zookeeper ip>を Zookeeper インスタンスのプライベート IP アドレスに置き換えます。KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties --override broker.id=0 --override log.dirs=$HOME/kafka-logs --override zookeeper.connect=<zookeeper ip>:2181 -
2 番目のブローカーインスタンスで、ブローカー ID を
broker 1に設定し、ブローカーを起動します。<zookeeper ip>を Zookeeper インスタンスのプライベート IP アドレスに置き換えます。KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties --override broker.id=1 --override log.dirs=$HOME/kafka-logs --override zookeeper.connect=<zookeeper ip>:2181 -
3 番目のブローカーインスタンスで、ブローカー ID を
broker 2に設定し、ブローカーを起動します。<zookeeper ip>を Zookeeper インスタンスのプライベート IP アドレスに置き換えます。KAFKA_HEAP_OPTS="-Xmx4G -Xms4G" smc_run bash $HOME/kafka_2.13-3.5.0/bin/kafka-server-start.sh -daemon $HOME/kafka_2.13-3.5.0/config/server.properties --override broker.id=2 --override log.dirs=$HOME/kafka-logs --override zookeeper.connect=<zookeeper ip>:2181
-
ステップ 4:性能テスト
ベンチマークツールをダウンロードし、利用可能な最大ネットワーク帯域幅の環境をシミュレートします。次に、eRDMA 機能を有効にした場合と無効にした場合で Kafka の性能をテストし、テスト結果を使用して eRDMA が Kafka クラスターに提供する性能向上を比較します。
-
ストレステストインスタンスにログインします。Open Messaging Benchmark をダウンロードしてコンパイルします。
-
Open Messaging Benchmark のビルドツールである Maven をダウンロードしてインストールします。
wget https://archive.apache.org/dist/maven/maven-3/3.9.9/binaries/apache-maven-3.9.9-bin.tar.gz tar -xf apache-maven-3.9.9-bin.tar.gz export PATH=$PATH:$HOME/apache-maven-3.9.9/bin/ -
ダウンロードを高速化するために Maven ミラーを設定します。
vi $HOME/apache-maven-3.9.9/conf/settings.xmlmirrorsタグ内のsettings.xmlファイルに次の内容を追加します。その後、ファイルを保存して終了します。<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> </mirror> -
Open Messaging Benchmark のソースコードをダウンロードしてコンパイルします。
git clone https://github.com/openmessaging/benchmark.git cd benchmark && mvn clean verify -DskipTests
-
-
kafka-throughput.yaml でブローカーアドレスを設定します。
vi $HOME/benchmark/driver-kafka/kafka-throughput.yamlファイル内で、
bootstrap.servers=localhost:9092をbootstrap.servers=<broker0 のプライベート IP アドレス>:9092,<broker1 のプライベート IP アドレス>:9092,<broker2 のプライベート IP アドレス>:9092に置き換えます。commonConfig: | bootstrap.servers=<172.17.XX.XX>:9092,<172.17.XX.XX>:9092,<172.17.XX.XX>:9092 default.api.timeout.ms=1200000 request.timeout.ms=1200000 -
Kafka のメッセージ送信レートを設定して、利用可能な最大ネットワーク帯域幅の環境をシミュレートし、Kafka クラスターの性能をテストします。
vi $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-200k.yamlproducerRate: <メッセージ送信レート>パラメーターを変更します。メッセージ送信レートは、数式:メッセージ送信レート = 利用可能なブローカー帯域幅 / 単一メッセージのサイズを使用して計算されます。この例では、ブローカーインスタンスタイプは ecs.g8a.2xlarge で、最大ネットワーク帯域幅は 4 Gbit/s です。3 つのブローカーインスタンスの合計帯域幅は 12 Gbit/s です。Kafka は 3 レプリカメカニズムを使用するため、実際に利用可能な帯域幅は合計帯域幅の約 3 分の 1 です。したがって、
利用可能なブローカー帯域幅は 12 Gbit/s / 3 = 4 Gbit/s (512 MB/s) です。テストは単一メッセージのサイズが 1 KB のworkloadsディレクトリで実行されるため、メッセージ送信レートは 512 MB/s / 1 KB = 524,288 となります。したがって、ファイル内のproducerRate: <メッセージ送信レート>をproducerRate: 524288に変更する必要があります。実際のテストでは、ビジネス要件に基づいてこの値を調整してください。 -
次の 2 つのシナリオで Kafka クラスターの性能をテストします。
eRDMA を使用したテスト
smc_run $HOME/benchmark/bin/benchmark --drivers $HOME/benchmark/driver-kafka/kafka-throughput.yaml $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-2000k.yamlKafka テストの実行中に、次の操作を実行できます:
-
ストレステストインスタンスの別のターミナルウィンドウで、
smcss -aコマンドを実行して、接続がメッセージ送信に SMC-R を使用していることを確認します。 -
3 つのブローカーインスタンスで、
sarコマンドを実行して CPU 使用率を確認します。たとえば、sar 1 20コマンドは 1 秒ごとに 20 回使用率をサンプリングしてから終了します。3 つのブローカーインスタンスの CPU 使用率の値を合計して、総 CPU 使用率を求めることができます。
eRDMA を使用しないテスト
$HOME/benchmark/bin/benchmark --drivers $HOME/benchmark/driver-kafka/kafka-throughput.yaml $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-2000k.yaml重要eRDMA を使用したテストの後、レコードをクリアし、ブローカーと Zookeeper を再起動します。これにより、残存するテストデータが eRDMA を使用しないテストに影響を与えるのを防ぎます。
-
-
両方のテストの結果からレイテンシー情報を取得します。結果を比較して、eRDMA が Kafka クラスターにもたらす性能向上を評価します。
最後の
Aggregated Pub Latency (ms)出力を見つけます。avgは平均レイテンシー、99%は P99 レイテンシー、99.9%は P999 レイテンシーです。