>> HOME >> CentOS 4 MENU >> Apache パフォーマンス調整
Apache はもともと高性能です。低スペックのCPUやメモリ環境でも十分に動作します。ある程度のアクセスがない限りチューニングする必要がありません。我がサイトのような細々と公開するような場合は、意味がないような気もします。。
しかしながら、Apache の動作環境を最適化するという意味において、同一PC内で動作する他のサーバーにとっても親切な作業となり得ます。ということで、Apache のチューニングを行います。

1. ベンチマーク
1 ) Apache のベンチマーク取得ツール ab
2 ) Apache のベンチマーク取得
2. チューニングのポイント
1 ) Apacheのプロセスを制御する
2 ) Apache の処理を単純に減らす
3. Apache の再起動
1 ) httpd の再起動
4. チューニング結果(ベンチマーク)の取得
1. ベンチマーク
1 ) Apache のベンチマーク取得ツール ab
性能を測るためにはベンチマークテストを行います。Apache のベンチマークを取るためのツールは標準で ab というものが用意されています。
構文は    ab -OPTION URL     です。
たとえば、同時に10リクエストが発生し、100のリクエストを処理するテストを行うには、下記のように記述します。
[root@linux ~]# ab -n 100 -c 10 http://localhost/ 
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ヘルプ表示
2 ) Apache のベンチマーク取得
ab でテストする際のリクエスト数は、サーバが処理する「同時接続数の最大値の2割増」と「最少接続数」の2つを目安にします。同時接続数の目安は アクセスログ解析ソフトMRTG で調べます。
ハード的に高機能なサーバであれば、一定以上の負荷を設定しないとチューニングの効果が現れないかもしれません。
ベンチマークのURLは、サイト内で平均的なサイズの静的ファイルと、動的ページの2種類を試すべきでしょう。
[root@linux ~]# ab -n 1000 -c 25 http://mountainbigroad.jp/ 
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0
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 mountainbigroad.jp (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:        mountainbigroad.jp
Server Port:            80

Document Path:          /
Document Length:        14972 bytes

Concurrency Level:      5
Time taken for tests:   2.545357 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1516000 bytes
HTML transferred:       1497200 bytes
Requests per second:    39.29 [#/sec] (mean)
Time per request:       127.268 [ms] (mean)
Time per request:       25.454 [ms] (mean, across all concurrent requests)
Transfer rate:          581.45 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   5.8      0      43
Processing:    16  107 259.1     17    1063
Waiting:        6   57 195.2     10    1004
Total:         16  108 263.0     17    1064

Percentage of the requests served within a certain time (ms)
  50%     17
  66%     19
  75%     53
  80%     70
  90%    210
  95%   1031
  98%   1063
  99%   1064
 100%   1064 (longest request)
ここで注目すべきは・・
Completed requests
冒頭のリクエストの成否を示す部分。ここでFailed requestsが発生するようであればサーバ処理の限界を超えていると見るべき。
Requests per second
1秒間に処理されたリクエスト数。数字が大きいほど性能が良い。
Connect/Processing/Waiting
測定したリクエスト全体でのばらつきやリクエスト当たりの処理の内訳を示す。
2. チューニングのポイント
1 ) Apacheのプロセスを制御する
Timeout 120
KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 15
StartServers    8
MinSpareServers  5
MaxSpareServers  20
ServerLimit   256
MaxClients    256
MaxRequestsPerChild 4000

これらの値はそれぞれ関連しあうのでどれかひとつを増減しても効果は現れにくく、アクセスの現状を把握した上で全体的な調整を持つ必要があります。
Timeout
各イベントについて、リクエストを失敗させるまでにサーバが待つ時間を設定(単位:秒)
KeepAlive
TP の持続的な接続を有効にする(On|Off)
MaxKeepAliveRequests
持続的な接続上で許可されるリクエストの数(0:無制限)
KeepAliveTimeout
持続的な接続で次のリクエストが来るまでサーバが待つ時間(単位:秒)
StartServers
起動時に生成される子サーバプロセスの数
MinSpareServers
アイドルな子サーバプロセスの最小個数
MaxSpareServers
アイドルな子サーバプロセスの最大個数
ServerLimit
サーバープロセスの最大個数(prefork MPMの場合、ServerLimit=MaxClients)
MaxClients
リクエストに応答するために作成される子プロセスの最大個数
MaxRequestsPerChild
個々の子サーバが稼働中に扱うリクエスト数の上限
我がサイトの場合は、以下のように設定しております。
# そんなに大きな処理がないので短く
Timeout 60

# 使用する画像が多いので On
KeepAlive 0n

# 1ページ当たりの最大オブジェクト数
MaxKeepAliveRequests 50

# デフォルトのまま
KeepAliveTimeout 15

# 同時接続数の最大値は 3
StartServers 5
MinSpareServers 5
MaxSpareServers 10

# そんなにCPUやメモリを食われたくない
ServerLimit 128
MaxClients 128

# よく判らないのでデフォルト
MaxRequestsPerChild 4000
ディレクティブに関する詳細な情報は、Apache のディレクティブクイックリファレンス を参照してください。
2 ) Apache の処理を単純に減らす
HostnameLookups
クライアントの IP アドレスの DNS ルックアップを有効にする(On|Off|Double)。これはページ毎ではなく、リクエスト毎の処理になるので、Off にすることでかなりの効率向上が望めます。当然、ログに残るホスト名は全てIPアドレスになります。(デフォルトは Off です)
余計なモジュールを無くす/ロードしない
Apacheはモジュールというもので特別な機能を盛り込めるようになっています。Apacheバイナリインストールした場合は、必要のないモジュールまでインストールされていることがあります。必要のないものをロードしないように httpd.confで設定します。
.htaccessは使わない
ディレクトリごとに.htaccessで設定しているとパフォーマンスが落ちます。なるべくhttpd.confで設定した方が効率は上がります。
SSIは限定的に
.htmlでSSIを使用できる設定は可能ですが、SSIコマンドが含まれていなくてもSSIの処理を通ってしまうので効率が落ちます。SSIを使用するのは.shtmlに限定すれば、.htmlファイルの効率はそのままになります。
我がサイトの場合は、以下のように設定しております。
#
# Dynamic Shared Object (DSO) Support
#
# To be able to use the functionality of a module which was built as a DSO you
# have to place corresponding `LoadModule' lines at this location so the
# directives contained in it are actually available _before_ they are used.
# Statically compiled modules (those listed by `httpd -l') do not need
# to be loaded here.
#
# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule access_module modules/mod_access.so
LoadModule auth_module modules/mod_auth.so
#LoadModule auth_anon_module modules/mod_auth_anon.so
#LoadModule auth_dbm_module modules/mod_auth_dbm.so
#LoadModule auth_digest_module modules/mod_auth_digest.so
#LoadModule ldap_module modules/mod_ldap.so
#LoadModule auth_ldap_module modules/mod_auth_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
#LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule cern_meta_module modules/mod_cern_meta.so
LoadModule expires_module modules/mod_expires.so
#LoadModule deflate_module modules/mod_deflate.so
#LoadModule headers_module modules/mod_headers.so
#LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
#LoadModule dav_module modules/mod_dav.so
#LoadModule status_module modules/mod_status.so
#LoadModule autoindex_module modules/mod_autoindex.so
#LoadModule asis_module modules/mod_asis.so
#LoadModule info_module modules/mod_info.so
#LoadModule dav_fs_module modules/mod_dav_fs.so
#LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
#LoadModule imap_module modules/mod_imap.so
LoadModule actions_module modules/mod_actions.so
#LoadModule speling_module modules/mod_speling.so
#LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#LoadModule cache_module modules/mod_cache.so
#LoadModule suexec_module modules/mod_suexec.so
#LoadModule disk_cache_module modules/mod_disk_cache.so
#LoadModule file_cache_module modules/mod_file_cache.so
#LoadModule mem_cache_module modules/mod_mem_cache.so
LoadModule cgi_module modules/mod_cgi.so

  :
  :
