Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

UNIX®、Linux、および Mac OS X の Apache に関する考慮事項

この付録では、UNIX®、Linux、および Mac OS X の推奨オプション (“推奨オプション : NSAPI モジュール (CSPn3.so)”) と特殊オプション 1 (“代替オプション 1 : NSD を使用した Apache API モジュール (mod_csp24.so)”) に関する情報を記載しています。

Apache プロセス管理および処理能力の計画

Apache は、UNIX ベースのオペレーティング・システム向けに 2 つのプロセス管理モジュールを提供しています。 このアーキテクチャでは、ゲートウェイ・モジュールは Apache ワーカ・プロセスに直接バインドされます。 したがって、プロセス・プールを管理するための Apache の構成方法が、ゲートウェイに直接の影響を与えます。

Apache はその 2 つのプロセス管理モデルをマルチプロセッシング・モジュール (MPM) として実装します。

Prefork MPM。これは従来のマルチプロセス (UNIX®) サーバ・アーキテクチャです。これはスレッドを使用しないため、サードパーティの API モジュール (DSO) がスレッドセーフである必要はありません。参考資料 : http://httpd.apache.org/docs/2.2/mod/prefork.htmlOpens in a new tab

Worker MPM。これはより新しいマルチスレッド/マルチプロセスのハイブリッド型サーバ・アーキテクチャです。 これはスレッドを使用するため、使用されるすべてのサードパーティ製 API モジュール (DSO) はスレッドセーフであることが必要です。参考資料 : http://httpd.apache.org/docs/2.2/mod/worker.htmlOpens in a new tab

2 つのサーバ・モデルのどちらが既存のインストールに使用されているかを判別するには、Apache 実行可能プログラムを次のように修飾して直接呼び出します。

httpd -V 

以下のいずれかのように、使用されている MPM が示されます。

Server MPM:     Prefork

または以下のようにします。

Server MPM:     Worker

さらに、以下の 2 つの詳細 (および関連) リストが用意されています。

httpd –l:サーバに組み込まれたすべてのモジュールをリストします (選択された MPM を含む)。

httpd –L:すべてのモジュールと関連する構成指示文をリストします。

ゲートウェイ DSO はスレーブセーフで、どちらのサーバ・モデルにも展開できます。Apache の調整に関する役立つガイドが、http://httpd.apache.org/docs/2.2/misc/perf-tuning.htmlOpens in a new tab にあります。

セキュリティ。どちらのサーバ・アーキテクチャでも、親プロセスは、TCP ポート 80 にバインドするために、通常、スーパーユーザ特権が割り当てられたアカウント (UNIX の root) から開始します。Apache が起動する子プロセスは、特権の少ないユーザとして実行されます。(Apache 構成内の) User および Group 指示文は、Apache 子プロセスの特権を設定するために使用されます。 子プロセスは、それらが処理するすべてのコンテンツを読み取る能力 (およびゲートウェイの構成およびイベント・ログ・ファイルへの読み取り/書き込みアクセス権) が必要ですが、これ以外に付与する特権は最小限にする必要があります。

2 つの Apache MPM について、以下に簡単に説明します。 詳細は、Apache のドキュメント (前述のリンク) を参照してください。

Apache Prefork MPM

これは従来のマルチプロセス・サーバ・アーキテクチャです。

単一のコア Apache プロセス (親) が、子プロセスを起動します。 子プロセスは、適切な TCP ポート (通常は 80) で待ち受けて、クライアントから受け取る要求を受け入れ、要求データを読み取って、要求を処理できるモジュールに転送し、応答を生成します。この要求処理サイクルの後半部分は、Apache 構成ファイルの指示文に従って行われます。 例えば、CSP リソースの要求は、この目的で構成されたモジュールに転送されます。

