3

これについては非常に具体的にしようと思います。簡単ではないので、フォローしてみてください。

NGINX上のPHPで実行されるスクリプトがあります-PHP-fpmFastCGI。このスクリプトは、アクセスしようとしているユーザーから情報を取得し、リアルタイムでいくつかのアルゴリズムを実行します。バックグラウンドで実行されているスケジュールされたプロセスにすることはできません。場合によっては、ページの読み込みに5〜12秒かかることもありますが、問題ありません。通常、ユーザーからデータを収集し、サードパーティのサーバーにいくつかの送信リクエストを送信し、データを収集して分析し、ユーザーに応答を返します。

問題は、このスクリプトを実行しているユーザーが多く、サーバーが非常にビジー状態になることです。これらのユーザーはすべてサーバー上でアクティブな接続であり、応答を待っているためです。1台のロードバランサーで2台のサーバーを実行していますが、それだけでは不十分です。サーバーには、一度に1,500を超えるアクティブな接続がある場合があります。これらのサーバーがその時間枠でどのように応答するかを想像できます。

私は解決策を探しています。LBにサーバーをどんどん追加することはできますが、それが唯一の解決策であるというのはばかげているように聞こえます。私たちはそのスクリプトを実行し、最大限に最適化しました。私はあなたに約束することができます-ライブトラフィックで私たちに応答するのに時間がかかるサードパーティのサーバーに依存しているため、そのスクリプトを長時間実行するための実際の解決策はありません。

このスクリプトをそのままにしておくために考えられる解決策はありますか?しかし、どういうわけか、これらのアクティブな接続がサーバー全体の機能に与える影響を減らすことができますか?時々、彼らは単に応答するのをやめます。

読んでいただきありがとうございます!

4

3 に答える 3

3

3 か月前の質問ですが、次のように考えずにはいられません。

  1. サードパーティ サーバーへのすべてのリクエストに対するネットワーク作業の合計と、対応する PHP スクリプト内の応答の処理が、ハードウェアの制限よりもはるかに低いことが確実な場合。

  2. PHP スクリプトは、すべての応答がサードパーティ サーバーから返されるまで非効率的にビジー ループを繰り返している可能性があります。

私がそのような問題を扱っていた場合、私は次のようにします。

  1. PHP スクリプトがとにかくそれを待っているので、カスタムの外部 C++ curl の使用を停止します。

  2. Google で、PHP の curl-multi 実装の非ビジー ループの使用法について調べてください。

これが理にかなっていることを願っています。

于 2012-11-04T19:54:50.723 に答える
1

私のアドバイスは、リクエストの制限付きタイムアウトを設定し、サードパーティのリクエストごとに非同期リクエストを使用することです。

たとえば、ページで 5 つのサードパーティ リクエストの結果を表示する必要があるとします。つまり、スクリプト内で5 回cURL以上呼び出しますfile_get_contentsが、サード パーティからのタイムアウトごとにスクリプトがフリーズします。一歩一歩。つまり、リクエストごとに応答を 10 秒待たなければならない場合、合計で 50 秒かかることになります。
User calls the script -> script wait to end -> server is loaded for 50 seconds

ここで、サードパーティへの各リクエストが非同期で送信される場合、スクリプトの読み込み時間が最大リクエスト遅延まで短縮されます。したがって、寿命が短くなる小さなスクリプトはほとんどなく、サーバーの負荷が軽減されます。
User calls the script -> script is loaded -> requests are sent -> there are no scripts that are waiting for the response and consuming resources of your server

AJAXがあなたと共にありますように!;)

于 2012-08-05T15:17:31.333 に答える