最近、JMeterというソフトウェアを使って負荷テストをしたのですが、機能の豊富さにびっくり。proxyを使ってブラウザでアクセスしたパターンを解析して、テストパターンを作ってくれます。その際に、裏で渡しているPOSTのデータとかも全部テストパターンの中に盛り込んでくれるので便利。
また、ログインが必要なWEBアプリなんかも、ログインのテストパターンを一度作って、パラメータが例えばuseridだとしたら、そのuseridに入れる値を動的に変えてテストできます(useridに入れる値のリストを作れば)
そんな訳で、色々と性能テストでJMeterの使い方を学んだので、ここで書いていこうかと思うんだけど、とりあえず今日はそこまで気力がないので、明日以降で。
今日は、負荷テストの計画について。
前職でもテストフェーズで片手間に負荷テストしたりしてた経験と、最近のテストの経験を踏まえて、こんな感じでどうよってことで書きます。ほかの会社ではどうしてるか知らないし、何かこれが王道の負荷テストだって資料も見当たらないので、この記事を読んだ負荷テスト経験者、識者の方の経験などをコメントで頂けると助かります。
■基本編
- 同時アクセス数を、1,5,15と増やして行き、全てのリクエストが終了する時間を計測
- 同時アクセス数が増えても、かかる時間が大幅に増えないかチェック
秒間最大処理数を求める場合、全てのリクエストを処理する時間が1秒を超えた時点の同時アクセス数がそれにあたります。
■応用編1
1リクエストあたり、1秒以上の処理時間のアプリの場合はどうなるんでしょうか。それが応用編1です。
これにより、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