Apacheで負荷分散させる設定方法を解説!(maxclients / maxrequestworkers / maxconnectionsperchild 等)

  • 2024.02.07
       
gwとして運用中のApacheの負荷やレスポンス速度を改善するオススメ設定

本記事は筆者の実際の体験に基づいた技術ブログです。
この記事では、アクセス数が増加しサーバの接続遅延で困っている方を対象にApacheのオススメ設定方法を説明しています。

▼Apacheについて知りたい方はこちら
Apacheとは?Webサーバの仕組みや特徴を解説

発生していた事例

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 に変更することで必要となる設定がございますので、本記事では計算方法と一緒に説明させていただきます。

あなたのご希望に沿った案件が必ず見つかります
【フリーランス向け】高収入好待遇の案件をご紹介

TECH MANIA フリーランス

≫まずは簡単60秒で無料お問い合わせから≪

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 の負荷やレスポンス速度を改善するオススメ設定について紹介してきましたが、いかがでしたか?
ご活用いただけると幸いです。

     

Serverカテゴリの最新記事