SEO対策とセキュリティで企業をバックアップします。

インターネット上のアクセスボリュームUPをお約束します。

Apache最大同時接続数の設定考察について

Apache Webサーバは、接続に関するプロセスの作り方を3種類のモジュールタイプで提供している。

それはprefork/worker/eventがその3種類に該当し、いずれかのモジュールタイプを選択して利用することになる。デフォルトはpreforkである。(Redhat8/CentOS8ではeventがデフォルト。)

preforkは単純に1セッションづつ扱うhttpdプロセスを決められた最大数(maxclients)まで状況に応じて生成してゆく方式である。

なぜ、このpreforkをデフォルトにしているかだが、様々なサーバ環境構築で万人が使って失敗しにくいというのが本音だろう。パフォーマンスが高いのは間違いなくworker,eventタイプである。

worker,eventはapache連携する他のサーバとの兼ね合いがあるためスレッドの生成パターンが相性良くないと落ちてしまう原因を作る
その意味では玄人なモジュールタイプである。fastcgiでPHPを使う場合(php-fpm)使う際はworker、eventを使うがこちらはapacheと相性が良いのは間違いない。http2に切り替えているサイトも多いのでmod_phpからfastcgiで使うパターンが最近ではかなり増えているようだ。


preforkモードでのApacheセッション設定

MaxClients及びServerLimitの設定値 計算方法

昔から色々な説が飛び交っているけれど、私は概ね次のように考えて設計している。


MaxClients = サーバ合計メモリ * (80%〜70%) / httpdプロセスの最大メモリ使用量(子httpdピーク時の平均値です。)


httpdプロセスメモリ使用量 = (親httpdメモリ容量 + 子httpdの平均物理メモリ使用量 ✕ MaxClients)- 子httpd共有プロセスメモリ使用合計値 + その他WEB連携サーバ(MySQLサーバ,FastCGIプロセス等)

  • ※httpdプロセスで使うメモリ容量はそのサーバマシンで他に何(プロセス)が動いているかでメモリ考慮割合は異なるがおおよそサーバ全体メモリが5GB以下なら最初の運用は70%以下の容量に抑えて計算するのが安全と思う。後はログや統計を見ながら少しづつアップさせできるだけSWAPが頻繁に起きない程度にしておくことをお勧めする。
    他のプロセスが極めて使用率が低いなら多少増やしてSWAP対応もありだが、SWAPも使い出すと止まらなくなるためリクエストに対するレスポンスWait時間が長くなり遅くなる。落ちる場合も当然ある。
  • ※子httpdの平均物理メモリ使用量、親httpdのメモリ使用量、その他のメモリ使用量はtopコマンドのRESをチェックし計算する。子httpdプロセス共有は(SHR)で計算する。
  • ※親プロセスから子プロセスをforkすると、子プロセスが親プロセスのメモリ空間をshareします。すなわちそのshare分(SHR)を引く必要があります。
  • ※パラメータで ServerLimit > MaxClients になるように設定する。
  • ※セッションの終了とセッションの開始はTCPのリサイクルに要する時間、ハンドシェークのステータス変化に遅延が生じるため「ServerLimit > MaxClients」のようにしないとセッションの要求と需要が噛み合って来ない。適正値は実験で求めるとよい。サイト毎のサーバやネットワーク、コンテンツの性格、ユーザの傾向にも依存するため余裕をもって値を設計するとよいだろう。

測定の際に使うtopコマンドの使い方

下記はapacheユーザだけ特定してtopコマンドでプロセスを表示する 方法です。当然httpdプロセスのみ表示されるためメモリの使用量が観測しやすくなります。