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 のセキュリティ設定は「低」に設定し、セキュリティ警告でマクロを有効にしてください。
watch_resources.pl の結果を DATA シートの B 列に貼り付けます。
結果が B 列に文字列として入るので、メニューの「データ」>「区切り位置」からカンマ区切りで B 列を分割します。サンプルデータが入っているので上書き可否を聞いてきますが OK してください。
次に 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
結果が O 列に文字列として入るので、メニューの「データ」>「区切り位置」から固定長フィールド区切りで O 列を分割します。サンプルデータが入っているので上書き可否を聞いてきますが OK してください。
グラフ生成ボタンを押下することで、GRAPH シートに必要リソースをグラフ化します。それぞれの数値の意味についての詳細は割愛させていただきますが、ここまで読んでいただいている読者の方なら、意味は通じていることでしょう。w
手順 5. 生成されたグラフを見て OS リソースを評価します
合計 7 種類のグラフが生成されます。概ね性能評価を行う際に見るリソース状況かと思います。
netstat の ESTABLISHED,LISTEN,TIME_WAIT のグラフからコネクション状況を把握します。
httpd, cgi のグラフから httpd と cgi のプロセス数状況を把握します。
loadavg のグラフから負荷状況の大まかな状況を把握します。
prosecc のグラフから実行中、待ち状態のプロセス数の状況を把握します。
memory のグラフからメモリ不足、スワップの状況などを把握します。
io のグラフからスワップの状況、read/write の IO 状況を把握します。
これらグラフと ab の結果を把握することで、概ね性能を把握することができます。さらに限界値を把握するための負荷試験として、ab の同時接続数を 10, 20, 30, ..., 100 とあげていき、同じようなテストを回すことで、Failed requests が発生する同時接続数でのリソース状況を把握すれば、概ねシステムの限界値を知ることをできます。
コメントやシェアをお願いします!
ore
投稿がありがとうございます。参考にさせていただきました。
細かい点ですが「ab を用いた簡易的な性能・負荷テストの手順」の手順 3のFailed requestsの記述ですが「0 以上の数値の場合」では結果に0が表示された場合もリクエストが異常終了していることになってしまうのではないでしょうか。