クライアントエンドポイントとサーバーエンドポイントの両方でWCFサービスを使用して、HTTP経由で複数のリモートサーバーからJSONデータを取得しています。私は、データ量が必ずしも増加していなくても、非同期的に開始する連続した要求ごとに、http要求の時間が一般に長くなっていることに気づいています。言い換えれば、私は(機能<を使用して> .BeginInvoke)12個のスレッドプールのスレッドを開始した場合、各要求は、タイムアウトした後に、のような私のログに現れてされていますリモートサービスからJSONデータを同時にダウンロードする
:HttpRequest invoked. Elapsed: 325ms
:HttpRequest invoked. Elapsed: 27437ms
:HttpRequest invoked. Elapsed: 28642ms
:HttpRequest invoked. Elapsed: 28496ms
:HttpRequest invoked. Elapsed: 32544ms
:HttpRequest invoked. Elapsed: 38073ms
:HttpRequest invoked. Elapsed: 41231ms
:HttpRequest invoked. Elapsed: 47914ms
:HttpRequest invoked. Elapsed: 45570ms
:HttpRequest invoked. Elapsed: 61602ms
:HttpRequest invoked. Elapsed: 53567ms
:HttpRequest invoked. Elapsed: 79081ms
プロセスは非常に単純です。私は単純に各リクエストをループで開始してから、統合データを使用する前にすべての操作で.WaitAll()を呼び出しています。
Httpリクエストは、少量のデータでも必要以上に時間がかかるようです。事実、少量と大量のデータの差は最小限に見えます。この種のボトルネックは、同時HTTP要求が帯域幅を共有しなければならないためか、ここでスレッド/コンテキスト切り替えの問題があるのでしょうか?正しい方向を指すように見えるだけです。 -
EDITだけ明確にするためには、私は同じプロセスを実行した同期、ここでの結果です:(その同期のために)上がった
:HttpRequest invoked. Elapsed: 20627ms
:HttpRequest invoked. Elapsed: 16288ms
:HttpRequest invoked. Elapsed: 2273ms
:HttpRequest invoked. Elapsed: 4578ms
:HttpRequest invoked. Elapsed: 1920ms
:HttpRequest invoked. Elapsed: 564ms
:HttpRequest invoked. Elapsed: 1210ms
:HttpRequest invoked. Elapsed: 274ms
:HttpRequest invoked. Elapsed: 145ms
:HttpRequest invoked. Elapsed: 21447ms
:HttpRequest invoked. Elapsed: 27001ms
:HttpRequest invoked. Elapsed: 1957ms
合計時間は、しかし、あなたははっきりと見ることができます個々のリクエストは一般的に高速です。残念ながら、問題を特定する方法はわかりませんが、スレッド間の帯域幅共有に問題があると私は推測しています。むしろ少数のスレッドに
1)私は非スレッドプールのスレッドを使用している場合、これは
2を改善するだろうが)万一Iグループの操作、:
だから私は私が持っているいくつかのより簡単な質問ですそれぞれのリクエストには独自のものがありますか?
3)Httpで同時にデータをダウンロードしようとすると、これは標準的な問題ですか?
私は実際には、複数の同時httpRequestで同じ問題を扱っています。同時に50件のリクエストを送信すると、最初のリクエストは300ミリ秒で返され、最後のリクエストは2000ミリ秒後に返されます。あなたの結果は、何か他のことが起こっていることを示しているようです。あなたの同期テストでは、最初のリクエストは20年後に戻ってきましたか?たぶん、これはサーバ側の問題ですが、これはどのようなサービスですか? –
@Mike Richard、私が投稿した答えで私のリンクを参照してください、それはあなたを助ける必要があります。 –