インストールするのはApache WorkerとPreforkのどちらですか?それぞれの(不利な)利点は何ですか?


55

PreforkWorker MPMの両方の説明に基づくと、preforkタイプはやや時代遅れのようですが、2つのタイプの適切な比較は実際には見つかりません。

私が知りたいこと:

  • 2つのバージョンの違いは何ですか?
  • 各サーバータイプの(短所)利点は何ですか?
  • 条件に基づいて選択するタイプに関する基本的なガイドラインはありますか?
  • 2つの間に大きなパフォーマンスの違いはありますか?

回答:


40

ドキュメントが言うように、非スレッドセーフライブラリとの互換性のためにスレッド化を避ける必要がある場合は、prefork MPMを使用する必要があります。通常、非自明なApacheモジュール(mod_phpまたは、より正確には、それがリンクする無数の拡張機能とライブラリ-正規の例)には、ある種の非スレッドセーフライブラリ(または非スレッド-安全なコード))であるため、かなり標準のApacheインストールを使用していない限り、プリフォークMPMを使用します。


3
PHPを実行していない限り、ワーカーMPMをお勧めします。ワーカーは、Apacheから推奨されるMPMであり、パフォーマンスの向上とオーバーヘッドの削減を実現します。PHP開発者がスレッドセーフについて聞いたことがないのは、preforkを使用する必要があることだけです。
デビッドパシュリー

16
PHPは長い間スレッドセーフでした。彼らは、他のライブラリが何をするかを制御できないため、プリフォーカーの使用のみを提案しています。他の開発者の不作為に対するPHPの非難をやめます。
アリスターブルマン

3
PHPはスレッドセーフかもしれませんが(疑いはありますが)、リンク先のすべてのライブラリは間違いなくそうではありません。ここでは、かなり大きなPHPアプリケーションをいくつか実行し、2か月ごとにプリフォークからワーカーに切り替えようとしますが、すぐに破損したデータを取得します。
アレクサンダーイワニセビッチ

5
少なくとも関数を変更するENV変数はスレッドセーフではありません。setlocalphp.net/manual/en/function.setlocale.phpはその一般的な例です。
半径

4
注:これらの問題はphp-fpm、FastCGI などを使用してPHPが接続されている場合には当てはまりません。ワーカーMPMは問題ありません。Apacheはスレッドを実行できますが、fpmはすべてのPHP要求を独自のプロセスで実行します。PHP-Thread-safetyの問題mod_phpは、Apacheプロセス内でPHPを実行するの使用を妨げるだけです。
mschuett

13

多数(> 100)の同時接続を提供しながら安全でない拡張機能を実行する従来のソリューションは、fastCGI(mod_fcgid、ネイティブapacheモジュール)でPHPを実行し、Worker MPMを実行するapacheインスタンスからの動的リクエストをプロキシすることです。

これにより、静的コンテンツと動的コンテンツの両方を提供するときに、適度な量のメモリ(4〜8GB)で数百から1000を超える同時接続まで拡張できます。

もちろん、全体的な展開(memcached、ニス)の一部としてフロントエンドキャッシュソリューションも調査する必要があります。

または、apache 2.4とそのネイティブイベント MPM にアップグレードします。これにより、同時実行性が大幅に改善されます(スレッドは、ポーリングを待機せずに、接続時に起動されます)。


イベントのmpmコメントについて詳しく教えてください。mpm-workerと比べてどうですか?
Sirex

ワーカーMPMは既にスレッドベースであったため、起動がはるかに速く、実行が軽くなりましたが、イベントMPMはソケットをポーリングしなくなりました。アクティビティで通知されます。したがって、「イベント」。
アダプター

したがって、トラフィックの多い(13k /秒)サイトでより適切に動作するはずです。
Sirex

6

質問が投稿されてから約3年が経過しましたが、パフォーマンスを向上させるために、PHPを使用している場合でもプリフォークではなくワーカーMPMを使用することをお勧めします。

違いについては、プリフォークはスレッド化されていないため、サーバーは各クライアントリクエストに対してプロセスをフォークします(フォークが応答時間に食い込まないように、新しいリクエストを予測してプリフォークします)。リクエストは別のプロセスのサーバーであるため、通常、メモリとCPUに大きな負担がかかります。ワーカーは、より軽量でメモリ使用率の高いマルチスレッドをもたらします。


2

これはあなたが仕えているものに非常に特有なものです。静的接続をほとんど行わない場合、スレッドはより軽量で高速になります。頻繁に生成される大きなアプリが数個しかない場合、preforkは成熟度と安定性のために優位に立つ可能性があります。必要なものだけをセットアップし、テストして、MPMモジュールを交換し、もう一度試して、どちらがより適しているかを確認してみませんか?


Apache 2.2でMPMを勝手に「スワップアウト」することはできません。コンパイル時に設定されます。
アダプター

aptまたはRPMを使用できます。Debianには、好みのスタイルに応じて、いくつかの異なるApache 2パッケージがあります。
ブレンダンバード

1

それはあなたが持っているトラフィックの種類と種類に必要です。また、最初に、プリフォークとワーカーの主な違いを理解する必要があります。以下の記事があなたの理解に役立つことを願っています! http://slashroot.in/how-is-nginx-different-from-apache


2
答えは、コンテンツへのリンクではなく、コンテンツを持つことが望ましいです。リンクターゲットの内容の概要を提供できれば、それがベストプラクティスです。リンク腐敗が起こります。
sysadmin1138

1
質問は、Apache(nginxのは、Apacheではない)とのpreforkまたはスレッドの相対的なメリット(nginxのは、どちらも使用していない)についてでした
symcbean
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.