注目の記事

【初心者向け】ApacheBench入門

2015.03.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、虎塚です。

今週クラスメソッド社内で性能テストツールのApacheBench をテーマにした勉強会を行うことになりました(勉強会というと固い感じですが、経験者から知見をいろいろ教えてもらおうという雑談会です)。

そこで、ApacheBenchをまったく使ったことがない方の予習用に、ごく基本的な情報をまとめておきましたので、公開します。

ApacheBenchのインストール方法

Apache HTTP Serverをインストールします。

sudo yum install httpd

または、apr-utilパッケージをインストールすれば、httpdをインストールしなくてもApacheBenchを利用できます。

sudo yum install apr-util

ApacheBenchの特徴

ApacheBenchは、Apache HTTP Serverに同梱されている性能テストツールです。コマンド名にちなんで、「ab」とも呼ばれています。

できること

ApacheBenchは、1回のコマンド実行で、単一かつ同一のURLに対するリクエストを、指定した分だけ生成します。そのため、Webサーバやアプリケーションサーバの性能テストに便利です。動的に生成されるページでも、URLが固定であれば適用できます。

また、keepaliveを有効にした実行(-k)や、Cookieを渡すリクエスト(-C 'Cookie名1=値;Cookie名2=値')、プロキシサーバ越しの利用、Basic認証を行うリクエストなども可能です。

できないこと

ApacheBenchは、単一のURLへのリクエストを生成するツールなので、シナリオベースでWebアプリケーションをテストすることには向いていません。

本番のWebアプリケーションでは、ユーザシナリオが複数存在します。たとえば、チケットサイトなら、検索、予約、予約確認、キャンセルなどを複数のユーザが同時に行います。つまり、複数のURIへのアクセスが同時に発生するわけですが、ApacheBenchではそれをシミュレートできません。

また、静的なWebサイトに単にアクセスしてレスポンスタイムを見たい、シングルページで構成されるアプリケーションのテストをしたい場合は、ApacheBenchが「単一かつ同一のURL」へのリクエストを生成することに注意が必要があります。ページにCSSやJavaScriptや画像が埋め込まれている場合、それらを読み込む時間を含めたレスポンスタイムを計測することはできないため、意図したテストができないかもしれません。

複数のApacheBenchを起動して実行したり、複数のネットワーク経路から実行したりすることで、上記のできないことをある程度まで補うことができますが、他のツールを使ったほうがよいでしょう。

ApacheBenchの使い方

基本的な使い方

