[英]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.