exment-load-tester
は、web-server-load-testerを利用して、Exment APIで Exment サーバーの負荷テストを行うツールです。
Exment APIのコール処理は、以下のドライバを利用しています。
負荷テストで計測する Exment のAPIは以下です。
また、負荷テストに必要なExmentのテストデータはバックアップファイルをリストアして作成します。
web-server-load-testerの機能を利用することで、テスト項目はCSVファイルで作成し、そのままテストを自動実行させます。
最大で200多重×50連続で256文字のカラムが18個あるテーブルにINSERTし続けるテストです。
https://github.com/tmori/exment-load-tester/blob/main/load-test/test-item/exment-create-item.csv
カスタムデータ新規作成
のテーブルデータに対して、最大で200多重×50連続でUPDATEし続けるテストです。
https://github.com/tmori/exment-load-tester/blob/main/load-test/test-item/exment-update-item.csv
カスタムデータ新規作成
のテーブルデータに対して、最大で200多重×50連続で View データ(1ページ分)を取得し続けるテストです。
https://github.com/tmori/exment-load-tester/blob/main/load-test/test-item/exment-view-item.csv
カスタムデータ新規作成
のテーブルデータに対して、、最大で200多重×50連続でフリーキーワード検索し続けるテストです。
https://github.com/tmori/exment-load-tester/blob/main/load-test/test-item/exment-query-item.csv
テスト結果はこちらに自動的に格納されます。
https://github.com/tmori/exment-load-tester/tree/main/load-test/test-result/exment
なお、格納されているデータは、以下の環境で測定したものです。
- CPU: 8コア
- メモリ:16GB
- ディスク:15GB
- Exment がインストールされていること
- Linux環境で docker-compose が利用できる環境であること(Windows WSLは対象外)
上記の環境構築前に、本負荷テスト実施時にいくつか各種設定調整が必要となりますので、以下の対応が必要となりますので、ご注意ください。
- Laravel のAPIリクエスト制限数の変更
- 参考:Laravel8で429エラーが出たときの対処法
- 本テストでは、
perHour(50000)
としました。 - Nginxのタイムアウト設定の変更
- 多重度を上げると応答が極端に遅くなり、Nginxがタイムアウトエラーを返す場合があります。
- 本テストでは、応答時間を確認したいため、タイムアウトにならないように設定変更する必要があります。
- 本テストでの変更内容は以下としました。環境に応じて適宜パラメータを調整してください。
- 修正対象ファイル: /etc/nginx/conf.d/exment.conf
- パラメータ: fastcgi_read_timeout 600 *
- MySQL の UNOD ログレコードサイズがページサイズを超える場合の対応
- 参考:§ InnoDB ストレージエンジン : InnoDB テーブルへの UPDATE ステートメントがハングする可能性があった。
- 本テストでは、MySQLのページサイズを 32KB としました。
- ページサイズのパラメータ:innodb_page_size=32K
- 注意:ページサイズの変更は、MySQLインストール(mysql_secure_installation)後に行うと、MySQLが起動しなくなります。
- 注意:インストールしてしまった場合は、以下の手順で対応できます。
-
- 必要なデータをバックアップ
-
- mysql を初期化する。
-
- Mysqlを再インストール(mysql_secure_installation)する。
-
- バックアップデータをリストアする
-
docker-compose.yml の EXMENT_URL を適切なものに変更してください。
docker-compose build
docker-compose up -d
docker-compose exec exment_php /bin/bash
bash install.bash
テスト自動化していますので、以下の対応が必要となります。
- パスワードなしで ssh で Exmentサーバーマシンにログインできること。
- 以下の記事が参考になります。
- https://blog.apar.jp/linux/5336/
- www-data ユーザにパスワードなしで su できること(手順は後述)
- Exment の API 設定を有効化する
- 本テストでは、API Key(APIキー形式)を使用します。
sudo vi /etc/pam.d/su
# This allows root to su without passwords (normal operation)
#auth sufficient pam_rootok.so
auth [success=ignore default=1] pam_succeed_if.so user = mattermost
auth sufficient pam_succeed_if.so use_uid user ingroup mattermost
+ auth [success=ignore default=1] pam_succeed_if.so user = www-data
+ auth sufficient pam_succeed_if.so use_uid user ingroup www-data
www-data の /usr/sbin/nologin
を /bin/bash
に変更する
例:
www-data:x:33:33:www-data:/var/www:/bin/bash
sudo passwd www-data
本ツールを実行するには以下の環境変数設定ファイル(env.bash)を編集する必要があります。
- ./web-server-load-tester/env/env.bash
ただし、上記の環境変数は一般向けのパラメータセットとなっているため、Exment負荷テスト用の環境変数を追加する必要があります。 ベースとなる設定ファイルは、env_loadtest.bashがあるので、その内容を上書きすることで必要な環境変数を追加することができます。
各環境変数設定内容として変更ポイントは以下の通りです。 ここで記載されていないものは、web-server-load-tester のREADMEを参照ください。
- EXMENT_CLIENT_ID
- Exment の API 設定で作成されたクライアントIDを設定します。
- EXMENT_CLIENT_SECRET
- Exment の API 設定で作成されたクライアントシークレットを設定します。
- EXMENT_APK_KEY
- Exment の API 設定で作成されたAPIキーを設定します。
- TEST_TARGET_TOOL_DIR
- Exment サーバー側の web-server-load-tester のディレクトリパスです。
- EXMENT_TOOL_DIR
- Exment サーバー側の 本ツールリポジトリのトップディレクトリパスです。
docker コンテナに入り、以下のディレクトリに移動します。
★注意:ssh の設定は、コンテナからログアウトすると消えてしまいますので、毎回、実施しないといけないです。。
cd /root/workspace/web-server-load-tester
bash test-runtime/test-controller.bash ../load-test/test-item/exment-create-item.csv
bash test-runtime/test-controller.bash ../load-test/test-item/exment-update-item.csv
bash test-runtime/test-controller.bash ../load-test/test-item/exment-view-item.csv
bash test-runtime/test-controller.bash ../load-test/test-item/exment-query-item.csv
docker-compose down