特徴
Apache は非常に高機能だが、高機能故に、一般的に重いとされている。C10K が問題になってきた現状、代替を求める声が大きくなってきた。
チューニング
設定項目は多くあるが、実際に触るべきところは多くない。実際に動かしてみて、その都度ボトルネックを解消するために設定を変えていく方がいい。
注意したい項目
-
HostnameLookups off
- off になっていることを確認
- on 担っていると、ログファイルにホスト名を出力するために DNSLookup を行ってしまう
- 無駄なログを出さない
- ログのローテートを行い、ログファイルの容量が大きくならないように設定
- 設定でログフォーマットを適切に設定
- 無駄なモジュールをロードしない
- あまり効果はないという報告もある
- なにがロードされているかは把握する必要あり
- .htaccess を無効にする
- リクエストのたびに存在チェックと読み込みを行うため、パフォーマンスが劣化
- 使用しないなら無効にする
- パフォーマンスを優先したい場合は AllowOverride None を指定
- KeepAlive
- HTTP はステートレスなプロトコルのため、リクエスト毎に TCP の接続、切断が発生する。
- 一度接続が合った場合に、一定時間接続を維持する仕組みが KeepAlive
- ロードバランサーを使っている場合、効果的に使われない可能性がある
- mod_deflate
- コンテンツを圧縮して転送するモジュール
- CPU リソースを消費するが、転送速度を向上することが可能
まとめると
無駄なことをしない、ということに念頭をおいて設定を行う。
MPM(Multi Processing Module)
MPM の種類
- prefork
- エンドユーザのリクエストと子プロセスが 1:1 に対応して処理される
- 安定性が高い
- worker
- エンドユーザのリクエストは子プロセスの中のスレッドが 1:1 に対応して処理
- あるスレッドが不安定になると他も引きずられる
- event
- worker の改良版
- 1 スレッドがリクエストを受け付け、Keep-Alive の処理を別スレッドに任せる
prefork のチューニング
- StartServers
- Apache 起動時の子プロセス数
- 起動時に大量アクセスが発生するようなら引き上げる
- MinSpareServers, MaxSpareServers
- 待機プロセスの調整範囲
- 高すぎるとサーバプロセスを消費するため、様子を見ながら徐々に上げる
- ServerLimit, MaxClients(MaxRequestWorkers)
- 同時アクセス数
- MaxClients を上げる場合は ServerLimit も一緒に上げる
-
Apache 割当メモリ / 子プロセス消費メモリ
が目安
- MaxRequestsPerChild(MaxConnectionsPerChild)
- プロセスの再利用回数
- 再利用するのはメモリリークなどがあった場合に安定的に動作させるための設定
- 静的コンテンツのみの場合はプロセスを立ち上げ直す必要が無いため 0 にする
worker/event のチューニング
- StartServers
- Apache 起動時の子プロセス数
- あまりいじる必要なし
- MinSpareThreads, MaxSpareThreads
- 待機スレッドの調整範囲
- あまりいじる必要なし
- ThreadLimit
- ThreadPerChild に設定できる値の上限
- ThreadPerChild
- 子プロセス毎に生成されるスレッド数
- ServerLimit, MaxClients(MaxRequestWorkers)
- 同時アクセス数(MaxClients)
-
MaxClients / ThreadPerChild ≦ ServerLimit
となるようにする
Tips
Apache の設定項目での Server
という表記は、プロセスを表していると思われる。そのため、ServerLimit はプロセス数の最大数だと考えられる。