我正在尝试实现每秒大量的网络请求。
使用C#,我使用多个线程发送webrequest,发现无论我创建多少线程,在服务器快速响应的情况下,最大webrequest数是每秒70个左右。
我尝试使用 fiddler 模拟超时响应,以使并发的未完成 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)提琴手显示一个排队的请求恰好每秒触发一次
3)我使用 apache 基准测试工具尝试发送并发超时请求并发生同样的事情。不太可能是 .Net 问题。
4)我尝试连接到本地主机。没有不同
5)我用 begingetresponse 代替,没有区别。
6)我怀疑这是否是提琴手问题。我也使用wireshark来捕获流量。明智地,持有的传出请求由提琴手模拟,并且实际上收到了响应。实际上没有未完成的请求。似乎是提琴手排队请求。找到更好的测试方法后,我将编辑/关闭问题
我已经被这个问题困住了几天了。如果您能想到,请告诉我任何一种可能性。