技林TOP > 自宅サーバ構築メモ > Apacheのチューニング


≫はじめに

WebサーバソフトApacheは、もともと高性能です。
低スペックのCPUや少メモリ環境でも充分に活躍します。

しかし、ある程度のレスポンスを要求される場合はApacheをチューニングする必要があります。

チューニングの効果はハードを交換するほどの劇的なものではないものの、Apacheの動作環境を最適化するという意味において、同一PC上で動いている他のサーバにとっても親切な作業となります。

というわけで、ここでは Apacheのチューニング方法について解説してみたいと思います。

≫ベンチマーク

Apacheのチューニングを始める前に、その効果を検証するための方法を紹介します。

性能を測るためにはベンチマークテストを行います。
Apacheのベンチマークを取るためのツールは標準で ab というものが用意されています。

構文は
$ ab -OPTION URL


URLに対して、オプションで指定したアクセスを発生させ、その結果を表示します。

例えば、
$ ab -n 100 -c 10 http://192.168.1.2/index.html


同時に10リクエストが発生して100のリクエストを処理するテストを行います。

オプションは以下の様になっています。

■abオプション一覧
オプション意味
-n 数値発行するリクエストの回数
-c 数値同時に発行するリクエストの数
-t 数値サーバからのレスポンスの待ち時間(秒)
-p ファイル名サーバへ送信するファイル
-T コンテンツタイプサーバへ送信するコンテンツヘッダ
-v 数値指定した数値に応じた動作情報を表示
-w結果をHTMLで出力
-x 属性HTML出力のtableタグに属性を追加
-y 属性HTML出力のtrタグに属性を追加
-z 属性HTML出力のtdまたはthタグに属性を追加
-C 'CookieName=Value'Cookie値を渡す
-A ユーザー名:パスワードBasic認証が必要なコンテンツ用
-P ユーザー名:パスワード認証の必要なプロキシ用
-Vabのバージョン表示
-kHTTP/1.1のKeepAlive有効
-hヘルプ表示


ab で実際にテストする際に発生させるリクエスト数は、テストするサーバが処理する同時接続数の最大値の2割増し、と最少接続数の2つを目安にすると良いでしょう。

同時接続数の目安はアクセスログ解析ソフトやMRTGで調べましょう。

ハード的に高機能なサーバであれば、一定以上の負荷を設定しないとチューニングの意味がないかもしれません(ある程度のアクセスがない限りチューニングは必要無い)。

さて、実行すると、以下のように結果がでます。

$ ab -n 1000 -c 25 http://192.168.0.2/index.html
This is ApacheBench, Version 1.3d <$Revision: 1.67 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.0.2 (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software:        Apache
Server Hostname:        192.168.0.2
Server Port:            80

Document Path:          /index.html
Document Length:        1496 bytes

Concurrency Level:      25
Time taken for tests:   1.987 seconds
Complete requests:      1000
Failed requests:        0
Broken pipe errors:     0
Total transferred:      1643000 bytes
HTML transferred:       1496000 bytes
Requests per second:    503.27 [#/sec] (mean)
Time per request:       49.67 [ms] (mean)
Time per request:       1.99 [ms] (mean, across all concurrent requests)
Transfer rate:          826.87 [Kbytes/sec] received

Connnection Times (ms)
              min  mean[+/-sd] median   max
Connect:        9    23    5.6     23    45
Processing:    16    25    5.6     25    47
Waiting:       14    24    5.6     23    45
Total:         44    49    1.9     48    62

Percentage of the requests served within a certain time (ms)
  50%     48
  66%     48
  75%     49
  80%     49
  90%     49
  95%     49
  98%     61
  99%     61
 100%     62 (last request)


結果の中で注目すべきは
  • Completed requests
    冒頭のリクエストの成否を示す部分。ここでFailed requestsが発生するようであればサーバ処理の限界を超えていると見るべき。


  • Requests per second
    1秒間に処理されたリクエスト数。数字が大きいほど性能が良い。


  • Connect/Processing/Waiting
    測定したリクエスト全体でのばらつきやリクエスト当たりの処理の内訳を示す。
リクエストを試すURLは、サイト内で平均的なサイズの静的ファイルと、動的ページの2種類を試すべきでしょう。

≫チューニングのポイント I

Apacheの設定ファイルである、httpd.conf の設定を変更することでレスポンスの向上を目指します。
まずは、リクエストの数など関係なく単純に処理を減らすという意味でレスポンスを向上させるもの。
  • HostNameLookups off
    ログを記録する際などIPアドレスをホスト名に変換するかどうかの設定。これは1ページごとではなく、1リクエストごとの処理になるので、off にすることでかなりのレスポンス向上が望めます。当然、ログに残るホスト名は全てIPアドレスになります。アクセス解析ソフトでもホスト名は取得できずIPアドレスのみとなります。


  • 余計なモジュールを無くす/ロードしない
    Apacheはモジュールというもので特別な機能を盛り込めるようになっています。
    パッケージもののLinuxでインストールして、Apacheが最初から入っている場合は、必要のないモジュールまでインストールされていることがあります。
    そういった場合はコンパイルをしなおして、必要のないモジュールは無くしてしまいましょう。
    また、DSOという機能で、後からモジュールをロードするApacheの場合は、必要のないものをロードしないように httpd.confで設定します。


  • .htaccessは使わない
    ディレクトリごとに.htaccessで設定しているとパフォーマンスが落ちます。便利ですが、なるべくhttpd.confで設定した方が効率は上がります。


  • SSIは.shtmlで
    .htmlでSSIを使用できる設定は便利ですが、ページにSSIコマンドが含まれていなくてもSSIの処理を通ってしまうのでパフォーマンスが落ちます。SSIを使用するのは.shtmlに限定すれば、大半の.htmlファイルの効率はそのままになります。


  • DirectoryIndex
    アクセスURLの最後がスラッシュ(/)で終わる場合、つまり、ディレクトリへのアクセスの場合に、ディレクトリのどのファイルを表示するかという設定を行うのが DirectoryIndex です。
    デフォルトでは、
    DirectoryIndex index.*
    という風にワイルドカードで汎用性高く指定されていますが、
    できれば
    DirectoryIndex index.html
    という風に、一撃で指定してあげた方が効率が上がります。


チューニングの基本的な考え方は、処理が増えればパフォーマンスは落ちるということ。
必要のない機能はどんどん落とすに限ります。

≫チューニングのポイント II

次に、httpd.conf で Apacheのプロセスを制御する個所をチューニング。
StartServers 10
MinSpareServers 5
MaxSpareServers 20
MaxRequestsPerChild 150
MaxClients 15
Timeout 60
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 15


この数値はそれぞれ関連しあうのでどれかひとつを増減しても効果は現れにくい。
アクセスの現状を把握した上で全体的な調整を持つ必要がある。

それぞれの意味は
  • StartServers
    Apacheの起動時にいくつのプロセスを起動するか。


  • MinSpareServers
    プロセスの数がこの値より少なくなると、この値までプロセスを起動する。


  • MaxSpareServers
    プロセスがこの値より多くなると、プロセスを終了させる。


  • MaxRequestsPerChild
    プロセスの処理数がこの値を超えたら、プロセスを終了させる。


  • MaxClients
    同時接続数。


  • Timeout
    処理タイムアウト時間。


  • KeepAlive
    HTTP1.1から対応した、通信を一度きりで切ることなく維持する機能がKeepAlive。


  • MaxKeepAliveRequests
    KeepAliveで接続を維持している間に処理するリクエスト数。


  • KeepAliveTimeout
    KeepAliveで接続が維持されつづけると、効率が落ちるので一定時間で切断するための時間設定。


≫参考にしたサイト



技林TOP > 自宅サーバ構築メモ > Apacheのチューニング
(C) bayashi.net