1

1 秒あたりの Web リクエスト数を多くしようとしています。

C# では、複数のスレッドを使用して webrequest を送信しましたが、作成したスレッドの数に関係なく、サーバーが迅速に応答する条件では、webrequest の最大数は 1 秒あたり約 70 であることがわかりました。

未処理の同時 Web リクエストを作成して理解を深めるために、フィドラーを使用してタイムアウト応答をシミュレートしようとしました。

スレッドの数に関係なく、2x のリクエストが即座に起動され、その後、キューに入れられたリクエストが 1 つずつ非常にゆっくりと起動されましたが、前のリクエストはまだ応答を取得していました。要求が完了すると、キューに入れられた要求がより速く起動され、量が補充されました。事前に初期化された量に達すると、初期化に時間がかかるようです。さらに、応答は十分に小さいため、帯域幅の問題は無視できます。

以下はコードです。

別のネットワークでwindow xpとwindow 7で試しました。同じことが起こります。

public Form1()
{
System.Net.ServicePointManager.DefaultConnectionLimit = 1000;
for (int i = 0; i < 80; i++)
{
    int copy = i;
    new Thread(() =>
    {
        submit_test(copy);
    }) { IsBackground = true }.Start();
}
}
public void submit_test(int pos)
{
    webRequest = (HttpWebRequest)WebRequest.Create("http://www.test.com/");
    webRequest.Method = "GET";
    using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
    {
    }
}

即時発射量を制限しているのはネットワークカードですか?

大規模なサーバーでは、何千もの着信要求を同時に処理できることを知っています。リクエストを送る(接続を確立する)のと同じではないですか?

サーバーを使用すると問題が解決するかどうか教えてください。

更新の手がかり:

1) ルーターが制限してプラグを抜いたのではないかと思います。変わりはない。

2) Fiddler は、キューに入れられた 1 つのリクエストが 1 秒ごとに正確に発生したことを示しています

3) Apache ベンチマーク ツールを使用して同時タイムアウト リクエストを送信しようとしたところ、同じことが起こりました。おそらく .Net の問題ではありません。

4) 代わりに localhost に接続しようとしています。変わりはない

5) 代わりに begingetresponse を使用しましたが、違いはありません。

6) これはフィドラーの問題ではないかと思います。トラフィックをキャプチャするためにwiresharkも使用しています。賢明なことに、保留された送信要求はフィドラーによってエミュレートされ、実際に応答が受信されました。実際には未処理のリクエストはありません。リクエストをキューに入れているのはフィドラーのようです。テストするためのより良い方法を見つけたら、質問を編集/閉じます

私はすでに数日間この問題に悩まされていました。考えられる可能性があれば教えてください。

4

2 に答える 2

0

スレッドを直接作成すると、多くのオーバーヘッドが発生します。スレッドの代わりにタスク ファクトリを使用してみてください。タスクは内部で ThreadPool を使用します。これは、スレッドを継続的に作成するのではなく、スレッドを再利用します。

        for (int i = 0; i < 80; i++)
        {
            int copy = i;
            Task.Factory.StartNew(() =>
            {
                submit_test(copy);
            });
        }

このトピックに関するこの他の投稿をチェックしてください。

スレッドとタスクのパフォーマンスに大きな違いがあるのはなぜですか?

于 2013-11-03T16:22:30.617 に答える