限制并发未完成请求的因素
本文关键字:请求 未完成 并发 | 更新日期: 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);
});
}
查看有关该主题的其他帖子:
为什么线程和任务之间的性能差异如此之大?