2009-09-01 23 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 
       })