業務の関係でJames 3.5の分散バージョンを調査しました。既存のハードウェア構成でどの程度の同時ユーザーをサポートできるかを確認するため、JMeterを使用してストレステストを実施しました。
1. ハードウェア構成
構成1:2台の物理マシンと7台の仮想マシンノードを仮想化。各仮想マシンノードは8GB/4コア、ローカルディスク
構成2:Alibaba Cloud 6台のECS(ecs.hfg6.large)、2コア/8GB
2. Jamesのセットアップ
Jamesをより効果的に使用するため、ソースコードからJamesをコンパイルし、Dockerではなく従来のJavaアプリケーションデプロイメント方式でデプロイしました。
2.1 ステップ1:ソースコードのダウンロード
Jamesのmasterブランチのコードをローカルにクローンします:
git clone https://github.com/apache/james-project.git
2.2 ステップ2:コンパイルと設定
mvn packageコマンドを実行し、約2時間でコンパイルが完了します。
2.2.1 server/container/Guice/Cassandra/rabbitmq/Guice/targetをディレクトリにコピー(distディレクトリにコピーしたと仮定)
#jamesのコピー cp server/container/guice/cassandra-rabbitmq-guice/target/james-server-cassandra-rabbitmq-guice.jar dist/ cp -R server/container/guice/cassandra-rabbitmq-guice/target/james-server-cassandra-rabbitmq-guice.lib dist/
#jamesのコピー
cp server/container/guice/cassandra-rabbitmq-guice/target/james-server-cassandra-rabbitmq-guice.jar dist/
cp -R server/container/guice/cassandra-rabbitmq-guice/target/james-server-cassandra-rabbitmq-guice.lib dist/
**2.2.2. James rabbitの設定ファイルをdistディレクトリにコピー
cp -R dockerfiles/run/guice/cassandra-rabbitmq/destination/ dist
2.2.3. CLIをdistにコピー
#cliとlibのコピー
cp -R server/container/cli/target/james-server-cli.lib dist/
cp server/container/cli/target/james-server-cli.jar dist/
2.2.4. run_james.shを修正、スクリプト内容は以下のように変更
java -Dlogback.configurationFile=conf/logback.xml -Dworking.directory=./ $JVM_OPTIONS $GLOWROOT_OPTIONS -jar james-server-cassandra-rabbitmq-guice.jar
2.2.5 Jamesの起動
Cassandra/elasticsearch/rabbitmqの設定スクリプトをconfで修正後、run_james.shを実行するとJamesが起動します。
起動プロセスで問題が発生した場合は、エラーメッセージに応じて対応するトラブルシューティングを実行してください。
上記の手順は、以下のスクリプトを実行することで一度に完了できます:
#jamesのコピー
cp server/container/guice/cassandra-rabbitmq-guice/target/james-server-cassandra-rabbitmq-guice.jar dist/
cp -R server/container/guice/cassandra-rabbitmq-guice/target/james-server-cassandra-rabbitmq-guice.lib dist/
#cliとlibのコピー
cp -R server/container/cli/target/james-server-cli.lib dist/
cp server/container/cli/target/james-server-cli.jar dist/
#設定ファイルのコピー
cp -R dockerfiles/run/guice/cassandra-rabbitmq/destination/ dist/
3.テストプロセス
3.1 JMeterのセットアップ
ユーザーの実際のアクセシナリオをシミュレートするため、JMeterを使用して50と100の同時ユーザーに対してストレステストを実施しました。手順は以下の通りです:
3.1.1 JMeterの設定
3.1.1.1 メール読み取りサンプラーの作成
スレッドグループを右クリックしてメール読み取りサンプラーを追加します
3.1.1.2 メールサーバー情報の設定
追加後、対応する位置にメールサーバー情報を記入します。以下の図のように設定します。
注意:serverhost/port/username/passwordなどのパラメータはパラメータ化して、ランダムな値を実現できます。
3.1.1.3 ユーザー同時実行数の設定
右側のノードからスレッドグループを選択し、それぞれスレッド数(ユーザー数)/ラムアップ期間(秒)/ループ回数を設定します
これでJMeterのメール読み取り設定は完了です。
3.1.1.4 設定の保存
テストプランをstress.config.jmxとして保存し、後で使用します。
3.2 テストの実行
前のセクションでは、ストレステストの準備が完了しました。10秒以内に50のリクエストを送信する50同時ユーザーのシミュレーションです。ストレステストのループ回数は40回です。
ストレステストはGUIインターフェースから直接開始できます(ただし、強く推奨されません)。GUIを閉じてからコマンドラインからストレステストを開始するのがベストです。起動コマンドは以下の通りです:
jmeter -n -t stress.config.jmx -l testlog.csv
3.2.1 テストシナリオ
以下の2つのグループのテストを実施しました。
テストシナリオ1:James内のユーザーの受信トレイメッセージ数が0の場合
テストシナリオ2:James内のユーザーの受信トレイメール数が100件以上の場合
上記の2つのシナリオで、それぞれ3.2節のJMeterストレステストスクリプトを実行して、100同時ユーザーにおけるJamesの具体的なパフォーマンスを取得します。
3.2.2 ハードウェア構成1のテスト結果(自作仮想マシン、100同時)
3.2.2.1 受信トレイにメールがない場合
100同時ユーザー、INBOXアカウントに1通のメールのみ
Creating summariser <summary>
Created the tree successfully using stress.config.jmx
Starting standalone test @ Sat Oct 24 07:18:49 CST 2020 (1603495129341)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 237 in 00:00:10 = 22.8/s Avg: 1493 Min: 633 Max: 3688 Err: 14 (5.91%) Active: 100 Started: 100 Finished: 0
summary + 1060 in 00:00:30 = 35.3/s Avg: 2612 Min: 982 Max: 7083 Err: 108 (10.19%) Active: 100 Started: 100 Finished: 0
summary = 1297 in 00:00:40 = 32.1/s Avg: 2407 Min: 633 Max: 7083 Err: 122 (9.41%)
summary + 1065 in 00:00:30 = 35.5/s Avg: 2660 Min: 593 Max: 7941 Err: 109 (10.23%) Active: 100 Started: 100 Finished: 0
summary = 2362 in 00:01:10 = 33.6/s Avg: 2521 Min: 593 Max: 7941 Err: 231 (9.78%)
summary + 1016 in 00:00:30 = 33.8/s Avg: 2732 Min: 821 Max: 6236 Err: 102 (10.04%) Active: 97 Started: 100 Finished: 3
summary = 3378 in 00:01:40 = 33.6/s Avg: 2585 Min: 593 Max: 7941 Err: 333 (9.86%)
summary + 622 in 00:00:28 = 22.1/s Avg: 2038 Min: 615 Max: 6266 Err: 60 (9.65%) Active: 0 Started: 100 Finished: 100
summary = 4000 in 00:02:09 = 31.1/s Avg: 2500 Min: 593 Max: 7941 Err: 393 (9.83%)
Tidying up ... @ Sat Oct 24 07:20:58 CST 2020 (1603495258196)
3.2.2.2 受信トレイに100件以上のメッセージがある場合
100同時ユーザー、INBOXアカウントに100件以上のメール
Starting standalone test @ Sat Oct 24 07:32:37 CST 2020 (1603495957260)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 106 in 00:00:23 = 4.6/s Avg: 5620 Min: 978 Max: 18250 Err: 106 (100.00%) Active: 100 Started: 100 Finished: 0
summary + 168 in 00:00:30 = 5.7/s Avg: 15111 Min: 2776 Max: 43114 Err: 154 (91.67%) Active: 100 Started: 100 Finished: 0
summary = 274 in 00:00:53 = 5.2/s Avg: 11439 Min: 978 Max: 43114 Err: 260 (94.89%)
summary + 167 in 00:00:30 = 5.5/s Avg: 15324 Min: 2081 Max: 45651 Err: 151 (90.42%) Active: 100 Started: 100 Finished: 0
summary = 441 in 00:01:23 = 5.3/s Avg: 12910 Min: 978 Max: 45651 Err: 411 (93.20%)
summary + 170 in 00:00:30 = 5.7/s Avg: 15315 Min: 2314 Max: 48428 Err: 153 (90.00%) Active: 96 Started: 100 Finished: 4
summary = 611 in 00:01:52 = 5.4/s Avg: 13579 Min: 978 Max: 48428 Err: 564 (92.31%)
summary + 155 in 00:00:31 = 5.1/s Avg: 15431 Min: 1774 Max: 49392 Err: 138 (89.03%) Active: 74 Started: 100 Finished: 26
summary = 766 in 00:02:23 = 5.4/s Avg: 13954 Min: 978 Max: 49392 Err: 702 (91.64%)
summary + 116 in 00:00:30 = 3.9/s Avg: 20965 Min: 852 Max: 50959 Err: 80 (68.97%) Active: 50 Started: 100 Finished: 50
summary = 882 in 00:02:53 = 5.1/s Avg: 14876 Min: 852 Max: 50959 Err: 782 (88.66%)
summary + 103 in 00:00:31 = 3.3/s Avg: 12570 Min: 1422 Max: 41389 Err: 69 (66.99%) Active: 11 Started: 100 Finished: 89
summary = 985 in 00:03:24 = 4.8/s Avg: 14635 Min: 852 Max: 50959 Err: 851 (86.40%)
summary + 15 in 00:00:24 = 0.6/s Avg: 11074 Min: 4383 Max: 14081 Err: 1 (6.67%) Active: 0 Started: 100 Finished: 100
summary = 1000 in 00:03:47 = 4.4/s Avg: 14582 Min: 852 Max: 50959 Err: 852 (85.20%)
Tidying up ... @ Sat Oct 24 07:36:25 CST 2020 (1603496185045)
... end of run
3.2.2.3 ハードウェア構成1のテスト結果分析
結果からわかるように、1通のメールでも100件以上のメールでもエラーレートは非常に高く、特に100件以上の場合はエラーレートが80%以上に達しており、これは明らかに許容範囲外です。
3.2.3 ハードウェア構成2のテスト(Alibaba Cloud ECS)
Jamesの問題なのかハードウェアの問題なのかを確認するため、Alibaba Cloudで6台のECS仮想マシンを購入し、2コア/8GBで構成しました。
3.2.2.1 受信トレイにメールがない場合
100同時ユーザー、INBOXアカウントに1通のメールのみ
Creating summariser <summary>
Created the tree successfully using stress.config.jmx
Starting standalone test @ Sun Oct 25 08:02:38 CST 2020 (1603584158446)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 1559 in 00:00:21 = 73.4/s Avg: 936 Min: 254 Max: 2449 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary + 1441 in 00:00:31 = 47.1/s Avg: 857 Min: 254 Max: 16551 Err: 1 (0.07%) Active: 1 Started: 100 Finished: 99
summary = 3000 in 00:00:52 = 57.9/s Avg: 898 Min: 254 Max: 16551 Err: 1 (0.03%)
summary = 3000 in 00:00:52 = 57.9/s Avg: 898 Min: 254 Max: 16551 Err: 1 (0.03%)
Tidying up ... @ Sun Oct 25 08:03:30 CST 2020 (1603584210617)
3.2.2.2 受信トレイに100件以上のメッセージがある場合
Alibaba Cloud ECS 100同時ユーザー、INBOXアカウントに100件以上のメール
Creating summariser <summary>
Created the tree successfully using stress.config.jmx
Starting standalone test @ Sun Oct 25 08:07:09 CST 2020 (1603584429549)
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary + 133 in 00:00:20 = 6.6/s Avg: 8173 Min: 854 Max: 10947 Err: 3 (2.26%) Active: 100 Started: 100 Finished: 0
summary + 316 in 00:00:30 = 10.5/s Avg: 9124 Min: 6557 Max: 12229 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 449 in 00:00:50 = 8.9/s Avg: 8842 Min: 854 Max: 12229 Err: 3 (0.67%)
summary + 318 in 00:00:30 = 10.5/s Avg: 9141 Min: 6584 Max: 11725 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 767 in 00:01:20 = 9.5/s Avg: 8966 Min: 854 Max: 12229 Err: 3 (0.39%)
summary + 312 in 00:00:30 = 10.3/s Avg: 9608 Min: 6782 Max: 12848 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 1079 in 00:01:51 = 9.8/s Avg: 9152 Min: 854 Max: 12848 Err: 3 (0.28%)
summary + 312 in 00:00:30 = 10.5/s Avg: 9127 Min: 6832 Max: 11354 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 1391 in 00:02:20 = 9.9/s Avg: 9146 Min: 854 Max: 12848 Err: 3 (0.22%)
summary + 325 in 00:00:30 = 10.8/s Avg: 9084 Min: 855 Max: 11426 Err: 1 (0.31%) Active: 100 Started: 100 Finished: 0
summary = 1716 in 00:02:50 = 10.1/s Avg: 9134 Min: 854 Max: 12848 Err: 4 (0.23%)
summary + 303 in 00:00:30 = 10.1/s Avg: 9510 Min: 6677 Max: 12177 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 2019 in 00:03:20 = 10.1/s Avg: 9191 Min: 854 Max: 12848 Err: 4 (0.20%)
summary + 320 in 00:00:30 = 10.7/s Avg: 9434 Min: 6744 Max: 12099 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 2339 in 00:03:50 = 10.2/s Avg: 9224 Min: 854 Max: 12848 Err: 4 (0.17%)
summary + 316 in 00:00:30 = 10.5/s Avg: 9265 Min: 6451 Max: 12176 Err: 0 (0.00%) Active: 100 Started: 100 Finished: 0
summary = 2655 in 00:04:20 = 10.2/s Avg: 9229 Min: 854 Max: 12848 Err: 4 (0.15%)
summary + 341 in 00:00:30 = 11.2/s Avg: 8269 Min: 3418 Max: 11460 Err: 0 (0.00%) Active: 3 Started: 100 Finished: 97
summary = 2996 in 00:04:51 = 10.3/s Avg: 9120 Min: 854 Max: 12848 Err: 4 (0.13%)
summary + 4 in 00:00:06 = 0.7/s Avg: 2782 Min: 2732 Max: 2846 Err: 0 (0.00%) Active: 0 Started: 100 Finished: 100
summary = 3000 in 00:04:57 = 10.1/s Avg: 9111 Min: 854 Max: 12848 Err: 4 (0.13%)
Tidying up ... @ Sun Oct 25 08:12:06 CST 2020 (1603584726657)
3.2.2.3 ハードウェア構成2のテスト結果分析
ハードウェア構成2は構成1に比べてTPSとエラーレートが大幅に改善されています。これは、自作環境が適切に調整されていない可能性があることを示しています。ネットワークやディスクIOによって非常に高いエラーレートが発生し、TPSも非常に低く、平均応答時間は20秒以上です。次に、ハードウェア1をさらに設定して問題を確認します。
4 まとめ
Alibaba Cloudの低構成環境では、自作仮想マシンと比較して性能が大幅に向上しています。エラーレートは0.x%に低下し、TPSは10/sに達します。
平均応答時間は約10秒ですが、マシン構成をさらに改善すれば、テスト結果はさらに改善されると思います。より高い構成では6000+ req/sに達し、平均応答時間は100ms以内、エラーレートはさらに低くなるでしょう。
テストプロセス中にTellier(https://github.com/chibenwa)の助けに感謝します。