所以我創建它使用一個HTTP API來獲取每個大約〜50000帳戶的狀態的應用程序。代碼循環遍歷每個帳戶,併爲其發送HTTP請求。當我收到http請求的響應時,根據一些標準,我創建一個新線程來管理該帳戶。瓶頸3000+線程.NET應用程序(HttpWebReqsuest.BeginGetResponse)
現在通常,我可以很容易地發送出大約每秒1K的請求,但一旦我打〜3100的活動線程,http請求循環開始減速和冷凍每秒只有約1請求。然後它突然跳回到每秒3k,然後凍結幾秒鐘......等等。重要的是它看起來不像是逐漸退化。它發生得非常突然。
很明顯,某處存在瓶頸,但我不確定在哪裏。我已確定TCP參數(可用端口的最大數量)設置爲高限。我有servicepoint.defaultconnection限制設置爲int.maxvalue。
我的CPU是帶有專用1Gbps的4核(帶HT的8線程)。我正在考慮轉向更大的(32核心2x CPU)機器。但我不確定它是否會有任何好處。我想知道是否有人知道我可能遇到的其他瓶頸。
我甚至接近用盡我的全部帶寬或存儲,我知道這是不是有問題。
這大致就是我的代碼看起來像
Sub Main()
While 1
For each account As Account in GetAccountsFromDatabase()'~50K Accounts
dim request = HttpWebRequest.Create("http://api.com?id=" & account.name)
request.BeginGetResponse(New AsyncCallback(AddressOf HandleResponse), request)
RequestsSent += 1
Console.Writeline("Request")
'After ~3000 active threads in the process, this loop begins freezing/slowing down.
if RequestsSent > 5000 then 'Limit
Thread.Sleep(5000)
RequestsSent = 0
end if
Next
End While
End Sub
Sub HandleResponse(ByVal asynchronousResult As IAsyncResult)
Dim webRequest As HttpWebRequest = DirectCast(asynchronousResult.AsyncState, HttpWebRequest)
Dim webResponse As HttpWebResponse = webRequest.EndGetResponse(asynchronousResult)
Dim stream As New StreamReader(webResponse.GetResponseStream())
Dim response = stream.ReadToEnd
if response.contains("somestuff") then
dim t As New Thread(AddressOf ProcessAccount)
t.Start(account)
end if
End Sub
Sub ProcessAccount(acc As Account)
'Process the account. Involves some other loops, http requests...etc
End Sub
你用什麼調試工具?你確定內核是100%嗎?我從來沒有使用過,但[Visual Studio Concurrency Visualizer](https://msdn.microsoft.com/en-us/library/ee329530.aspx)看起來很有前途。 – JDong
從來沒有聽說過,我現在會檢查出來。 –
3000線程?必須有辦法減少這種情況。 –