1

私はパブリック API のパフォーマンス テストを並行して同時呼び出しでロードすることで忙しくしています。以下のコード。

int batchSize = 10;

ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = batchSize;

Parallel.For(0, batchSize, parallelOptions, j =>
{
    Debug.WriteLine("Thread began at " + DateTime.Now.ToLongTimeString());

    using (WebClient client = new WebClient())
    {
        Stopwatch sw = Stopwatch.StartNew();
        byte[] arr = client.DownloadData("http://myapiurl/webservice.svc");
        sw.Stop();

        Console.WriteLine(sw.ElapsedMilliseconds.ToString());
    }
});

しかし、私は奇妙な結果を得ています:

  • デバッグ出力から、すべてのスレッドが (予想どおり) まったく同時に開始されていることがわかります。

  • また、Web サービス内からの API 呼び出しの処理にかかった時間も記録しています (これはログ テーブルに保存されます)。各呼び出しにはほぼ同じ時間がかかります... 約 2.5 秒。

  • しかし、現在、コンソール出力は相関していません。Web サービスが記録するものよりもわずかに長いだけだと思います。出力:

2883 
2914 
5653 
5822 
8000 
8250 
10215 
10539 
11622 
12494

これには、次のような理由が考えられます。

  • それWebClient.DownloadData自体のインスタンス間で私のリクエストをキューに入れているかのようです。

  • IIS が Web 要求をキューに入れています。API に他に何もヒットしていないため、これは不可能です。

4

1 に答える 1

3

すべての HTTP 要求は、さまざまなホストへの接続のプールを管理する ServicePointManager によって調整されます。ホストごとの同時接続 (したがって HTTP 要求) には制限があります。これは、次の呼び出しで増やすことができます。

ServicePointManager.FindServicePoint("http://myapiurl/webservice.svc")
    .ConnectionLimit = 100; //arbitrary value

WebClientまた、要求が非同期に発行される前に DNS ルックアップが同期的に行われるため、HttpWebRequest の .Net 実装 (これが使用するもの) が完全に非同期になることはあり得ないことも覚えておく価値があります。私は常に、これは高性能の http リクエスト (特にスパイダー/クロールのシナリオ) を妨げる、完全に遅れた設計上の決定であると考えてきました。

于 2013-09-25T12:57:49.123 に答える