2012-12-13 22 views
11

PHPでcurl_multi_ *関数を使用して1000回のcURLリクエストを実行するスクリプトがあります。によって設定されたcURL接続の最大数はいくらですか?

タイムアウトの後ろにあるボトルネックは何ですか?

CPU使用率ですか?これを行うには、アウトバウンド接続の数がサーバーによってどのように処理されるかに関して、より効率的な方法がありますか?

私は機能を変更できません。要求自体はリモートAPIへの単純な呼び出しです。私は限界が何であるか疑問に思っています。サーバやApacheの接続やCPUのメモリを増やす必要がありますか? (または私が逃した何か他のもの)

+0

Linuxのボックスにファイルの制限が表示されています(使用しているユーザーとして 'ulimit -a'を実行してください、それはあなたの手当です)。それとは別に、ボトルネックがネットワークになる可能性があります。私はCPUが気になることを疑う... – Wrikken

+0

オープンファイルの制限をどのように制御しますか? (私はこれについてはあまり知らない!) –

+1

[スタックオーバーフローが提供する](http://stackoverflow.com/questions/34588/how-do-i-change-the-number-of-open-files-limit-in -linux) – Wrikken

答えて

10

あなたのリクエストは1回の実行スレッドで行われます。ボトルネックはほぼ確実にCPUですが、実際にカールするマルチコードを見たことがありますか? ...それは信じられないほどCPUが空腹です。あなたは本当にリクエストを処理するのに十分なコントロールを持っていないからです。 curl_multiを使用すると、一度に1000件のリクエストをオーケストレーションすることができますが、これは良い考えではありません。実行フローを細かく制御することができないため、curl_multiを効率的に使用する機会はほとんどありません。ソケットを処理してselect()を実行するだけで、あなたのコードを見ているCPU使用率が高くなりますコマンドライン。

このようなタスクでCPU使用率が高い理由は次のとおりです。 PHPは数分の1秒間動作するように設計されており、できる限り速く実行します。それは、そのような短い時間のため、CPUがどのように利用されているかは関係ありません。このようなタスクを長くすると、問題がより明らかになり、すべてのオペコードで発生するオーバーヘッドがプログラマに見えるようになります。

あなたは実装を変更できないと言ってきましたが、まだ完全な回答があると思います。このようなタスクは、カールマルチよりスレッディングのためにはるかに適しており、そしてあなたも、1000件のスレッドがcurl_multi限りCPUを消費するアイドル状態のCPU上で自分のデバイスに左http://php.net/Thread

で始まる​​を、読み始める必要があり、その点はあります応答のすべてのバイトをダウンロードし、要求のすべてのバイトをアップロードするコードを正確に制御でき、CPU使用量が懸念される場合は、usleepを明示的に呼び出すか、意味のある方法で接続の使用を制限することによって "素敵な"さらに、リクエストは別のスレッドで処理できます。

私は1000スレッドを行うことをお勧めしません、それはおそらくではないです。するべきことは、 "いい"効率的な方法でリクエストを作成してサービスすることを仕事とするスタッカブル(文書を参照)を設計し、ワーカーの設計プール(github/pecl拡張ソースの例を参照)を実行することです新しく設計されたリクエスト...

+0

これはPHPの問題であり、カールしません。 LibCurlは、10000並列要求に拡張できます。それは問題を引き起こす次の大きさです。 – Lothar

関連する問題