子プロセスの管理は、以下の構成パラメータによって制御されます。

  • StartServers (既定値は 5) : この指示文は、起動時に作成される子サーバ・プロセスの数を設定します。 プロセスの数は負荷によって動的に制御されるため、通常はこのパラメータを調整する理由はほとんどありません。

    MinSpareServers (既定値は 10) : MinSpareServers 指示文は、アイドル子サーバ・プロセスの望ましい最小数を設定します。 アイドル・プロセスとは、要求を処理していないプロセスです。 アイドル数が MinSpareServers に満たない場合、親プロセスは毎秒最大 1 つのペースで新しい子プロセスを作成します。

  • MaxSpareServers (既定値は 5) : この指示文は、アイドル子サーバ・プロセスの望ましい最大数を設定します。 アイドル・プロセスとは、要求を処理していないプロセスです。 MaxSpareServers を超えるアイドルがある場合は、親プロセスは過剰なプロセスを強制終了します。

  • MaxClients (既定値は 256) : この指示文は、処理する同時要求数の制限を設定します。 通常、MaxClients の制限値を超える接続試行は、ListenBacklog 指示文に基づいた数まで、キューに入れられます。 別の要求の終了時に子プロセスが解放されると、その接続が提供されます。 非スレッド化サーバの場合、MaxClients は、要求を処理するために起動される子プロセスの最大数に変換されます。 このパラメータを増加させるには、ServerLimit も増加させる必要があります。

  • ServerLimit (既定値は 5) : この指示文は、Apache インスタンスの存続期間の MaxClients の最大構成値を設定します。

  • MaxRequestsPerChild (既定値は 10000) : この指示文は、個々の子サーバ・プロセスが処理する要求数の制限を設定します。 MaxRequestsPerChild で設定された要求数を超えると、子プロセスは消滅します。MaxRequestsPerChild が 0 に設定されている場合、プロセスは有効期限切れになりません。

通常、Apache は自己調節するため、ほとんどのサイトはこれらの指示文を既定値から調整する必要はありません。 256 を超える同時要求を処理する必要があるサイトは、MaxClients の値を増加させる必要があるかもしれません。また、メモリに制限のあるサイトは、サーバのスラッシング (ディスクとの間でメモリのスワップを繰り返すこと) を防ぐために、MaxClients を減らす必要があるかもしれません。

Apache Worker MPM

これはマルチスレッド/マルチプロセスのハイブリッド型サーバ・アーキテクチャです。

単一のコア Apache プロセス (親) が、子プロセスを起動します。 それぞれの子プロセスは、接続を待ち受けて到着した接続を処理のためにサーバ・スレッドに渡すリスナ・スレッドに加え、ThreadsPerChild 指示文で指定された固定数のサーバ・スレッドを作成します。

Apache サーバ・インスタンスは、スレッドを使用して要求を処理することで、プロセス・ベースのサーバより少ないシステム・リソースを使用して多数の要求を処理することができます。 その一方で、それぞれが多数のスレッドを備えた複数プロセスを利用可能な状態に保つことで、プロセス・ベースのサーバに近い安定性も維持します。

