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

メニュー

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

2020/01/06

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

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

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

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

worker,eventはapache連携する他のサーバとの兼ね合いがあるため通信スレッドの生成パターンが相性良くないと落ちてしまう原因を作る。マルチプロセス方式とマルチプロセス/マルチスレッド方式、マルチスレッド方式はどれも通信コネクションの生成挙動が異なるのでApacheに限らずコネクションの生成パターンを観察する術はサーバ連携を行う際はよく調べる必要があります。

worker,eventタイプはマルチプロセス/マルチスレッド方式なので使い方間違えると失敗する玄人な動作モードだ。workerとevent型は基本的に同じ動きなのですが、event では「プロセス数不足」というEventをきっかけに生成する部分だけworkerと違う。イベントが終わった後のプロセスの終了も考えると連携するサーバ、あるいはアプリケーションが それを理解していないといけない、あるいは一定時間No responseなら待機モードになるとかそういう意味のサーバ連携、アプリ連携で相互の噛み合わせを調整する必要があります。fastcgiでPHPを使う場合(php-fpm)使う際はworker、eventを使うがこちらはapacheと相性が良いのは間違いない。http2に切り替えているサイトも多いのでmod_phpからfastcgiで使うパターンが最近ではかなり増えているようだ。


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

メモリ量、CPUの処理能力、平均的なネットワークの帯域の余裕によってこの適正値があると思います。メモリ容量に余裕があるならServerLimit,MaxClients, MaxRequestsPerChildは多めにとっても良いと思います。上記の例はあくまでも解説用の架空の値なので作業するサーバの状況に合わせて値を適宜変更してください。

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

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


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


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

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

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