UnixPower on Networking
  http://www.unix-power.net/

 
 Top - Linux - CentOS Apacheチューニング



■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と表示されている場合、既に限界を越えてるということになります。




 
 関連記事
 Apacheのインストール
 Apache+OpenLDAPで認証設定
 Awstatsのインストール
 Copyright(C) 2003-2015 UnixPower on Networking All rights reserved.