Apache は常に、受信要求の処理準備が整った、予備またはアイドル・サーバ・スレッドのプールを維持しようと試みます。 そのため、クライアントは、その要求が処理される前に、新しいスレッドやプロセスの作成を待つ必要はありません。 このメカニズムを制御するために、以下のパラメータが提供されています。

  • StartServers (既定値は 3) : この指示文は、起動時に作成される子サーバ・プロセスの数を設定します。 プロセスの数は負荷によって動的に制御されるため、通常はこのパラメータを調整する理由はほとんどありません。

  • ThreadsPerChild (既定値は 25) : この指示文は、それぞれの子プロセスが作成するスレッドの数を設定します。

  • MinSpareThreads (既定値は 75) : この指示文は、要求の急増に対処するアイドル・スレッドの最小数を設定します。 サーバに十分な数のアイドル・スレッドがない場合、アイドル・スレッド数がここで指定された数より多くなるまで子プロセスが作成されます。

  • MaxSpareThreads (既定値は 250) : この指示文は、アイドル・スレッドの最大数を設定します。 アイドル・スレッドの数は、サーバ全体の数として考えられます。 サーバに過剰な数のアイドル・スレッドがある場合、アイドル・スレッド数がこの数より少なくなるまで子プロセスが強制終了されます。

  • MaxClients : この指示文は、クライアントの処理に使用可能な合計スレッド数を制限します。 既定値は 16 (ServerLimit) に 25 (ThreadsPerChild) を乗算したものです。 したがって、MaxClients を16 個を超えるプロセスが必要な値まで増やすには、ServerLimit の値を増やす必要があります。

  • ServerLimit (既定値は 16) : この指示文は、MaxClientsThreadsPerChild の設定が 16 個 (既定値) を超えるサーバ・プロセスを必要とする場合のみ使用します。 この指示文には、MaxClients および ThreadsPerChild パラメータで指定された要件を守るのに必要とされるサーバ・プロセス数より大きな値は設定しないでください。

  • ThreadLimit (既定値は 64) : この指示文は、Apache プロセスの存続期間の ThreadsPerChild の最大構成値を設定します。 再起動時にこの指示文を変更しようとしても無視されますが、ThreadsPerChild は再起動時にこの指示文の値に変更できます。

  • MaxRequestsPerChild (既定値は 10000) : この指示文は、個々の子サーバ・プロセスが処理できる要求数の制限を設定します。MaxRequestsPerChild で設定された要求を超えると、子プロセスは消滅し、新しいプロセスが作成されます (リサイクル・イベント)。 MaxRequestsPerChild が 0 に設定されている場合、プロセスは有効期限切れになりません。

最初に起動される子 (またはワーカ) プロセスの数は、StartServers 指示文によって設定されます。 その後、Apache は処理中に全プロセス中の合計アイドル・スレッド数を評価して、この数を MinSpareThreads および MaxSpareThreads で指定された範囲内に保つためにプロセスをフォークまたは強制終了します。 このプロセスは自己調節するため、これらの指示文を既定値から変更する必要はほとんどありません。同時に処理できるクライアントの最大数 (つまり、全プロセスにおけるスレッドの合計最大数) は、MaxClients 指示文によって決まります。 アクティブな子プロセスの最大数は、MaxClients 指示文を ThreadsPerChild 指示文で除算して決定されます。

アクティブな子プロセスの数と 1 つの子プロセス内のサーバ・スレッドの数のハード制限は、2 つの指示文によって設定し、これはサーバを完全に停止してから再起動することによってのみ変更できます。 ServerLimit はアクティブな子プロセスの数のハード制限で、MaxClients 指示文を ThreadsPerChild 指示文で除算した数値以上であることが必要とされます。 ThreadLimit はサーバ・スレッド数のハード制限で、ThreadsPerChild 指示文以上であることが必要とされます。 これらの指示文に既定値以外の値を指定する場合は、他のワーカ指示文より前にこれらを設定する必要があります。

一連のアクティブな子プロセスに加え、終了中でありながら 1 つ以上のサーバ・スレッドが依然として既存のクライアント接続を処理中の子プロセスがある場合があります。 最大で MaxClients で指定された数の終了中プロセスが存在する可能性がありますが、実際の数ははるかに少ないと予測されます。この動作は、以下のように個々の子プロセスの終了を無効にすることで回避できます。

  1. MaxRequestsPerChild の値をゼロに設定します。

  2. MaxSpareThreads の値を MaxClients と同じ値に設定します。

Apache MPM とゲートウェイ DSO

ゲートウェイ DSO はスレーブセーフで、どちらのサーバ・モデルにも展開できます。

StartServers 指示文は、両方の MPM について、開始する子 (ワーカ) プロセスの数を指定します。 この指示文はまた、存在できる CSP ゲートウェイ DSO のインスタンスの数を示します (例 : Apache の子プロセスごとに 1 つ)。

