限制并发未完成请求的因素

本文关键字:请求 未完成 并发 | 更新日期: 2023-09-27 18:36:19

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

使用

C#,我使用多个线程来发送 webrequest,并发现无论我创建了多少线程,在服务器快速响应的情况下,WebRequest 的最大数量约为每秒 70 个。

我尝试使用提琴手模拟超时响应,以便发出并发未完成的 Web 请求,以便更好地理解。

无论线程数量如何,都会立即触发 2 倍的请求,之后,排队的请求一个接一个地触发,尽管以前的请求仍在获得响应。完成请求后,排队的请求会更快地触发以补充数量。就像达到预先初始化的金额后需要时间来初始化一样。此外,响应足够小,可以忽略带宽问题。

下面是代码。

我在不同的网络中尝试了窗口xp和窗口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来捕获流量。明智地,小提琴手模仿了保留的传出请求,并且实际上收到了响应。实际上没有未完成的请求。似乎是小提琴手在排队请求。找到更好的测试方法后,我将编辑/关闭问题

我已经陷入这个问题几天了。如果你能想到,请告诉我任何一种可能性。

限制并发未完成请求的因素

最后,由于小提琴手的实现,我发现我的测试不准确。由于未知原因,请求在 2 倍未完成的请求后排队。

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

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

直接创建线程会产生大量开销。尝试使用任务工厂而不是线程。 任务在后台使用 ThreadPool,它重用线程而不是连续创建线程。

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

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

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