eMQTT-Benchによるパフォーマンステスト
EMQXをシングルモードまたはEMQXクラスターとしてデプロイした後、システムの容量や負荷時の挙動を理解するためにパフォーマンスを評価できます。本節では、パフォーマンステストを実施するためのeMQTT-Benchのインストール方法と使用方法について説明します。
eMQTT-BenchはErlangで書かれた軽量かつ強力なMQTTベンチマークツールで、多数のクライアントをシミュレートし、スループットやレイテンシなどの主要なパフォーマンス指標を測定できます。大規模なテストシナリオや高度なカスタマイズベンチマークの要件がある場合は、sales@emqx.ioまでお問い合わせください。
eMQTT-Benchのインストール
eMQTT-Benchのインストール方法は以下の3つのオプションがあります。
- Dockerイメージの実行
- バイナリパッケージのダウンロードとインストール
- ソースコードからのビルド
Dockerイメージ
hub.docker.comに公開されているemqtt-benchのDockerイメージを実行してベンチマークツールをインストールできます。:latestタグは新しいバージョンごとに更新されます。
docker run -it emqx/emqtt-bench:latest
Usage: emqtt_bench pub | sub | conn [--help]なお、Dockerイメージ名はハイフン-を使用していますが、バイナリスクリプト名はアンダースコア_を使用している点にご注意ください。
バイナリパッケージ
公式ダウンロードサイトからリリース済みのバイナリパッケージをダウンロードし、対応プラットフォームにemqtt-benchをインストールできます。
各emqtt-benchリリースの詳細はReleasesをご参照ください。
例として、Ubuntu 20.04にemqtt-benchをインストールする手順は以下の通りです。
mkdir emqtt-bench && cd emqtt-bench
wget https://github.com/emqx/emqtt-bench/releases/download/0.4.12/emqtt-bench-0.4.12-ubuntu20.04-amd64.tar.gz
tar xfz emqtt-bench-0.4.12-ubuntu20.04-amd64.tar.gz
rm emqtt-bench-0.4.12-ubuntu20.04-amd64.tar.gz
./emqtt_bench
Usage: emqtt_bench pub | sub | conn [--help]ソースコードからのビルド
eMQTT-BenchはErlangで書かれており、ビルドにはErlang/OTP 22.3以上が必要です。Erlang/OTPのインストール手順はここでは省略します。詳細はオンラインのインストールチュートリアルをご参照ください。
Erlang環境をインストール後、emqtt-benchの最新コードをダウンロードしてコンパイルします。
git clone https://github.com/emqx/emqtt-bench
cd emqtt-bench
makeコンパイル後、カレントディレクトリにemqtt_benchという実行可能スクリプトが生成されます。以下のコマンドで正常に動作することを確認してください。
./emqtt_bench
Usage: emqtt_bench pub | sub | conn [--help]上記の出力が表示されれば、emqtt-benchがホストに正しくインストールされたことを示します。
eMQTT-Benchの使い方
emqtt_benchには3つのサブコマンドがあります。
pub:多数のクライアントを作成し、メッセージをパブリッシュする操作を行うsub:多数のクライアントを作成し、トピックをサブスクライブしてメッセージを受信するconn:多数の接続を作成する
パブリッシュ
./emqtt_bench pub --helpを実行すると利用可能なパラメーターが表示されます。
| パラメーター | 省略形 | オプション値 | デフォルト値 | 説明 |
|---|---|---|---|---|
| --host | -h | - | localhost | 接続するMQTTサーバーのアドレス |
| --port | -p | - | 1883 | MQTTサービスのポート番号 |
| --version | -V | 3 4 5 | 5 | 使用するMQTTプロトコルバージョン |
| --count | -c | - | 200 | クライアントの総数 |
| --startnumber | -n | - | 0 | クライアントの開始番号 |
| --interval | -i | - | 10 | クライアント作成間隔(単位:ms) |
| --interval_of_msg | -I | - | 1000 | メッセージパブリッシュ間隔 |
| --username | -u | - | なし(任意) | クライアントのユーザー名 |
| --password | -P | - | なし(任意) | クライアントのパスワード |
| --topic | -t | - | なし(必須) | パブリッシュするトピック。プレースホルダー対応:%c: ClientId%u: Username%i: クライアントの連番 |
| --size | -s | - | 256 | メッセージペイロードのサイズ(バイト単位) |
| --qos | -q | - | 0 | QoSレベル |
| --retain | -r | true false | false | メッセージのRetainフラグ設定の有無 |
| --keepalive | -k | - | 300 | クライアントのキープアライブ時間 |
| --clean | -C | true false | true | セッションをクリアして接続を確立するかどうか |
| --ssl | -S | true false | false | SSLを有効にするかどうか |
| --certfile | - | - | なし | クライアントのSSL証明書ファイル |
| --keyfile | - | - | なし | クライアントのSSLキー ファイル |
| --ws | - | true false | false | WebSocket経由で接続を確立するかどうか |
| --ifaddr | - | - | なし | クライアント接続に使用するローカルネットワークインターフェースを指定 |
例えば、10接続を開始し、トピックtに対して1秒間に100件のQoS0メッセージをパブリッシュし、各メッセージのペイロードサイズが16バイトの場合は以下のように実行します。
./emqtt_bench pub -t t -h emqx-server -s 16 -q 0 -c 10 -I 10サブスクライブ
./emqtt_bench sub --helpを実行すると、このサブコマンドで利用可能なパラメーターが表示されます。説明は上記の表と同様のため省略します。
例えば、500接続を開始し、それぞれがQoS0でトピックtをサブスクライブする場合は以下のように実行します。
./emqtt_bench sub -t t -h emqx-server -c 500接続
./emqtt_bench conn --helpを実行すると、このサブコマンドで利用可能なパラメーターが表示されます。説明は上記の表と同様のため省略します。
例えば、1000接続を開始する場合は以下のように実行します。
./emqtt_bench conn -h emqx-server -c 1000SSL接続
emqtt-benchはSSLによる安全な接続を確立してテストを実行することをサポートしています。
片方向証明書の場合:
./emqtt_bench sub -c 100 -i 10 -t bench/%i -p 8883 -S
./emqtt_bench pub -c 100 -I 10 -t bench/%i -p 8883 -s 256 -S双方向証明書の場合:
./emqtt_bench sub -c 100 -i 10 -t bench/%i -p 8883 --certfile path/to/client-cert.pem --keyfile path/to/client-key.pem
./emqtt_bench pub -c 100 -i 10 -t bench/%i -s 256 -p 8883 --certfile path/to/client-cert.pem --keyfile path/to/client-key.pemストレステストの実施
本節では、接続とスループットの2つの典型的なシナリオにおけるストレステストの実施方法を説明します。
典型的なストレステストシナリオ
以下の2つの典型的なシナリオでツールの使用を検証します。
- 接続数:
emqtt-benchを使用してEMQXに数百万の接続を作成する。 - スループット:
emqtt-benchを使用してEMQXで100k/s Qos 0のメッセージスループットを作成する。
デバイスおよびデプロイトポロジー
合計3台の8コア16GBサーバーを準備します。1台はEMQX用、2台はクライアントプレッシャー用です。
- システム:
CentOS Linux release 7.7.1908 (Core) - CPU:
Intel Xeon Processor (Skylake)メインクロック:2693.670 MHZ - サーバー:
emqx-centos7-v4.0.2.zip - プレッシャー:
emqtt-bench v0.3.1、各プレッシャーは10個のネットワークカードを設定し、接続テストで多数のMQTTクライアント接続を確立するために使用
トポロジー構成は以下の通りです。

