Apache JMeter で Web サーバのチューニング

最近、VPS が現実的な値段になってきまして root ありのサーバで LAMP 構築して WordPress なんてこともちょっとがんばればできるようになってきました。

そこで、はてさて安価な VPS どれくらいの性能が出るのかってことでまずはローカルの仮想環境で同じスペックのサーバをたてて試験して、、、みたいなんてときに使えるかなと思い、Web の負荷やシナリオ試験アプリケーション Apache JMeter の使い方とか書いてみたいと思います。

ここでかかれていることはローカル環境向けです。 他の方も使っているインターネットサーバに向けては決して負荷試験は行わないでください。

というわけで、とりあえず Apache JMeter。 pure Java のアプリです。 swing ベースなのでちょっと使いづらいですが、Java が動く環境なら動作すると思います。 ぼくは Linux と Windows で試しています。

JMeter – Wikipedia

Apache JMeter(アパッチ ジェイメーター)は、Jakarta Projectにおいて開発されたソフトウェアで、クライアント・サーバシステムのパフォーマンス測定および負荷テストを行うJavaアプリケーションである。

オープンソースかつ多数の機能を備えていることなどから、WebアプリケーションおよびWebサーバの性能測定に広く利用されている。

JMeter – Apache JMeter

Apache JMeter is open source software, a 100% pure Java desktop application designed to load test functional behavior and measure performance. It was originally designed for testing Web Applications but has since expanded to other test functions.

JMeter を起動したらシナリオを作成していきます。

ここでは、WordPress サイトに対して秒間 50 人くらいのアクセス集中を想定してみます。 とりあえず右ペインを以下のように。

jmeter01

名称はデフォルトのままにしていますので、「テスト計画」の右クリックからアイテムを探して追加していきます。 上からいきます。

CSV Data Set Config。

jmeter02

これは任意の csv ファイルから動的な項目を読み取る場合に使います。 子要素にループがあると上から値が読み込まれていきます。 なくなると上に戻るようです。 ここでは wp.csv としていますがこれは以下のようにアクセスするパスを指定しています。 path という名前をつけているのに注目しておきます。

wp.csv

gallery
about
archives/1134
archives/1124

次は、 HTTP ヘッダマネージャ。

jmeter03

ブラウザを疑似るために、それっぽいヘッダをつけておきます。 まぁ全部なくてもいいと思いますが、Web サーバがブラウザだと思ってくれるようにしておきます。

HTTP リクエスト初期値。

jmeter04

この後にでてくる HTTP リクエストの初期値を設定しておきます。 これを設定した後はリクエストの設定済みの欄を空で、この値が使われます。 ぼくらはローカルと結合環境、統合環境などと工程によって試験環境を分けることが多いのですが、そういうときに振り先をすぐ変更できるので便利です。

ここからが本題、スレッドグループ。

jmeter05

スレッドグループに所属する子要素が同時に実行されます。 スレッド数が同時に上がる数で Ramp-Up 期間がそれをどれくらいの時間で実現するかとなります。 この場合は、1秒に 50 アクセスを擬似的に再現です。 そしてループ回数で何回やるかを決定します。

ちなみに、これよりかなり複雑なシナリオで 200 スレッドあげたら、クライアントのほうがへばりました。 ほどほどに(笑)

スレッドグループの子要素1。 クッキーマネージャ。

jmeter06

これをいれておくと cookie を食べてくれます。 まぁここではなくても動くですが、帯域なども測定したいときは入れておいた方がいいかもしれません。 また、認証があるときはこれをいれておくだけで、cookie 食べて次の HTTP リクエストで発行してくれます。

スレッドグループの子要素2。 実際にブラウザの代わりにアクセスしてくれるのが、HTTP アクセスです。

jmeter07

パスのところに注目で ${path} が入っています。 これが上ででてきた csv 項目を差し込んでいるところです。

あと、スクリーンショットきれてしまったのですが下にある「すべてのイメージとアプレットを繰り返しダウンロードする」にチェックをいれると、通常のブラウザと同様にイメタグとかのアクセスもしてくれます。

結果を表で、ツリーで表示は、いれておくと実行後の結果を格納してくれます。

では、

[tegaki]とりゃ、実行![/tegaki]

ここでは、仮想環境使わずにローカル->ローカルで自爆するようにしています。 なので、実行中に GUI のシステムモニタをみてみます。

jmeter10

うひょ~。 4コアの CPU 使っていますがいっぱいまであがっています。 メモリは平気そうですね。 普通は vmstat 1 とかのコマンドでみるといいかもです。

ちなみに、サーバサイドが Java/Tomcat の場合は JMeter からマネージャアプリの manager/status/xml にアクセスすることで Java のヒープとかグラフ化できる機能があります。 (トム5 とドキュメントにありましたが 6 でもいけました)

スレッドがすべて完了したら結果系をみてみます。

jmeter09

ツリーの方で、取得した HTML などがみれます。 シナリオがうまく動いていないときはこれをみるといいかもです。

表で表示では、http ステータスやアクセス時間や転送量などがみれます。

jmeter08

オールグリーンであることを見ながら、あや、10秒かかっちゃった人いるね、、みたいな。 HTTP のステータスコードがエラー系だと赤になりますので確認します。 🙂

一度シナリオができれば、Apache や MySQL のチューニングをしてアクセススピードの平均値をみたりできると思います。 ローカル、ローカルでやる場合はクライアント側でも負荷がかかりますのでできれば別マシンでやるほうがいいでしょう、

さて、こんなのつくっていくとコメントポストしてみたいなぁとか、管理画面を複数人で使ったらなどなどでてくるかと思います。(ないか(笑))

ここでは GET ばかりでしたが、JMeter は POST したり GET でもらってきた HTML を後処理、正規表現で hidden 値を変数にもらって次のリクエストで POST したりもできます。

ちょっと正規表現かくの大変ですが、wp_nonce とかもらってみたいな感じですね。 また、結果の HTML が正しい出力かどうかなどのアサートもすることができます。

というわけで、ぼくも 512M の VPS ぽい仮想環境をローカルにつくってやってみましょうか。 ちなみに、250M 付近の VPS で Apache + PHP はきついですねぇ。 動きますがちょっと負荷かけるとメモリ不足で Apache が飛んだ経験があります。 メモリ重要。:)

コメントを残す