どちらの MPM も複数の子 (ワーカ) プロセスに負荷を分散し、異なるバージョンのゲートウェイは動作も異なります。

  • Caché バージョン 2010.2 以前 : それぞれのゲートウェイ・インスタンスは独立して動作します。 各インスタンスは自らの実行中の構成、接続テーブル、およびフォーム・キャッシュを管理します。 ゲートウェイ・システム・ステータス・フォームのコンテンツは、更新のたびに変更されます。 これは、表示されるステータスが、結果を返すゲートウェイ・インスタンスのステータスであるためです。

  • Caché バージョン 2011.1 以降 : 各ゲートウェイ・インスタンスはすべての Apache 子プロセスそれぞれによって個々にロードされますが、実行中の構成、接続テーブル、およびフォーム・キャッシュは共有メモリ・セクタに保持されます。 ゲートウェイ・システム・ステータス・フォームのコンテンツは、更新しても同じになります (もちろん、アクティビティの更新結果による変更は除きます)。 表示される接続テーブル (および接続数) は Apache インスタンス全体に共通で、この理由から、各 Caché 接続が関連付けられる Web サーバ・プロセス ID を示す追加列が含まれます。

ゲートウェイの負荷は複数の Web サーバ・プロセスに分散され、これは以下のゲートウェイ構成パラメータに影響を与えます。

サーバ接続最大数

このパラメータでは、特定の Caché サーバに対してゲートウェイが行うことのできる接続の数を効果的に制限できます。 これはスロットルです。 このパラメータを設定する際は、値はそれぞれの Web サーバ・ワーカ・プロセスに適用され、Web サーバのインストール全体に適用されるのではないことに注意してください。

例えば、サーバ接続最大数パラメータが 10 に設定され、ホストの Apache サーバが 5 つのワーカ・プロセスを開始する場合、ゲートウェイが理論的に作成できる合計接続数は 50 (10x5) になります。

これはかなり単純化した見方です。 ただし、接続最大数スロットルの効果は、MPM の選択によってさらに影響されます。 Perfork MPM の場合は単純です。スレッドは使用されないため、それぞれの Apache ワーカ・プロセス (ゲートウェイ・インスタンス) はおそらく、Caché に対して 1 つの接続しか作成できません。 各ワーカ・プロセスは、一度に 1 つの要求のみを処理できます。 また、MaxClients Apache 設定の影響にも注意してください。Apache は、ここで指定された数を超える要求の処理を同時に試みることはありません。 したがって、ゲートウェイの接続最大数スロットルは、Prefork MPM と共に使用する場合、何の影響も与えません。なぜなら、値が 1 以外になることはないからです。

Worker MPM の場合は、それぞれの Apache ワーカ・プロセスが多数のスレッドを開始できるため、多少複雑になります。 理論上は、ゲートウェイ・インストール全体で Caché に対して行うことが可能な合計接続数は、最大サーバ・プロセス数 (ServerLimit) に、プロセスあたりのスレッド数 (ThreadsPerChild) (最大で MaxClients 指示文で指定された制限値) を乗算したものになります。 また、ThreadLimit 設定で指定されたスレッド数の上限値にも注意してください。

ゲートウェイ構成では、サーバ接続最大数指示文によって設定された接続数の制限は、個々の Apache ワーカ・プロセスそれぞれに適用されます。 プロセスあたりに許可された最大スレッド数 (ThreadsPerChild) より大きな値を指定しても、ほとんど影響はありません。なぜなら、Apache は、各プロセスで可能なスレッド数で対応できる並行作業より多くを割り当てることはできないからです。 サーバ接続最大数をプロセスあたりに許可されたスレッド数 (ThreadsPerChild) より小さな値に設定すると、ゲートウェイ・モジュールのキューイングが発生する可能性があります。なぜなら Apache は、許可された数の Caché への接続で処理できるより多くの作業を各ワーカ・プロセスに割り当てる可能性があるからです。 このような構成を行うと、Apache 環境で輻輳が発生する可能性があるため、注意する必要があります。

Apache の負荷のほとんどが CSP 要求から構成されるインストールでは、ゲートウェイのサーバ接続最大数指示文に値を指定しないで、対応する Apache 構成パラメータを使用して実行できる並行作業量 (および Caché への接続数) を制御することをお勧めします。

ただし、CSP 要求が Apache インストール全体の負荷の一部でしかないインストールでは、ゲートウェイのサーバ接続最大数指示文に独立した値を設定するのは有効です。

ステート認識セッション (保持モード 1)

