4

質問があります。私は128mbvpsを所有しており、1日あたりわずか100ヒットのシンプルなブログを持っています。nginx+php5-fpmをインストールしています。訪問数が少なく、RAMが少ないことを考慮して、1台のサーバーを実行してfpmを静的に設定することにしました。30分以上続くhttpを介してphpスクリプトを実行するなどのランダムなテストを行っているときに、同じマシンでブログを開こうとしたところ、サイトに基本的にアクセスできないことに気付きました。だから私は構成に行き、これを読んだ:

     The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; **This value sets the limit on the number of simultaneous requests that will be
; served**

私が最もショックを受けたのは、PHPの子がhttpサーバーのように同時に何百ものリクエストを処理することを常に想定していたため、私が知らなかったことです。うまくいきましたか?たとえば、2つのphp-fpmの子を起動し、同時に2つの「長いスクリプト」を起動すると、同じphpバックエンドを使用するすべてのサイトにアクセスできなくなります。これはどのように使用できますか?あなたは考えるかもしれません:-duh!phpスクリプト(Webページ)は通常100msで処理されます-...それは間違いありませんが、それぞれ約10秒間実行できるページがあり、5台のサーバーでphp-fpmを使用する訪問者が10人いる場合はどうなりますか?同時に5つのリクエスト?それらはすべてキューに入れられますか、それともタイムアウトが発生しますか?

私は正直に言って、Apacheとmod_phpを使用してWindowsでサイトを実行することに慣れています。これらの制限は、PHPの別の使用方法では適用されないため、これらの問題は発生しませんでした。

これはまた別の問題を提起します。sleep(20)を使用したfile_1.phpとエコーのみを使用したfile_2.phpがある場合、fastcgiマシンでfile_1を実行してからfile_2を実行すると、2番目のファイルは4MBのRAMを使用してphp要求を処理する別のサーバーの作成を要求します。 。apache / mod_phpで同じことを行うと、2番目のファイルは(apacheサーバーで)30KB多くのRAMのみを使用します。これを考慮すると、使用されるRAMが実際に少ない場合、mod_phpが「悪者」を考慮しているのはなぜですか...ここで全体像を見逃していることはわかっています。

4

1 に答える 1

19

あなたは基本的にそれを正しく持っています。静的な数のワーカーを構成しました(そしてその数は「1」でした)-それがまさにあなたが得たものです。

しかし、次のように言うので、物事が通常どのように機能するかを完全には理解していません。

私はいつも、PHPの子がhttpサーバーのように同時に何百ものリクエストを処理すると思っていました!

私はnginxにあまり詳しくありませんが、apacheでの典型的なmod_phpのセットアップを検討してください。mod_phpを使用している場合は、apacheにpreforkmpmを使用しています。したがって、すべての同時httpリクエストは、個別のhttpdプロセス(スレッドなし)によって処理されます。低メモリ用にapache/mod_phpサーバーを調整している場合は、apache設定を微調整して、生成されるプロセス(特に、MaxClients)の数を制限する必要があります。

このような調整に失敗すると、トラフィックが急増すると、apacheが大量の重いプロセスを生成し始め(mod_phpであるため、各httpdプロセスにPHPインタープリター全体が埋め込まれていることを忘れないでください)、メモリが不足します。 、そしてすべてがスワッピングを開始し、サーバーが煙を出し始めます。

適切に調整されると(つまり、プロセスに必要のないメモリを割り当てるのではなく、リクエストを無視するように調整されます)、クライアントはタイムアウトになりますが、トラフィックが落ち着くと、通常の状態に戻ります。

これをfpmや、apache-workerやnginxなどのよりスマートなWebサーバーアーキテクチャと比較してください。これで、httpリクエストを処理するためのはるかに大きなスレッドプール(まだ構成可能です!)と、PHPを必要とするリクエストだけを処理するためのphp-fpmプロセスの個別のプールができました。基本的に同じことです。作成できるプロセス/スレッドの数に制限を設定しないと、問題が発生します。ただし、PHPを使用するリクエストはごく一部であるため、調整を行うと先に進みます。したがって、基本的に、httpリクエストごとに必要なメモリの平均量は少なくなります。したがって、同じ量のメモリでより多くのリクエストを処理できます。

ただし、数値を「1」に設定するのは極端すぎます。「1」では、静的または動的のどちらを選択しても問題ありません。どちらの方法でも、php-fpmプロセスが1つしかないためです。

したがって、特定の質問に明確な答えを与えることを試みるには:

あなたは考えるかもしれません:-duh!phpスクリプト(Webページ)は通常100msで処理されます-...それは間違いありませんが、それぞれ約10秒間実行できるページがあり、5台のサーバーでphp-fpmを使用する訪問者が10人いる場合はどうなりますか?同時に5つのリクエスト?それらはすべてキューに入れられますか、それともタイムアウトが発生しますか?

はい、それらはすべてキューに入れられ、最終的にはタイムアウトになります。ただし、実行に10秒かかるスクリプトが定期的にあるという事実が、ここでの本当の原因です。それを中心に設計する方法はたくさんありますが(キャッシング、ワークキューなど)、適切なソリューションは、実行しようとしていることに完全に依存します。

私は正直に言って、Apacheとmod_phpを使用してWindowsでサイトを実行することに慣れています。これらの制限は、PHPの別の使用方法では適用されないため、これらの問題は発生しませんでした。

それらは適用されます。nginx/php-fpmの場合と同じ方法でapache/mod_phpサーバーを設定できます。apacheのMaxClientsを1に設定するだけです!

これはまた別の問題を提起します。sleep(20)を使用したfile_1.phpとエコーのみを使用したfile_2.phpがある場合、fastcgiマシンでfile_1を実行してからfile_2を実行すると、2番目のファイルは4MBのRAMを使用してphp要求を処理する別のサーバーの作成を要求します。 。apache / mod_phpで同じことを行うと、2番目のファイルは(apacheサーバーで)30KB多くのRAMのみを使用します。これを考慮すると、使用されるRAMが実際に少ない場合、mod_phpが「悪者」を考慮しているのはなぜですか...ここで全体像を見逃していることはわかっています。

特にLinuxでは、メモリ使用量を報告する多くのことが非常に誤解を招く可能性があります。しかし、このように考えてください。30kbはごくわずかです。これは、いくつかのhttpdプロセスが開始されたときに、PHPのメモリのほとんどがすでに割り当てられているためです。

128MB VPSはかなりタイトですが、複数のphpプロセスを処理できるはずです。

最適化する場合は、次のようにします。

PHPの場合:

pm = static
pm.max_children=4

nginxの場合、プロセスとスレッド数を制御する方法を理解します(apacheのMaxClients、StartServers、MinSpareServers、MaxSpareServersに相当するものは何でも)

次に、現実的な負荷(apachebench、siege、jmeterなど)を生成する方法を理解します。vmstat、、をfree使用しtopて、メモリ使用量を監視します。pm.max_childrenとnginxのものを調整して、大幅なスワップを発生させずに可能な限り高くします(によるとvmstat

于 2012-05-21T01:54:56.643 に答える