本記事は筆者の実際の体験に基づいた技術ブログです。
この記事では、アクセス数が増加しサーバの接続遅延で困っている方を対象にApacheのオススメ設定方法を説明しています。
▼Apacheについて知りたい方はこちら
Apacheとは?Webサーバの仕組みや特徴を解説
- 1. 発生していた事例
- 2. 事例の発生した gw 構築環境
- 3. 所用時間
- 4. 問題点を結論から
- 5. mpm のエンジンを切り替える
- 6. event エンジンの詳細設定
- 6.0.1. MaxRequestWorkers (最大同時リクエスト数)( apache2.4 以前は MaxClients )
- 6.0.2. ServerLimit (子プロセス数の設定可能な上限値)
- 6.0.3. StartServers (最初に起動する子プロセスの数)
- 6.0.4. ThreadLimit ( 子プロセス毎のスレッド数( ThreadsPerChild )の設定可能な上限値 )
- 6.0.5. ThreadsPerChild (子プロセスそれぞれに生成されるスレッド数)
- 6.0.6. MinSpareThreads (アイドル状態のスレッド最小数)
- 6.0.7. MaxSpareThreads (アイドル状態のスレッド最大数)
- 6.0.8. MaxConnectionsPerChild( 子プロセスが稼働中に扱うリクエスト数の上限 )
- 7. まとめ
発生していた事例
gw として applicationサーバとの橋渡しを行っていたサーバがあるのですが、アクセス数が増加すると接続速度の遅延が目立つようになりました。
場合によってはレスポンスに10秒以上かかる場合もあり、コア数やメモリ等試行錯誤しながら調整を行っていたのですが、最終的に gw に搭載している webエンジンApache の設定を見直しただけで接続遅延が大幅に改善されたので、内容を共有します。
事例の発生した gw 構築環境
Server OS : Linux centOS
Web Engine : Apache 2.4
所用時間
15 分程
問題点を結論から
結論から言うと apache の mpm 設定を prefork から event に変更することで改善しました。
簡単に概要を説明すると prefork と event は以下の用途の違いがあります。
- prefolk
→ ruby 等のバックエンドアプリが同居している場合に有効 - event
→ gw としての役割といった、バックエンドアプリを有さない gw 等のサーバで有効
event に変更することで必要となる設定がございますので、本記事では計算方法と一緒に説明させていただきます。
mpm のエンジンを切り替える
mpm は使用エンジンの切り替えが簡単にできます。
まずは prefork から event に切り替えます。
以下のファイルの中身を変更します。
/etc/httpd/conf.modules.d/00-mpm.conf
# Select the MPM module which should be used by uncommenting exactly
# one of the following LoadModule lines:
# prefork MPM: Implements a non-threaded, pre-forking web server
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so ##### ←コメントアウト #####
# worker MPM: Multi-Processing Module implementing a hybrid
# multi-threaded multi-process web server
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
#
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
# event MPM: A variant of the worker MPM with the goal of consuming
# threads only for connections with active processing
# See: http://httpd.apache.org/docs/2.4/mod/event.html
#
LoadModule mpm_event_module modules/mod_mpm_event.so ##### ←コメントアウト解除 #####
上記の設定が終わったら、以下のコマンドで apache を再起動し module をリロードします。
service httpd restart
event エンジンの詳細設定
まずは最終的な詳細設定値からご覧ください。
<IfModule mpm_event_module>
MaxRequestWorkers 2200 # 最大同時リクエスト数
ServerLimit 2200 # 子プロセス数の設定可能な上限値
StartServers 20 # 最初に起動する子プロセスの数
ThreadLimit 440 # 子プロセス毎のスレッド数(ThreadsPerChild)の設定可能な上限値。
ThreadsPerChild 440 # 子プロセスそれぞれに生成されるスレッド数
MinSpareThreads 440 # アイドル状態のスレッド最小数
MaxSpareThreads 1320 # アイドル状態のスレッド最大数
MaxConnectionsPerChild 300 # 子プロセスが稼働中に扱うリクエスト数の上限
</IfModule>
基本的に設定値は CPUコア数 や Memory に応じ計算することとなります。
尚、本記事に掲載する情報は CPU 20 core 、 Memory 24 GB の gw 環境における設定値を掲載しています。
apache 公式での設定指標や情報サイトで収集した内容をまとめましたので、みなさんの使用中のサーバスペックをベースに以下の計算式を参考に設定値を計算してください。
MaxRequestWorkers (最大同時リクエスト数)( apache2.4 以前は MaxClients )
MaxRequestWorkers = ( 総メモリ量 – システム全体の消費メモリ量 ) / ( Apache 1プロセスあたりの消費メモリ量 )
ServerLimit (子プロセス数の設定可能な上限値)
MaxRequestWorkers と同数値
StartServers (最初に起動する子プロセスの数)
apache service 起動時に生成される子サーバプロセス数 の default 数を設定します。
プロセス数は負荷に応じて動的に増減しますが、プロセス生成にかかる負荷を減らしたい場合はこの数値を大きくする等調整しましょう。
大きな数値を設定する場合それに応じたメモリ消費がされますため、実際に設定して server にかかる負荷を確認することを推奨します。
尚、本記事における設定値は、突発的に同時アクセスが平常時より増えた場合でも対応できるよう数値を default より少し大きめに設定しております。
ThreadLimit ( 子プロセス毎のスレッド数( ThreadsPerChild )の設定可能な上限値 )
MaxRequestWorkers ≦ ServerLimit × ThreadLimit
※ ServerLimit と ThreadLimit を掛けた数値が MaxRequestWorkers より大きくなるように設定してください。
ThreadsPerChild (子プロセスそれぞれに生成されるスレッド数)
ThreadLimit と同値
MinSpareThreads (アイドル状態のスレッド最小数)
ThreadsPerChild の整数倍にする
MaxSpareThreads (アイドル状態のスレッド最大数)
ThreadsPerChild の整数倍にする
MaxConnectionsPerChild( 子プロセスが稼働中に扱うリクエスト数の上限 )
apache2.4 以前は MaxRequestsPerChild というパラメータです。
1プロセスあたりのメモリ消費量を元に、常時稼働していて問題ない数を設定しましょう。
プロセスのメモリ消費量を確認したい場合は以下のコマンドを gw サーバで実行し、動作を監視してみてください。
ps -ylC httpd --sort:rss ## 出力結果のRSS の平均値
まとめ
基本的にデフォルトでも問題なく稼働しますが、よりよいパフォーマンスを発揮させるには、自身の環境に応じた適切な設定を行うと良いですね。
自動計算ツールがいくつも無料配布されておりましたので、計算が大変な時は頼ってみてもいいかもしれません。
計算ツールまとめの記事
ここまで、gw として運用中の Apache の負荷やレスポンス速度を改善するオススメ設定について紹介してきましたが、いかがでしたか?
ご活用いただけると幸いです。