
数年前、Amazon EC2を紹介したとき、Ubuntu 10.04 LTSを搭載したMicroInstanceが起動しました。 Apacheを提起し、MODx Revolutionブログを含むいくつかの仮想ホストを構成しました。 自由な時間がここに落ち、私は読者の群衆が突然私の隠されたブラジクに出くわしたらどうなるかと思いました。 一般に、彼女から逃げる場所はありませんが、ニュース映画「私はすべてを知りたい」を繰り返し見て彼女の幼少期に教え込んだ知識の精神は忘れられませんでした。 私はまだ負荷の高いプロジェクトに参加することができなかったので、ネットワーク上の資料の少しの調査が行われました。 ブログからブログへ、声明は、Nginxを支持してApacheの使用を放棄する必要があるというローミングです。 Apacheプロジェクトの歴史とその周辺の開発者のコミュニティを考えると、この声明は私には奇妙に思えました。 Apache開発者はどこでもprefork宣誓の問題を解決できませんか? これは本当にそうだから私は見つけることを決めた。 カットの下の結果について読んでください。
準備する
このトピックをより詳細に検討した結果、ApacheにはMPM(マルチプロセッシングモジュール)プリフォークに加えて、mpm-workerモジュールとmpm-eventモジュールがあり、複数のユーザーからのリクエストを1つのプログラムストリームで処理します。 mpm-eventおよびmpm-preforkモジュールは、fastcgiを介してphpと通信します。 彼らの仕事をnginxと比較し、それが決定されました。
まず、Apacheがプリフォークモードで多数のリクエストを処理する方法を確認することにしました。 40スレッドの包囲ユーティリティが起動されました。 Apacheは多くのプロセスを作成し、ログはメモリオーバーフローに関するメッセージでいっぱいになりました。 その後、サーバーは再起動時に5分間の反応を待つことに成功しなかったため、このインスタンスではサーバーが使用できなくなり、終了する必要がありました。 古いインスタンスが接続された新しいインスタンスが作成されました。 その結果、メモリ容量が630MBのEC2 MicroInstanceで次の設定が最適であることが実験的に確立されました。
<IfModule mpm_prefork_module> StartServers 3 MinSpareServers 3 MaxSpareServers 7 MaxClients 27 MaxRequestsPerChild 3000 </IfModule>
これで、制御を失うことを恐れずにサーバーをロードできました。
次の構成をテストすることが決定されました。
- mod_phpを使用したApache mpm-prefork
- mod_php + nginxリバースプロキシを使用したApache mpm-prefork
- php-fpmを使用したnginx
- php-fpmを使用したApache mpm-worker
- php-fpmを使用したApache mpm-event
テスト中に、mpm-preforkモードのapacheがphp-fpmで動作するのを妨げるものはないと考え、この設定もテストに追加されました。
この記事で使用されている構成のインストール方法については説明しませんが、この情報はインターネットで簡単に見つけることができます。 多くのハウツーでは、mpm-workerまたはmpm-eventをphpにバンドルすると同じエラーが重複することに注意してください。つまり、パッケージマネージャーのコマンドでは、php5パッケージをインストールするよう指示されています。
まず、Webサーバーが耐えられるリクエストの数に興味がありました。 そのため、テストにはSiegeユーティリティを使用することにしました。 JMeterで実験した結果、特定のイベントに対する反応時間を決定するのに適しているという結論に達しました。 したがって、Siege Utilityの出力から私が興味を引く主なパラメーターは、Availablilityです。 これに基づいて、Siegeユーティリティのパラメーターは、可用性が100%未満であるが、小さすぎないように選択されました。 すべてのテストで、スレッド数20(-c)繰り返し数20(-r)ベンチマーク(-b)モードを使用しました。
テスト結果を処理するために、siegeユーティリティによって表示される結果が入力されたテーブルにExcelファイルが作成されました。 5つのテストの結果によると、算術平均と算術平均の標準誤差が見つかりました。 可用性図は、さまざまな構成用に構築されています。
必要な数のテストを実行し、Excelでのコピーペーストの包囲出力の結果を処理する簡単なスクリプトが作成されました。
スクリプトパラメータは、サイトマップから生成されたURLファイルであり、これらのテストの場合の反復回数は常に5でした。前の反復のすべてのキューを完了するには、スリープ60が必要です。
その過程で、CloudFlareをCDN Webサイトに接続し、同時にこのサービスがWebサーバーの負荷容量にどのように影響するかを確認することにしました。 これを行うには、直接サイトアドレスを持つサブドメインがDNS CloudFlareに追加され、仮想ホスト設定にエイリアスが追加されました。 サイトに直接アクセスするための別のURLファイルが作成されました。
結果
この
ファイルで詳細なテスト結果を確認でき
ます 。 ここでは図のみを示します。


CloudFlareを介したapache mpm-preforkの一般的な傾向から際立っている理由は明らかではありません。
得られた結果には、各パスの値に大きなばらつきがあるために大きな誤差があったため、ローカル仮想マシンで追加のテストを実施することにしました。 このため、Ubuntu 10.04 LTSゲストシステムはVirtualBox上に作成され、EC2 MicroInstance(1vCPU、630MB、8GB)と同じパラメーターが使用されています。 同様の障害率を得るために、仮想マシンで利用可能な最大プロセッサー負荷を7%(Intel Core i7 2.8 GHz)に制限しました。 このテストの詳細な結果は、この
ファイルに記載されてい
ます 。

結果の比率は、CloudFlareによるテストと同様です。
結論
- 多くのマニュアルで推奨されているApacheとNginxの組み合わせは、サイトに静的リソースがほとんどない場合、リバースプロキシでは望ましい結果が得られないためです。
- Apacheは、mpm-preforkモジュールの代わりにmpm-workerまたはmpm-eventモジュールをインストールすることにより、Nginxと正常に競合できます。
- Apacheは、mpm-preforkモジュールを使用している場合でもNginxと競合できます。fastcgiを介してphp-fpmを使用する必要があります。
- mpm-preforkモジュールを使用する場合、システムのリソースに応じてプロセス数を制限することを忘れないでください。
- CDN CloudFlareを無料のレートで使用しても、負荷容量の顕著な増加はありません。 サイトに完全にアクセスできない場合、CloudFlareはリクエストされたページの保存された「スナップショット」を提供することをプラスと見なすことができます。