チューニング
クライアントプレッシャー側とサーバー側の両方でシステムパラメーターのチューニングを行う必要があります。詳細はTuning guideを参照してください。
接続テスト
システムチューニング後、EMQXを起動し、bench1の各ネットワークカードごとに5万接続を開始します。合計で50万接続となります。
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.100
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.101
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.102
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.103
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.104
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.105
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.106
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.107
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.108
./emqtt_bench -h 192.168.0.99 -c 50000 --ifaddr 192.168.0.109同様の操作をbench2でも実行します。
すべての接続確立後、./bin/emqx ctl listenersを実行すると、EMQXの接続数に関する以下の情報が確認できます。
listener on mqtt:tcp:0.0.0.0:1883
acceptors : 8
max_conns : 1024000
current_conn : 1000000
shutdown_count : []スループットテスト
同様に、まずEMQXを起動し、bench1で500のサブスクライブクライアントを開始します。
./emqtt_bench sub -t t -h 192.168.0.99 -c 500次にbench2で20のパブリッシャーを起動し、1秒間に10メッセージをパブリッシュします。
./emqtt_bench pub -t t -h 192.168.0.99 -c 20 -I 100bench1のサブスクライブクライアントに戻ると、現在の受信メッセージレートを確認できます。
recv(28006): total=2102563, rate=99725(msg/sec)