2011-07-27 2 views
6

クライアントエンドポイントとサーバーエンドポイントの両方で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で同時にデータをダウンロードしようとすると、これは標準的な問題ですか?

+0

私は実際には、複数の同時httpRequestで同じ問題を扱っています。同時に50件のリクエストを送信すると、最初のリクエストは300ミリ秒で返され、最後のリクエストは2000ミリ秒後に返されます。あなたの結果は、何か他のことが起こっていることを示しているようです。あなたの同期テストでは、最初のリクエストは20年後に戻ってきましたか?たぶん、これはサーバ側の問題ですが、これはどのようなサービスですか? –

+0

@Mike Richard、私が投稿した答えで私のリンクを参照してください、それはあなたを助ける必要があります。 –

答えて

0

私は最終的に思い付いたこの質問に対する最良の答えは、このリンクから来た:あな​​たが繰り返し同じserviveメソッドを呼び出している場合は適用され

http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-are-wcf-responses-slow-and-setminthreads-does-not-work.aspx

を。

クライアントとサーバーの両方でThreadPool.SetMinThreads()を調整することで、私は改善された結果を得ることができました。

しかし、私が実際に一番下に達していないWCFやHTTP経由の転送にはまだまだ遅い問題があります。

2

this質問ごとに、同時にいくつのHTTPリクエストを作成できるかを制御する設定があります。また、HttpWebRequestのBeginGetResponseメソッドを使用すると、スレッドの作成よりもコストがかからず、同時ダウンロードが可能になります。例としてはhereをご覧ください。

+0

ありがとうございます。サーバーまたはクライアント、またはその両方のHTTPリクエストの同時設定ですか?また、私は実際にChannelFactory を使用して、WCFサービスを呼び出し、メソッドをサービス契約から名前で呼び出します。 –

+0

ダウンロードを実行しているアプリケーションで設定を変更する必要があります。 – eulerfx

+0

この設定は、HttpWebRequestを使用した場合、またはWCF ChannelFactory コールでも機能する場合にのみ適用されますか?私は、Wcfクライアントに相当する設定があるかどうか調べなければならないかもしれません。 –

2

サービスの並行性モードに関係する可能性があります。 http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspxをチェックし、サービスがシングルスレッドでないことを確認してください。

+0

これは役に立たないようです。私はこれが実際にクライアント上のスレッド問題であるとは確信していないと思います。 –

+0

ThreadPoolは独自のスレッド数を管理します。SetMaxThreads/SetMinThreadsを微調整しない限り、スレッドを同時に実行することはあまりありません。第2に、私はサービス(サーバ側)が実際に何をしているのか調べてみましょう。多分ロックの競合があります(DBアクセス/同じファイルへのアクセスなど) – bkdc

+0

あなたはこの動作がクライアントでは、同時ダウンロードの束は帯域幅を共有する必要があることを考えれば、期待されますか?つまり、1回のダウンロードで900kb/sを打つと、同時にダウンロードするたびにスピードが落ちる可能性があります。それが事実なら私は少し私が行うことができると思うだろう。 –

関連する問題