WEBアプリの負荷テストって

最近、JMeterというソフトウェアを使って負荷テストをしたのですが、機能の豊富さにびっくり。proxyを使ってブラウザでアクセスしたパターンを解析して、テストパターンを作ってくれます。その際に、裏で渡しているPOSTのデータとかも全部テストパターンの中に盛り込んでくれるので便利。
また、ログインが必要なWEBアプリなんかも、ログインのテストパターンを一度作って、パラメータが例えばuseridだとしたら、そのuseridに入れる値を動的に変えてテストできます(useridに入れる値のリストを作れば)

そんな訳で、色々と性能テストでJMeterの使い方を学んだので、ここで書いていこうかと思うんだけど、とりあえず今日はそこまで気力がないので、明日以降で。


今日は、負荷テストの計画について。
前職でもテストフェーズで片手間に負荷テストしたりしてた経験と、最近のテストの経験を踏まえて、こんな感じでどうよってことで書きます。ほかの会社ではどうしてるか知らないし、何かこれが王道の負荷テストだって資料も見当たらないので、この記事を読んだ負荷テスト経験者、識者の方の経験などをコメントで頂けると助かります。

■基本編

  • 同時アクセス数を、1,5,15と増やして行き、全てのリクエストが終了する時間を計測
    • 同時アクセス数が増えても、かかる時間が大幅に増えないかチェック

秒間最大処理数を求める場合、全てのリクエストを処理する時間が1秒を超えた時点の同時アクセス数がそれにあたります。


■応用編1
1リクエストあたり、1秒以上の処理時間のアプリの場合はどうなるんでしょうか。それが応用編1です。

  • 1リクエストあたり、3秒かかるアプリの場合、15リクエスト/秒の性能を満たすかテストする例。
    • 1秒ごとに15リクエスト発生させ、それを6秒以上実行し、3秒目に実行した15リクエストが全て3秒程度で終了するかチェック(もしくは、許容範囲が5秒であれば、3秒目以降に実行した全てのリクエストが5秒以内に収まっているとかでも良い。リクエストピーク時にレスポンスタイムがどんどん劣化しないことを確認する)

これにより、15アクセス/秒のリクエストがきても、レスポンスタイム(ここでは3秒)の劣化が無いと言える。


ただし、1リクエストあたり、どうしても7秒以上かかる処理の場合は、ユーザの待ち時間を考えると回避策を考えたほうが良いです。例えば、登録処理であれば、登録はバックグラウンドでやって、レスポンスだけをすぐにユーザに返すとか、検索結果をキャッシュしておくとか。


■応用編2
複数画面の遷移をするアプリの場合どうするか?

  • 例えば15リクエスト/秒をシステム全体で満たせるかテストする場合。

まずシナリオを作ります。例えばログインして、検索して、検索結果から登録処理をして・・・という感じ。一番利用される画面や、負荷がかかる画面をピックアップしてシナリオに盛り込みます。

そして、各画面のレスポンス限度の時間を決めます。例えば検索1秒、登録2秒など。そして、各画面を遷移する際に、ユーザが手を動かしてかかる想定時間(例えばログインIDの入力時間5秒や、検索結果のチェック10秒など)を盛り込みます。

例えば、下記のようなシナリオの場合

ログイン画面表示(1秒)→ログインID,PW入力(8秒)→検索画面表示(1秒)→検索項目入力(5秒)→検索結果表示(2秒)→検索結果確認(10秒)→ログアウト(1秒)

1ユーザあたり、28秒かかる想定です。

画面へのアクセスをJMeterなどの負荷ツールで作り、その間のユーザ操作時間は、何もしない待ち状態を設定し、1ユーザあたり28秒かかるようにシナリオを作ります。

そのシナリオを、1秒ごとに15回発生させます。これを56秒間以上実行し、28秒目に実行したシナリオが28秒程度で実行が完了しているか確認します。



■チェック事項
テスト中にチェックしておくべき箇所をとりあえず簡単に。

  • サーバのCPU負荷(TOPコマンド、sarコマンドを使って)
  • メモリがスワップしてないか(vmstatコマンド)
    • vmsatat 1 20とすれば、1秒間隔で20回結果を出力してくれます。
    • vmstatでsi , soの値が0以外の場合はメモリが足りてないので要注意
  • ディスクのIO負荷(sarコマンドを使って)
    • IO負荷:sarコマンドのIOwaitを確認


sarコマンドは、CentOSであれば、yum install sysstatで入ります。
例えば
sudo sar -qu 1 10とすれば

01:45:38 AM       CPU     %user     %nice   %system   %iowait     %idle
01:45:39 AM       all      0.00      0.00      0.00      0.00    100.00

01:45:38 AM   runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15
01:45:39 AM         0        82      0.07      0.02      0.00

というように、1秒間ごとに10回、CPU負荷とロードアベレージを出力してくれます。これをリダイレクトでファイルに落とせば後で解析できます。

参考(Vmsata,sar)
http://www.thinkit.co.jp/cert/tech/23/4/2.htm
http://www.thinkit.co.jp/cert/tech/23/4/3.htm