我试图每秒获得大量的webrequests。
使用C#,我使用多个线程发送webrequest并发现无论我创建了多少线程, 在服务器快速响应的情况下,webrequest的最大数量大约为每秒70个。
我尝试使用fiddler模拟超时响应,以便使并发的Web请求更好地理解。
无论线程数量多少,都会立即触发2x请求,之后,虽然之前的请求仍然得到响应,但排队请求却一个接一个地逐个触发。完成请求后,排队的请求会更快地启动以补充金额。就像一旦达到预先初始化的量就需要时间来初始化。此外,响应足够小,可以忽略带宽问题。
以下是代码。
我在不同网络中的窗口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)Fiddler表明一个排队的请求每秒都会被触发
3)我使用apache基准测试工具尝试发送并发超时请求并发生同样的事情。不太可能是.Net问题。4)我尝试连接到localhost。没有区别
5)我使用了begingetresponse而没有区别。
6)我怀疑这是否是小问题。我也使用wireshark捕获流量。明智地,持有的传出请求由提琴手模拟,并且实际上收到了响应。 实际上没有未完成的请求。似乎小提琴排队请求。在找到更好的方法进行测试后,我会编辑/关闭问题
我已经在这个问题上坚持了好几天了。如果你能想到,请告诉我任何一种可能性。
答案 0 :(得分:1)
最后,由于fiddler的实现,我发现我的测试不准确。由于未知原因,请求在2X个未完成请求后排队。
我设置了一个服务器并限制其带宽以模拟超时响应。
使用wireshark,我可以看到,一旦我的线程准备就绪,就可以在1.4s左右发送150个SYN。
答案 1 :(得分:0)
直接创建Threads会产生很多开销。尝试使用Task factory而不是Thread。任务使用ThreadPool,它重用线程而不是连续创建它们。
for (int i = 0; i < 80; i++)
{
int copy = i;
Task.Factory.StartNew(() =>
{
submit_test(copy);
});
}
查看关于该主题的其他帖子:
Why so much difference in performance between Thread and Task?