1

我正在尝试实现每秒大量的网络请求。

使用C#,我使用多个线程发送webrequest,发现无论我创建多少线程,在服务器快速响应的情况下,最大webrequest数是每秒70个左右。

我尝试使用 fiddler 模拟超时响应,以使并发的未完成 Web 请求有更好的理解。

无论线程数量如何,都会立即触发 2x 请求,然后,排队的请求会非常缓慢地一个一个触发,尽管之前的请求仍然得到响应。一旦有完成的请求,排队的请求就会更快地触发以补充数量。一旦达到预初始化的数量,它就像需要时间来初始化一样。此外,响应小到可以忽略带宽问题。

下面是代码。

我在不同网络中的 windows xp 和 windows 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)提琴手显示一个排队的请求恰好每秒触发一次

3)我使用 apache 基准测试工具尝试发送并发超时请求并发生同样的事情。不太可能是 .Net 问题。

4)我尝试连接到本地主机。没有不同

5)我用 begingetresponse 代替,没有区别。

6)我怀疑这是否是提琴手问题。我也使用wireshark来捕获流量。明智地,持有的传出请求由提琴手模拟,并且实际上收到了响应。实际上没有未完成的请求。似乎是提琴手排队请求。找到更好的测试方法后,我将编辑/关闭问题

我已经被这个问题困住了几天了。如果您能想到,请告诉我任何一种可能性。

4

2 回答 2

1

最后,我发现由于 fiddler 的实现,我的测试不准确。由于未知原因,请求在 2X 未完成的请求之后排队。

我设置了一个服务器并限制其带宽以模拟超时响应。

使用wireshark,我可以看到只要我的线程准备好,就可以在大约1.4秒内发送150个SYN。

于 2013-11-06T14:22:19.993 回答
0

直接创建线程有很多开销。尝试使用任务工厂而不是线程。任务在后台使用 ThreadPool,它重用线程而不是不断地创建它们。

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

查看有关该主题的其他帖子:

为什么线程和任务之间的性能差异如此之大?

于 2013-11-03T16:22:30.617 回答