複数のワーカ・プロセスに負荷を分散する Web サーバでのステート認識セッションのサポートは、個々のワーカ・プロセス間の要求の転送を管理する IPC (プロセス間通信) プロトコルに依存します。 この Web サーバ・アーキテクチャで動作するゲートウェイは、どのワーカ・プロセスが特定の要求を処理するかを制御することはできません。

ゲートウェイはその IPC プロトコルに UNIX ドメイン・ソケットを使用します。ステート認識セッションをサポートする方法について、以下に説明します。

例として、P1、P2、および P3 の 3 つのワーカ・プロセスに負荷を分散する Web サーバ・インストールについて考えてみましょう。 各ワーカ・プロセスは、使用されている Web サーバの MPM と構成に従って、任意の数のスレッド (T1、T2 … Tn) を開始できます。

アプリケーションがそのセッションをステート認識 (保持モード 1) とマークする要求を行い、ゲートウェイがプロセス P2 でその指示を認識すると仮定します。 今ではプライベートの Caché プロセスへの接続 (およびセキュリティ・コンテキスト) は、Web サーバのワーカ・プロセス P2 によってホストされます。 そのユーザ/セッションに対する以降の要求は、すべてワーカ・プロセス P2 で処理する必要があります。 ただし、ゲートウェイは Web サーバが以降の要求をどのワーカ・プロセスに転送するかを制御できないため、ゲートウェイは P2 と (可能性として) そのセット内の他の任意のワーカ・プロセスとの間で IPC チャネルを確立する必要があります。

ゲートウェイは P2 でステート認識として接続をマークすると、別個の分離されたスレッドで待ち受けサービスを開始します。 ゲートウェイ・ログ・レベル v2 が使用されている場合は、以下のようなメッセージがイベント・ログに書き込まれます。

IPC Server 
Process ID: 28457 Listening on Domain Socket: /tmp/csp28457.str

次に、例えば、同じセッションに対するさらなる要求がワーカ・プロセス P3 によって処理されると仮定します。 ゲートウェイはその要求を、以前に確立された IPC チャネルを介してプロセス P2 に転送し、応答を待機します。 ログ・レベル v2 が使用されている場合は、以下のようなメッセージが記録されます。

Route request over IPC to another web server process
PrivateSession=2; pid_self=28456; ipc_to_pid=28457; 

もちろん、そのセッションに対する要求が Web サーバによって P2 に直接転送される場合は、P2 がセッションのプライベート接続をホストしているため、ゲートウェイ環境でさらなる転送は必要ありません。

なんらかの理由で以前作成された IPC チャネルにゲートウェイが接続して要求を転送できない場合は、エラーが発生したコンテキストに応じて以下のメッセージのいずれかが記録されます。

IPC CLIENT: Error
Cannot connect

または

IPC CLIENT: Error
Cannot send request

この領域で問題が発生する最も一般的な理由は、Apache がワーカ・プロセスを閉じたこと (またはリサイクルしたこと) です (P2 の例の場合)。 もちろん、(アクセス違反/SIGSEGV エラーなどで) プロセスはクラッシュし、この場合は、おそらくエラー・メッセージが Apache エラー・ログに報告されます。

Apache はまた、既定では、ワーカ・プロセスを定期的にリサイクルします。

ステート認識セッションを使用する場合は、以下のようにインストールを構成して、ワーカ・プロセスをリサイクルしないように Apache を構成してください。

  • MaxRequestsPerChild の値をゼロに設定します。

  • MaxSpareThreads の値を MaxClients と同じ値に設定します。

(おそらくモジュールの故障が原因で) Apache が定期的にプロセスをリサイクルするのを阻止できない場合に、ステート認識セッションを使用する必要があるときは、NSD ベースのゲートウェイ構成を使用できます。 NSD ベースのアーキテクチャは、ゲートウェイのプロセス管理を Web サーバから効果的に切り離すため、前述の問題を回避します。 ゲートウェイの NSD (Network Service Daemon) を使用する際のオプションについては、後のセクションで説明します。

FeedbackOpens in a new tab