繁体   English   中英

限制并发未决请求的因素

[英]Factors limiting concurrent outstanding requests

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

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

我尝试使用提琴手模拟超时响应,以使并发的未完成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)Fiddler显示一个排队请求每秒精确触发一次

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

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

5)我改用begingetresponse,没有区别。

6)我怀疑这是否是提琴手的问题。 我也使用Wireshark捕获流量。 明智地,提琴手会模拟保留的传出请求,并且实际上已收到响应。 实际上没有未解决的请求。 似乎是提琴手正在排队请求。 找到更好的测试方法后,我将编辑/关闭问题

我已经被这个问题困扰了几天了。 如果可以的话,请告诉我任何一种可能性。

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

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

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

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

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

查看有关该主题的另一篇文章:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM