■Apacheのチューニング
アクセスが多くなってくるとそのままの状態では画面が重くなったり、反応が鈍くなったりすることがあります。 (ハードウェアのリソースにもよりますが) さほどアクセスが多くないサイトであれば全く意識しなくて良いのですが、人気サイトともなればApacheのチューニングを行う必要があります。但し、カーネルのパラメーターに関しては触らずあくまでアプリケーションでチューニングしたほうが良いと考えています。まずhttpd.confの中で設定する項目でどれがチューニングポイントとなるか、以下にまとめてみました。<IfModule prefork.c>または<IfModule worker.c>の中に書いてある以下の項目です。どちらが該当するかはApacheがどちらのモードになっているかで違ってきます。
オプション
|
概要
|
デフォルト値 |
StartServers | Apacheが起動した際のプロセス数 | 8 |
MinSpareServers | 待機させておくプロセス起動の最小値 | 5 |
MaxSpareServers | 待機させておくプロセス起動の最大値 | 20 |
ServerLimit | 最大プロセス数 (MaxClinetsと同一) | 256 |
MaxClients | 最大同時リクエスト数 (ServerLimitと同一) | 256 |
MaxRequestsPerChild | 1プロセスが処理できる最大リクエスト数 | 4000 |
StartServers, MinSpareServers, MaxSpareServersはアイドル状態にあるhttpdのプロセス数を指定するためのものです。それぞれ起動時、最小、最大の個数を指定します。アイドル状態にあるプロセスはHTTPリクエストを素早く引き継ぐため予め起動され待機しています。これらのプロセス数を増やすことでプロセス起動に伴うオーバーヘッドを最小にしHTTPリクエストを迅速に処理できます。その代わり、メモリなどのリソースを多く必要とします。Apacheは最初に起動されるとStartServersで指定された数のプロセス数を起動します。そしてプロセス数がMinSpareServersで指定された数を下回った場合、新たなプロセスを生成します。ここでのプロセス数はあくまでもアイドル状態にあるプロセス数であり、HTTPリクエストを処理中のプロセスはカウントされません。
ServerLimitとMaxClientsは接続を許可するクライアントの数の上限を指定するためのものです。Webサーバに接続できるクライアントの数の上限を指定します。preforkの場合、両者は同一の内容を表すため同じ値を設定する必要があります。クライアントの接続数がこの値に達すると処理中のTCPセッションが開放されるまで接続は一旦保留されます。この制限によりパフォーマンス低下や負荷の上昇をある程度防ぐことができます。標準では256が設定されています。
MaxRequestPerChildは1つのプロセスが処理するリクエスト数の上限を指定するためのものです。1つのプロセスが処理できるHTTPリクエスト数の上限を指定します。ここで指定された数のHTTPリクエストを処理するとそのプロセスは終了します。0の場合、プロセスは終了せずHTTPリクエストを無制限に処理し続けます。この設定によってメモリリークなどのトラブルが発生しても一定数を処理した後プロセスが終了するため、その影響をある程度抑えることができます。標準では4000が設定されています。この値を大きくするほどプロセスの起動や停止に伴うオーバーヘッドがかからなくなります。但し、それによる性能向上はわずかであり、何らかの問題をはらんでいる場合にはトラブルのもとにもなるため標準のまま使うことをおすすめします。
これらの数字をどれぐらいに設定すれば良いのかというのは非常に難しいところなのですが最も重要なのはMaxClientsであり、膨大なアクセスが無い限りはデフォルトの256のままでOKです。MaxSpareServersはMaxClientsの10%~30%程度、MinSpareServersはMaxSpareServersの半分程度にするのが一般的です。上記に記載した項目以外にパフォーマンスに関連する下記の設定項目があります。
オプション
|
概要
|
デフォルト値 |
KeepAlive | 1つの接続で複数の要求を処理 | off |
MaxKeepAliveRequests | 1接続の最大リクエスト数 | 100 |
KeepAliveTimeout | 1接続のタイムアウト時間 | 15 |
KeepAliveとは1回のTCPセッションで複数のHTTPリクエストを処理することです。TCPセッションが確立された状態でHTTPリクエストを続けて送信できるため効率よく処理を行うことができます。デフォルトではOffであり有効にするにはOnにします。
MaxKeepAliveRequestsはKeep-Aliveが有効になっているときに1回のTCPセッションで受け付けることができるHTTPリクエストの数を制限するものです。その上限を指定します。0の場合、受け付けるHTTPリクエストは無制限になります。大きい値を指定するほどWebサーバの性能は向上します。但し、ある程度の個数を処理したら一旦切断して新たなTCPセッションで処理を続けたほうが安全です。標準では100に設定されておりほとんどの場合において変更の必要はありません。
KeepAliveTimeoutは有効になっているときにTCPセッションを切断せずに次のHTTPリクエストを待つ時間を指定するためのものです。待ち時間の最大時間を指定します。長い時間を指定するほど性能は向上しますが、あまり長い時間を指定するとプロセスが増えすぎて逆に性能を落とす可能性もありえます。
■ベンチマークテスト
Webサーバの性能を測定するベンチマークツールとしてApacheではそのツールが同封されています。そのコマンドは「ab」というツールで気軽に試すことの出来るツールなので是非利用してください。使い方は以下となります。-nは発行する総リクエストの回数、-cは同時に発行するリクエストの数となりますので下記では同時100リクエストが10回発生することになります。
# ab -n 1000 -c 100 http://localhost/ This is ApacheBench, Version 2.3 <$Revision: 655654 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking localhost (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 Completed 1000 requests Finished 1000 requests Server Software: Apache/2.2.15 Server Hostname: localhost Server Port: 80 Document Path: / Document Length: 3985 bytes Concurrency Level: 100 Time taken for tests: 0.108 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Non-2xx responses: 1001 Total transferred: 4188184 bytes HTML transferred: 3988985 bytes Requests per second: 9275.32 [#/sec] (mean) Time per request: 10.781 [ms] (mean) Time per request: 0.108 [ms] (mean, across all concurrent requests) Transfer rate: 37936.27 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 1 0.5 0 2 Processing: 2 10 1.7 10 11 Waiting: 1 9 1.7 10 11 Total: 4 10 1.5 11 13 WARNING: \ The median and mean for the initial connection time are not within a normal deviation These results are probably not that reliable. Percentage of the requests served within a certain time (ms) 50% 11 66% 11 75% 11 80% 11 90% 11 95% 11 98% 12 99% 12 100% 13 (longest request) |
上記ではWebサーバ自身からベンチマークをかけました。-nが総リクエスト数で-cが同時リクエスト数です。この他にも多数のオプションがありますが、それらはman abを参照ください。
上記結果から注目すべき点は黒字で塗った部分です。Request per secondは1秒間あたりのリクエスト数で値が大きいほどパフォーマンスが良いということです。逆にTime per requestは1リクエストあたりの秒数で値が小さいほどパフォーマンスが良いということです。
また、最初の方に「Complete XXX Requests」と表示されていますが、ここでFailed Requestと表示されている場合、既に限界を越えてるということになります。