当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

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

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


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プロセス等)

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

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

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

タグ: , , , ,

CentOS6/CentOS7 Apache2.4.17以降へアップグレードかつHTTP2対応 SSL&phpも考慮


CentOSはバージョン6,7ともレポジトリーISUを追加してhttp2対応が必要。CentOS7はApache2.4ではあるがマイナーバージョンがhttp2に対応していない。
尚更、CentOS6は対応できていない。Ubuntu/Debian系のLinuxなら比較的簡単に入れられるのでそこがCentOSの場合面倒なところ。ちなみに秋頃にリリースされたCentOS8はデフォルトでApache+php-fpmの組み合わせでhttp2仕様になっています。特にhttp2に対応するための特別な設定は不要です。

まず最初に現在使っているhttpd2.2.xのWEBサーバとphpを外す必要があるだろう。標準のものを使っている場合はremiの進んだバージョンのphpを使っている
場合もあるだろうが概ね下記のような感じで依存関係もチェックしながら外してゆく。その後にISUのレポジトリーを追加してhttp2対応のhttpd2.4を導入する。
このバージョンではmod_phpが古いhttpdでなければ動かないようなのでphpはfastCGIを使った方法に変更する。

現行環境の削除、レポジトリー追加とapache2.4(http2対応バージョン)+fastCGI導入

※httpd2対応のモジュールロード設定は/etc/httpd/conf.modules.d/00-base.confに追加されています。

プロセスをevent型に切り替える

httpd2対応にはhttpdプロセスのprefork型の動作では駄目です。event型に切り替える必要があります。

fastCGIの設定修正

mod_phpが使えないのでfastCGI経由でphpを動作させます。それにあたり基本設定の動作ユーザをapacheに切り替えます。

仮想サーバ設定にhttp2動作のためのデイレクティブ追加

eventモジュールのパラメータ設定

Apache2.4ではMaxClientsがMaxRequestWorkersに変わっています。

/etc/httpd/conf.dの配下にmpm_event.confのような名前で配置します

fastcgiのプロキシー設定

fastcgiとapacheをつなぐ設定です。これがないとphpが動きません。

proxyfcgi.confのような名前で/etc/httpd/conf.dに配置してください

サーバの起動

http2になっているかチェックする。

http2に対応していることがブラウザの検証ツールで確認できます。 またレスポンスヘッダーを見て確認する事もできます。

h2プロトコルの結果検証

PHPが使えなかったりhttp/1.1のままになっている方は何が原因?

それはopensslが古いままだからです。openssl1.0.2以降を使いましょう。あるいはapacheとphp-fpmの連携が噛み合っていない場合もありえます。phpのバージョンとphp-fpmのバージョンがマッチしてなかったりすることもあるので確認してみましょう。Apacheではfastcgiの連携にproxyを経由します。その設定が適切に行えてなければ連携できていません。なければ自分でproxyfcgi.confを仮想サーバディレクトリで作成して連携させてください。

タグ: , , , , , ,