2009-09-01 24 views
43

我正在测试一个web应用程序的压力,并且已经设置了一个windows测试程序,该程序可以激活多个线程并向每个线程发送一个web请求。并发HttpWebRequests的最大数量

问题是,我得到以下输出:

01/09/09 11:34:04 Starting new HTTP request on 10 
01/09/09 11:34:04 Starting new HTTP request on 11 
01/09/09 11:34:04 Starting new HTTP request on 13 
01/09/09 11:34:05 Starting new HTTP request on 14 
01/09/09 11:34:05 Starting new HTTP request on 11 
01/09/09 11:34:05 11 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 13 
01/09/09 11:34:05 13 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 14 
01/09/09 11:34:05 14 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 11 
01/09/09 11:34:05 11 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 14 
01/09/09 11:34:05 14 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 13 
01/09/09 11:34:05 13 has finished! 
01/09/09 11:34:05 Starting new HTTP request on 15 
01/09/09 11:34:06 Starting new HTTP request on 11 
01/09/09 11:34:06 11 has finished! 
01/09/09 11:34:06 Starting new HTTP request on 14 
01/09/09 11:34:06 14 has finished! 

这看起来有点像有最多5个线程的是,即使我创建100个像这样:

int numberOfThreads = Convert.ToInt32(txtConcurrentThreads.Text); 

    List<BackgroundWorker> workers = new List<BackgroundWorker>(); 

    for (int N = 0; N < numberOfThreads; N++) 
    { 

     BackgroundWorker worker = new BackgroundWorker(); 
     worker.DoWork += new DoWorkEventHandler(worker_DoWork); 
     worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
     workers.Add(worker); 
    } 


    foreach(BackgroundWorker worker in workers) 
    { 
     worker.RunWorkerAsync(); 
    } 

谁能赐教至于发生了什么?

感谢

编辑:如果作为建议我睡5秒,而不是HttpWebRequest的,然后我得到更多的线程射击,但没有那么多,因为我本来期望:

01/09/09 11:56:14 Starting new HTTP request on 7 
01/09/09 11:56:14 Starting new HTTP request on 11 
01/09/09 11:56:15 Starting new HTTP request on 12 
01/09/09 11:56:15 Starting new HTTP request on 13 
01/09/09 11:56:16 Starting new HTTP request on 14 
01/09/09 11:56:16 Starting new HTTP request on 15 
01/09/09 11:56:17 Starting new HTTP request on 16 
01/09/09 11:56:17 Starting new HTTP request on 17 
01/09/09 11:56:18 Starting new HTTP request on 18 
01/09/09 11:56:19 Starting new HTTP request on 7 
01/09/09 11:56:19 7 has finished! 
01/09/09 11:56:19 Starting new HTTP request on 11 
01/09/09 11:56:19 11 has finished! 
01/09/09 11:56:19 Starting new HTTP request on 19 
01/09/09 11:56:20 Starting new HTTP request on 20 
01/09/09 11:56:20 Starting new HTTP request on 12 
01/09/09 11:56:20 12 has finished! 

它仍然看起来我每秒只能开始2个线程,这对我来说似乎很慢。我想Console.WriteLine可能是一个问题?

编辑:我设置

ThreadPool.SetMinThreads(100, 4); 

System.Net.ServicePointManager.DefaultConnectionLimit = 100; 

,并得到了以下结果:

01/09/09 14:00:07 Starting new HTTP request on 11 
01/09/09 14:00:07 Starting new HTTP request on 81 
01/09/09 14:00:07 Starting new HTTP request on 82 
01/09/09 14:00:07 Starting new HTTP request on 79 
01/09/09 14:00:07 Starting new HTTP request on 83 
01/09/09 14:00:07 Starting new HTTP request on 84 
01/09/09 14:00:07 Starting new HTTP request on 85 
01/09/09 14:00:07 Starting new HTTP request on 87 
01/09/09 14:00:07 Starting new HTTP request on 88 
... 
01/09/09 14:00:07 84 has finished! Took 323.0323 milliseconds 
01/09/09 14:00:08 88 has finished! Took 808.0808 milliseconds 
01/09/09 14:00:08 96 has finished! Took 806.0806 milliseconds 
01/09/09 14:00:08 94 has finished! Took 806.0806 milliseconds 
01/09/09 14:00:08 98 has finished! Took 801.0801 milliseconds 
01/09/09 14:00:08 80 has finished! Took 799.0799 milliseconds 
01/09/09 14:00:08 86 has finished! Took 799.0799 milliseconds 
01/09/09 14:00:08 92 has finished! Took 799.0799 milliseconds 
01/09/09 14:00:08 100 has finished! Took 812.0812 milliseconds 
01/09/09 14:00:08 82 has finished! Took 1010.101 milliseconds 

所以能够同时推出一大堆的Web请求。这似乎排队(呼叫到一个STA COM +服务器),这就是我的预期。

感谢您的帮助

+1

我有一个问题,你的在这里解决。根据msdn(https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit(v=vs.110).aspx),默认值是最大的int32,这是更大的方式你在这里设定的100以上。即使你没有把它设置为100,它又会如何变化?我的意思是,如果通过设置ServicePointManager的默认连接限制或通过在第一个答案中设置connectionManagement元素来解决问题,我会怀疑。 – foxwendy 2015-08-21 14:20:48

+1

@foxwendy是的,MSDN说这是。 int.MaxValue,当我在.NET 4.5中尝试它时,它仅仅是** 2 **。 – xmedeko 2015-12-11 16:12:24

回答

56

是你的请求任何机会去同一个主机的所有(或大部分)?每个主机都有一个内置的限制。您可以在system.Net connectionManagement元素的app.config中更改此设置。

另一件事是线程池只逐渐增加其线程数 - 每半秒启动一个新线程,IIRC。这可能是你所看到的吗?尝试摆脱HttpWebRequest的方程 - 只是睡几秒钟,而不是...

我怀疑后一个问题是你最初遇到的问题,但第一个问题会导致你的问题,因为好。

+0

是的,他们都会去localhost。 – Duncan 2009-09-01 10:53:39

+0

我不知道限制是否适用于本地主机...但它绝对是要注意的事情。查看我的编辑链接到appropraite app.config元素。 – 2009-09-01 10:56:35

+0

谢谢,会做。 – Duncan 2009-09-01 11:00:41

48

并发传出HTTP连接的数量有限制。我认为你可以通过在创建HttpWebRequest对象之前使用System.Net.ServicePointManager.DefaultConnectionLimit静态属性来控制它。

+0

如果有人很好奇,这个设置的默认值是2 – 2018-01-17 16:22:22

1

如果我在windows config下面写下标签,那么每次执行下面的代码时都会执行它。所以每次下面的代码执行,我将被允许有最大1000000没有并行请求/响应。

HttpWebRequest POSTRequest = (HttpWebRequest)WebRequest.Create("http://yahoo.com"); 

标签

<connectionManagement> 
<clear/> 
<add address="*" maxconnection="1000000" /> 
</connectionManagement> 
3

我还没有听说这个对.NET的核心。ServicePointManager不包括在.NET核心1,但似乎在第2版再回来然而,对于HttpClient的,你还可以设置最大连接数是这样的:

new HttpClient(new HttpClientHandler 
       { 
        MaxConnectionsPerServer = 100 
       })