#
# IndexOptions: Controls the appearance of server-generated directory
# listings.
#
# Apacheによるディレクトリ表示(mod_autoindex)を無効にしたので、コメント
#IndexOptions FancyIndexing VersionSort NameWidth=*

#
# AddIcon* directives tell the server which icon to show for different
# files or filename extensions.  These are only displayed for
# FancyIndexed directories.
#
# Apacheによるディレクトリ表示(mod_autoindex)を無効にしたので、コメント
#AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

#AddIconByType (TXT,/icons/text.gif) text/*
#AddIconByType (IMG,/icons/image2.gif) image/*
#AddIconByType (SND,/icons/sound2.gif) audio/*
#AddIconByType (VID,/icons/movie.gif) video/*

#AddIcon /icons/binary.gif .bin .exe
#AddIcon /icons/binhex.gif .hqx
#AddIcon /icons/tar.gif .tar
#AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
#AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
#AddIcon /icons/a.gif .ps .ai .eps
#AddIcon /icons/layout.gif .html .shtml .htm .pdf
#AddIcon /icons/text.gif .txt
#AddIcon /icons/c.gif .c
#AddIcon /icons/p.gif .pl .py
#AddIcon /icons/f.gif .for
#AddIcon /icons/dvi.gif .dvi
#AddIcon /icons/uuencoded.gif .uu
#AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
#AddIcon /icons/tex.gif .tex
#AddIcon /icons/bomb.gif core