abコマンドの基本的な使い方を説明します。

  • nオプション: 生成するリクエスト数を指定します
  • cオプション: 並列実行する数(コネクション数)を指定します
  • たとえば、「10ユーザがそれぞれ10回リクエストした場合」をシミュレートしたいときは、次のようなコマンドを発行します。

    $ ab -n 100 -c 10 http://example.com/
    This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
    Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    Licensed to The Apache Software Foundation, http://www.apache.org/
    
    Benchmarking example.com (be patient).....done
    
    Server Software:        ECS
    Server Hostname:        example.com
    Server Port:            80
    
    Document Path:          /
    Document Length:        1270 bytes
    
    Concurrency Level:      10
    Time taken for tests:   2.291 seconds
    Complete requests:      100
    Failed requests:        0
    Write errors:           0
    Total transferred:      161000 bytes
    HTML transferred:       127000 bytes
    Requests per second:    43.64 [#/sec] (mean)
    Time per request:       229.138 [ms] (mean)
    Time per request:       22.914 [ms] (mean, across all concurrent requests)
    Transfer rate:          68.62 [Kbytes/sec] received
    
    Connection Times (ms)
                  min  mean[+/-sd] median   max
    Connect:       93  110  12.1    108     140
    Processing:    94  111  12.2    109     141
    Waiting:       94  111  12.2    109     141
    Total:        187  222  24.3    217     281
    
    Percentage of the requests served within a certain time (ms)
      50%    217
      66%    225
      75%    240
      80%    247
      90%    253
      95%    274
      98%    281
      99%    281
     100%    281 (longest request)

    上記は、実行結果の一例です。

    実行結果の見方

    特に重要な項目について説明します。どんなテストを実施した時でも、大抵確認する必要があります。

    Complete requests、Failed requests
    完了したリクエストと失敗したリクエストの数を表示します。失敗したリクエストについては、理由の内訳(Connect, Receive, Length, Exceptions)が表示されますので、確認します。
    失敗するリクエストが見られるときは、同時接続数の設定を見直します。また、動的に生成するページにアクセスしているときは、アプリケーションでページ生成系のエラーが出ていないか、ログを確認します。
    Requests per second
    1秒間に処理したリクエスト数の平均値(ミリ秒)です。
    性能テストを実施するときは、この値が目標値の範囲に収まっているかを確認します。
    Time per request
    1リクエストの処理に要した時間の平均値(ミリ秒)です。
    Connection Times
    リクエストに要した時間(ミリ秒)の内訳です。Connect, Processing, Waitingの最小値、最大値、平均値と標準偏差、中央値を示します。
    • Connect: 接続確立までにかかった時間です
    • Waiting: 接続確立からクライアントがレスポンスを受け取るまでにかかった時間です。
    • Processing: 対象サーバ側での処理時間です。アプリケーションで行う処理が複雑なときは、この値が大きくなる傾向があります

    実行結果の出力方法

    実行結果は、デフォルトで標準出力に表示されます。他に次のような出力方法があります。

    CSV出力

    eオプションでファイル名を指定して、CSV形式で出力します

    ab -n 100 -c 10 -e result.csv http://example.com/

    次のようなヘッダ付きのCSVが出力されます。テスト結果のデータをExcelなどに取り込んで、グラフを作成して分析する場合に便利です。

    $ cat result.csv
    Percentage served,Time in ms
    0,187.099
    1,187.168
    2,187.222
    3,187.322
    4,187.359
    [...]

    HTML出力

    wオプションをつけることで、HTMLを出力します。上記のeオプションと違い、ファイルにリダイレクトする必要があります。

    ab -n 100 -c 10 -w http://example.com/ > result.html

    wオプションを使ったデフォルトの状態では、次のようなHTMLが出力されます。(ここではChromeで表示しています)

    ApacheBenchのデフォルトのHTML出力

    また、wオプションとあわせて次のオプションも利用できます。

    • xオプション: tableタグに属性追加
    • yオプション: trタグに属性追加
    • zオプション: tdタグに属性追加

    x、y、zオプションを使うと、HTMLタグに属性を指定できます。stype属性でスタイルシートを使うことはできません。複数指定した場合は、最後の要素だけ適用されます。

    ab -n 100 -c 10 -w -x border=1 -y align=left -z bgcolor=#ccc http://example.com/ > result.html

    上記のコマンドでは、次のようなHTMLが出力されます。

    ApacheBenchのxyzオプションをつけたHTML出力

    tips

    使用する上での雑多な話を少しご紹介します。

    テスト対象と別のホストから負荷をかける

    abはApacheに同梱されてはいますが、性能テストを実行する際には、測定対象のサーバの外部にあるホストからリモートで実行します。ローカルから実行すると、ApacheBench自体の動作が、測定対象マシンのCPUやメモリの使用に影響するためです。

    また、テスト対象のシステムに応じて、インターネット環境やLAN環境などを経由したリクエストを生成することで、より本番に近い形態でのネットワーク接続をシミュレートすることができるでしょう。

    レスポンスの長さが同一でないとき

    ApacheBenchでは、レスポンスのlengthが異なるとリクエストが失敗したとみなされます。

    実行結果を確認したときにリクエスト失敗の理由が「Length」だけの場合は、この可能性があります。本当にリクエスト失敗だったかどうか、Webサーバのログでレスポンスのステータスコードを確認します。

    次のページの説明を読むと、現象についてわかりやすいかと思います。

    複数URLに対してテストを実行したいとき

    複数のURLに対して負荷を生成したい場合は、ApacheBench以外のツールを使用したほうがよいでしょう。または、次のような拡張の利用を試してみてもよいかもしれません。

    おわりに

    というわけで、Apache Benchの概要を簡単にご紹介しました。社内勉強会当日の様子は、また機会があればレポートします。

    それでは、また。