ab を用いた簡易的な性能・負荷テストの雛形

Web サービスをリリースするにあたり避けては通れない(避けて通ってはいけない)性能・負荷テスト工程。
ウォーターフォールやアジャイルなど開発手法は様々ありますが、現実問題、概ね開発工程が遅延する傾向があります。なんとか単体テスト・結合テスト・システムテストはやりきるものの、力尽きて性能・負荷テストを実施せずにリリース・・・なんてことはありませんでしょうか?

そんな場合に限って、リリース直後に高負荷でサービスダウン・・・なんてことになりがちです。

そうならないために性能・負荷テストは必ず実施すべき項目です。ツールとして JMeter がメジャーですがシナリオ作ったり、使い方覚えたりと、正直面倒です。でも apache bench なら使ったことあるし知ってる!という方も多いことでしょう。そこで僕が "簡易的" に性能・負荷テストで使っている方法を公開します。

- スポンサーリンク -

ab を用いた簡易的な性能・負荷テストの手順

基本的には負荷をかけるツールとしては apache bench を用います。httperf など別のツールを使いたい場合は適宜読み替えてください。負荷をかけている最中は、リソース把握用 perl スクリプトと vmstat をシェル上で実行しておきます。最後に得られた結果をグラフ化します。
まずは下記ファイルをダウンロードし、watch_resources.pl をサーバ上に設置します。

リソース把握スクリプト: watch_resources.pl
グラフ雛形 excel ファイル: bench_hinagata.xls


手順 1. シェル上で watch_resources.pl と vmstat を実行します。
ターミナルを 2 つ開き、片側から watch_resources.pl を実行します。高負荷時には perl スクリプトが待ち状態でリソース情報が取得できなくなるため、nice コマンドで優先順位を上げてやります。vmstat はもう片側のターミナルから実行します。
※vmstat は差分で計算しているためスクリプトに統合するのが面倒なので手抜きしました。

nice --19 perl watch_resources.pl
vmstat 1


手順 2. apache bench で負荷をかけます。
下記のテストではローカルの apache に対して負荷をかけていますが、可能であれば他サーバからリクエストをするようにします。url は要件に合わせて設定を変更してください。
またリクエスト数は 10000、同時接続数は 10 で性能を測定しますが、同時接続数はシステム要件に合わせて設定します。本件では同時接続 10 のシステム要件と見てください。

ab -n 10000 -c 10 'http://localhost/test.cgi'


手順 3. apache bench の結果を見てみます。注目すべき項目は下記の通りです。
Failed requests: 0 以上の数値の場合、性能が追いついておらずリクエストが異常終了している。
Non-2xx responses: 本項目が表示される場合は、200 番以外の HTTP status のレスポンスが存在する。
Requests per second: 秒間に処理できるリクエスト数。システム要件と合わせて評価する。

$ab -n 10000 -c 10 'http://localhost/test.cgi'
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests

Server Software:        Apache
Server Hostname:        localhost
Server Port:            80

Document Path:          /test.cgi
Document Length:        795 bytes

Concurrency Level:      10
Time taken for tests:   260.926234 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      9142655 bytes
HTML transferred:       7950000 bytes
Requests per second:    38.33 [#/sec] (mean)
Time per request:       260.926 [ms] (mean)
Time per request:       26.093 [ms] (mean, across all concurrent requests)
Transfer rate:          34.22 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.5      0      74
Processing:    29  260 625.2    111   14568
Waiting:       25  252 617.9    103   14491
Total:         29  260 625.3    111   14568

Percentage of the requests served within a certain time (ms)
  50%    111
  66%    181
  75%    245
  80%    292
  90%    445
  95%    662
  98%   2166
  99%   3122
 100%  14568 (longest request)


手順 4. watch_resources.pl と vmstat の結果を excel に貼り付け
watch_resources.pl と vmstat の実行は CTRL+C で停止します。ターミナルに表示されている実行結果をメモ帳なりにコピペしておいてください。

watch_resources.pl

localtime,ESTABLISHED,LISTEN,TIME_WAIT,httpd,cgi,Threads_connected,Threads_running,lvg_1min,lvg_5min,lvg_10min,running/total,lastpid,r,b,swpd,free,buff,cache,si,so,bi,bo,in,cs,us,sy,id,wa,st
" Fri Dec 30 10:21:01 2011",5,9,1318,17,0,0,0,6.41,4.04,1.98,1/84,20186
" Fri Dec 30 10:21:02 2011",21,9,1003,18,7,0,0,6.41,4.04,1.98,14/94,20201
" Fri Dec 30 10:21:03 2011",25,9,1044,17,10,0,0,6.41,4.04,1.98,13/95,20244

vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0  15532  46060 158952 199812    2   12     5    24    5   13  5  0 94  0  0
 0  0  15532  46060 158952 199812    0    0     0     0 1007   17  0  0 100  0  0
 0  0  15532  46060 158952 199812    0    0     0     0  993   13  0  0 100  0  0

bench_hinagata.xls を開きます。マクロが定義してあるため、Excel のセキュリティ設定は「低」に設定し、セキュリティ警告でマクロを有効にしてください。

img001.jpg

watch_resources.pl の結果を DATA シートの B 列に貼り付けます。

img002.jpg

結果が B 列に文字列として入るので、メニューの「データ」>「区切り位置」からカンマ区切りで B 列を分割します。サンプルデータが入っているので上書き可否を聞いてきますが OK してください。

img003.jpg

次に vmstat 1 の結果を貼り付けます。まず下記の行を全て削除してから DATA シートの O 列 2 行目から貼り付けます。

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

img006.jpg

結果が O 列に文字列として入るので、メニューの「データ」>「区切り位置」から固定長フィールド区切りで O 列を分割します。サンプルデータが入っているので上書き可否を聞いてきますが OK してください。

img005.jpg

グラフ生成ボタンを押下することで、GRAPH シートに必要リソースをグラフ化します。それぞれの数値の意味についての詳細は割愛させていただきますが、ここまで読んでいただいている読者の方なら、意味は通じていることでしょう。w

img004.jpg


手順 5. 生成されたグラフを見て OS リソースを評価します
合計 7 種類のグラフが生成されます。概ね性能評価を行う際に見るリソース状況かと思います。

netstat の ESTABLISHED,LISTEN,TIME_WAIT のグラフからコネクション状況を把握します。
image002.gif

httpd, cgi のグラフから httpd と cgi のプロセス数状況を把握します。
image003.gif

loadavg のグラフから負荷状況の大まかな状況を把握します。
image004.gif

prosecc のグラフから実行中、待ち状態のプロセス数の状況を把握します。
image005.gif

memory のグラフからメモリ不足、スワップの状況などを把握します。
image006.gif

io のグラフからスワップの状況、read/write の IO 状況を把握します。
image007.gif

cpu のグラフから cpu 利用状況について把握します。
image008.gif

これらグラフと ab の結果を把握することで、概ね性能を把握することができます。さらに限界値を把握するための負荷試験として、ab の同時接続数を 10, 20, 30, ..., 100 とあげていき、同じようなテストを回すことで、Failed requests が発生する同時接続数でのリソース状況を把握すれば、概ねシステムの限界値を知ることをできます。

- スポンサーリンク -