#AddIcon /icons/back.gif ..
#AddIcon /icons/hand.right.gif README
#AddIcon /icons/folder.gif ^^DIRECTORY^^
#AddIcon /icons/blank.gif ^^BLANKICON^^

#
# DefaultIcon is which icon to show for files which do not have an icon
# explicitly set.
#
# Apacheによるディレクトリ表示(mod_autoindex)を無効にしたので、コメント
#DefaultIcon /icons/unknown.gif

#
# AddDescription allows you to place a short description after a file in
# server-generated indexes.  These are only displayed for FancyIndexed
# directories.
# Format: AddDescription "description" filename
#
# Apacheによるディレクトリ表示(mod_autoindex)を無効にしたので、コメント
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz

#
# ReadmeName is the name of the README file the server will look for by
# default, and append to directory listings.
#
# HeaderName is the name of a file which should be prepended to
# directory indexes. 
# Apacheによるディレクトリ表示(mod_autoindex)を無効にしたので、コメント
#ReadmeName README.html
#HeaderName HEADER.html

#
# IndexIgnore is a set of filenames which directory indexing should ignore
# and not include in the listing.  Shell-style wildcarding is permitted.
#
# Apacheによるディレクトリ表示(mod_autoindex)を無効にしたので、コメント
#IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
  :
  :
モジュールに関する詳細な情報は、Apache のモジュール一覧 を参照してください。
3. Apache の再起動定
1 ) httpd の再起動
[root@linux ~]# service httpd restart 
httpdを停止中:                                             [  OK  ]
httpd を起動中:                                            [  OK  ]
4. チューニング結果(ベンチマーク)の取得
[root@linux ~]# ab -n 1000 -c 25 http://mountainbigroad.jp/ 
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.141 $> apache-2.0
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 mountainbigroad.jp (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:        mountainbigroad.jp
Server Port:            80

Document Path:          /
Document Length:        14972 bytes

Concurrency Level:      5
Time taken for tests:   2.182570 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1515400 bytes
HTML transferred:       1497200 bytes
Requests per second:    45.82 [#/sec] (mean)  ⇒  少し改善されていることがわかります。
Time per request:       109.128 [ms] (mean)
Time per request:       21.826 [ms] (mean, across all concurrent requests)
Transfer rate:          677.64 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       1
Processing:    14  101 289.2     14    1121
Waiting:        5   13  15.5      9     103
Total:         14  101 289.3     14    1121

Percentage of the requests served within a certain time (ms)
  50%     14
  66%     15
  75%     15
  80%     16
  90%     70
  95%   1070
  98%   1112
  99%   1121
 100%   1121 (longest request)
上の結果から、少し効果が出ていることが判ります。
Requests per second の値が、39.29 [#/sec] ⇒ 45.82 [#/sec]と効果が出ております。
たまたまかも知れませんが・・・