ここらへんでちょっと触れてますが、最近仕事で負荷試験を担当することになったので
EC2とJmeterで負荷試験環境を構築してみました。
元々はオンプレで建てようかと思ったのですが、限られた時間で、しかも負荷試験自体は2日ぐらいしか実施しないため、
オンプレで構築するコストを考えるとAWSを利用して環境構築したほうが効率的だな、と思ったので。
色々と躓いたところ含め、備忘録的にメモしておきます。
目的
仕事で新しいサービスを公開することになったのですが、どの程度のアクセスまで耐えられるのか、
目標の同時アクセス数を捌くためにはどれだけのキャパシティが必要なのかを試験する必要が出てきました。
負荷試験の方法は色々あるのですが、
- コストが比較的安い
- 簡単に構築できる
- (できれば)他の案件などに使いまわしたい
等を考慮し、AWSとJmeterを利用して構築することにしました。
構成
- Jmeter-Client 1台
- Jmeter-Server 10台
こんな感じです。
Jmeter-Clientはグローバル経由で自分のPCを利用しても良かったのですが、
勉強ついでに全てAWS環境で構築することにしました。
以前書いた記事では、Jmeter-ClientはWindowsを利用してGUIから操作する感じにしていましたが、今回はその部分もCLIで操作する感じです。
構築
Jmeter-Clientの構築
まずは管理する側のサーバであるJmeter-ClientサーバをEC2を利用して構築していきます。
AWSコンソールにログインして、EC2メニューを開きます。
んで、インスタンスを作成するために左カラムの「インスタンス」を選択。
「インスタンスを起動」をクリックします。
すると、EC2作成UIに遷移するので、まずはOSの選択。
今回は一番上のAmazon Linuxを選択。
jmeterはJavaアプリケーション=メモリをたくさん使う(印象)なのでサイズはt2.largeを選択。
あとは適当に必要な情報を入力して作成します。
作成完了して起動すると、インスタンスのステータスUIにパブリックIPが記載されていると思うので、
それに対してSSHログイン。
基本的には鍵認証のみなので、インスタンス作成時に作成した鍵を使ってログインします。
ログインできたらJmeter-Clientサーバとして動作させるための設定をしていきます。
Jmeterのインストール
Jmeter-Clientを動作させるためにはjavaとJmeterが必要です。
ので、それらをインストールしていきます。
# yum install java-1.8.0-openjdk # wget https://ftp.riken.jp/net/apache//jmeter/binaries/apache-jmeter-5.3.tgz # tar -zxvf apache-jmeter-5.3.tgz
最低限ですがこれでjmeterが動作するようになります。
jmeterクライアントの設定
前回記事で書いているので省略。
以下の記事を参考にしてください。
java heapメモリの設定
デフォルトでは1Gなので、ちょっと多めに変更しておきます。
あまりheap領域が少ないとheap memory errorの原因になります。(発生済み)
# vi ./apache-jmeter-5.3/bin/jmeter ~(略)~ #: "${HEAP:="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m"}" #コメントアウトする : "${HEAP:="-Xms4g -Xmx4g -XX:MaxMetaspaceSize=1g"}" #追記 ~(略)~
ここまでできたらサーバをシャットダウンしておきます。
Jmeter-Serverの構築
ここからはJmeterServerの構築になりますが、今回構築するサーバ台数予定は10台。
さすがに1台1台作っていくと時間が膨大にかかってしまうので、先ほど構築したJmeter-Clientサーバをテンプレート化して一気に複数台作成していきます。
というわけでまずはテンプレートの作成。
先程作成したJmeter-Clientサーバにチェックを入れて
[アクション]→[Image and templates]→[インスタンスからテンプレートを作成]
をクリックします。
テンプレート作成ページに移動するので、テンプレート名など必要な情報を入力。
キーはJmeter-Clientサーバを作成したときのものを使用するようにすると楽。
NW設定もJmeter-Clientサーバを作成したときのものと同じに。
作成が完了すると、起動テンプレート一覧に先程作成したテンプレートが表示されるはずです。
テンプレート作成が完了したら、そのテンプレートを利用してJmeterServerを作成していきます。
[インスタンスを起動]→[テンプレートからインスタンスを起動]をクリック。
先程作成したテンプレートを選択して、インスタンス数を「10」に変更。
すると、同じテンプレートを使って10個一気にインスタンスを作成することができます。
これでJmeterServerの構築は完了です。
サーバを用意できたので、最後、Jmeter-Clientサーバの設定を変更していきます。
Jmeter-Clientサーバのコンフィグ設定
まずは先程構築したjmeterServerを全て起動して、それぞれのIPアドレス(ローカル)をメモります。
それらをJmeter-Clientサーバから操作できるようにjmeter.propertiesの設定を変更します。
# vi ./apache-jmeter-5.3/bin/jmeter.properties ~略~ #Remote Hosts - comma delimited #remote_hosts=127.0.0.1 remote_hosts=[サーバのIPアドレス(1)]:1099,[サーバのIPアドレス(2)]:1099,[サーバのIPアドレス(3)]:1099・・・・ #<- 追記
10台分記載しておきます。
これで一応すべての準備工程は終了です。
メモリヒープなどが発生したり、逆にヒープ領域を確保しすぎて動作が不安定になっていたりしたらそのあたりはチューニングしましょう。
試験実施
Jmeterで試験をするためにはjmxという試験パターン構成ファイルが必要です。
それの作成方法は特には解説しませんが、一番手っ取り早いのはharファイルからコンバートさせる方法でしょうか。
以下のサイトが非常に便利です。(が、データ抜かれてるかもしれないので、個人情報のPOSTとかが含まれているharは食わせないほうが良いかもです。)
Jmeter-Serverの起動
10台のJmeter-Serverにログインして、Jmeter-Serverプロセスを起動します。
# apache-jmeter-5.3/bin/jmeter-server
自身のIPアドレスと1099ポートで待ち受けているような感じになればOKです。
リモート実行
上記で準備したjmxファイルを用意したら、そのファイルをJmeter-Clientサーバにコピーします。(scpとかなんでも)
んで、jmeterをCLIで実行します。
./jmeter -n -t ./jmx/test.jmx -l ./jtl/test.jtl -j ./log/test.log -r
- -t : 使用するjmxファイルのパス
- -l:jtlファイル出力先
- -j:ログファイル出力先
- -r:リモートで実行
-rを付けることで、jmeter.propertiesのremote_hostsに記載した全てのサーバで試験を実施します。
もし数台のみで試験したい場合は-Rオプションで直接リモートサーバを指定できます。
まとめ
- EC2とJmeterを利用した負荷試験環境を構築
- ある程度シンプルな負荷試験は十分可能
- 必要分だけ用意すればいいのでコスト安
AWSって便利だなあ、と思いました。
オンプレ至上主義だったけど、そのあたり見直さないと。
ただ、個人利用するにはちょっと高いんだよなあ・・・
それこそラズパイ買ったほうが安上がり・・・
コメント