eRDMA 対応の Elastic Compute Service (ECS) インスタンスに Kafka クラスターをデプロイして、ノード間のレイテンシーと CPU オーバーヘッドを削減し、パフォーマンスの向上をベンチマークで測定します。
-
Kafka は、データストリームを処理・保存する分散ストリーム処理プラットフォームであり、リアルタイムのメッセージパブリッシングとサブスクリプションをサポートします。Kafka は、ログ集約、イベントソーシング、リアルタイム分析などのシナリオで広く使用されています。詳細については、「Kafka ドキュメント」をご参照ください。
-
eRDMA は、Alibaba Cloud が開発したリモートダイレクトメモリアクセス (RDMA) サービスで、低レイテンシー、高スループット、高弾力性を実現します。詳細については、「概要」をご参照ください。
ステップ1:ECS インスタンスの準備
Kafka クラスターをデプロイする前に、ブローカー、ZooKeeper、およびストレステスト用の ECS インスタンスを準備します。
-
ブローカーインスタンスは、コアデータノードとしてメッセージを保存、転送、管理します。
-
ZooKeeper インスタンスは、Kafka クラスターの分散コーディネーションを処理します。
-
ストレステストインスタンスは、Kafka クラスターのパフォーマンスをベンチマークで測定します。
この例では、5 つの ECS インスタンス (ZooKeeper 1 つ、ブローカー 3 つ、ストレステスト 1 つ) を使用します。次の表に、設定要件を示します。
選択するインスタンスタイプは eRDMA をサポートしている必要があります。サポートされているインスタンスタイプについては、「エンタープライズレベルのインスタンスで eRDMA を設定」の「制限事項」をご参照ください。
|
目的 |
インスタンス要件 |
ディスク要件 |
ネットワーク要件 |
イメージ要件 |
|
ブローカー用インスタンス |
3 つのインスタンス。この例では ecs.g8a.2xlarge を使用します。 |
PL3 のエンタープライズ SSD (ESSD)。ビジネス要件に基づいて容量を選択します。 |
|
Alibaba Cloud Linux 3.2104 LTS 64 ビット。 |
|
ZooKeeper 用インスタンス |
1 つのインスタンス。この例では ecs.g8a.xlarge を使用します。 |
なし。 |
||
|
ストレステストインスタンス |
1 つのインスタンス。この例では ecs.g8a.16xlarge を使用します。 |
なし。 |
ステップ2:必要なツールと Kafka のインストール
ステップ1 の各 ECS インスタンスにログインし、SMC-R、Java、Kafka をインストールします。
eRDMA には、eRDMA リソースを管理するカーネル空間プロトコルスタックである SMC-R が必要です。詳細については、「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 とブローカーの起動
-
すべての ECS インスタンスにログインします。
-
各インスタンスのプライベート 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 -
各ブローカーインスタンスでブローカーを起動します。
説明eRDMA なしでテストするには、コマンドから
smc_runパラメーターを削除します。-
最初のブローカーインスタンスで、ブローカー ID を
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 を
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 を
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:Kafka のパフォーマンステスト
ベンチマークツールをダウンロードし、ネットワーク帯域幅を最大化するように設定します。 eRDMA を使用した場合と使用しない場合で Kafka のパフォーマンスをテストし、結果を比較します。
-
ストレステストインスタンスにログインし、Open Messaging Benchmark をダウンロードしてコンパイルします。
-
Open Messaging Benchmark のコンパイラである Maven をダウンロードしてインストールします。
wget https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz tar -xf apache-maven-3.8.8-bin.tar.gz export PATH=$PATH:$HOME/apache-maven-3.8.8/bin/ -
ダウンロードを高速化するために Maven ミラーを設定します。
vi $HOME/apache-maven-3.8.8/conf/settings.xml以下のコンテンツを
settings.xml mirrorsタグに追加し、ファイルを保存して閉じます。<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ファイルでブローカーの IP アドレスを設定します。vi $HOME/benchmark/driver-kafka/kafka-throughput.yamlbootstrap.serversを Broker インスタンスのプライベート IP アドレスに設定します:<Broker 0 のプライベート IP アドレス>:9092,<Broker 1 のプライベート IP アドレス>:9092,<Broker 2 のプライベート 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 -
利用可能なネットワーク帯域幅を飽和させるようにメッセージ送信レートを設定します。
vi $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-200k.yamlproducerRate: <メッセージ送信レート>を変更します。このレートは、Broker が有効なインスタンスの利用可能な帯域幅/単一メッセージのサイズとして計算されます。この例では、各ブローカーは ecs.g8a.2xlarge (最大 4 Gbit/s) を使用します。 3 つのブローカーの合計帯域幅は 12 Gbit/s です。 Kafka の 3 レプリカメカニズムにより、
ブローカーインスタンスの利用可能な帯域幅は 12/3 = 4 Gbit/s (512 MB/s) になります。workloadsディレクトリ内のメッセージサイズが 1 KB の場合、メッセージ送信レートは 512 MB/s / 1 KB = 524,288 になります。producerRate: <メッセージ送信レート>をproducerRate: 524288に設定します。 実際の要件に基づいてレートを調整してください。 -
次のいずれかの方法を使用して、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-200k.yamlテスト中に、次のことも実行できます。
-
ストレス テスト インスタンス上の別のウィンドウで
smcss -aを実行し、SMC-R がメッセージを送信していることを確認します。 -
各 Broker インスタンスで
sarを実行し、CPU 使用率を確認します。 たとえば、sar 1 20を実行すると、1 秒に 1 回、20 回サンプリングされます。 3 つすべての Broker インスタンスの CPU 使用率を合計して、全体の値を求めます。
eRDMA が無効な場合のパフォーマンステスト
$HOME/benchmark/bin/benchmark --drivers $HOME/benchmark/driver-kafka/kafka-throughput.yaml $HOME/benchmark/workloads/1-topic-100-partitions-1kb-4p-4c-200k.yaml重要残存するテストデータが eRDMA を使用しないテストに影響を与えないように、ブローカーと ZooKeeper のレコードを削除し、両方のサービスを再起動します。
-
-
両方のテストのレイテンシー結果を比較して、eRDMA のパフォーマンスへの影響を評価します。
最後の
Aggregated Pub Latency (ms)エントリを見つけます。avgは平均レイテンシー、99% は P99 レイテンシー、999% は P999 レイテンシーです。