2011-06-04 36 views
6

我已經按照你的建議開發了TCP服務器:High performance TCP server in C#高性能C#TCP服務器的問題:無連接可以作出,因爲目標機器積極地拒絕它

它是基於asynchron模式。

我還開發了一個壓力測試應用程序來測試其性能。我的服務器可以從我的壓力測試應用程序中平行地獲得數千個連接,可以解析數據並將其保存到我的數據庫。

當我強調我的服務器,我可以得到「System.Net.Sockets.SocketException」因爲目標機器主動拒絕它「沒有連接可以做」錯誤從我的服務器,所以我必須重新連接到它。用5000個併發連接測試它,我必須再次嘗試連接,因爲這個問題有10-20%的連接,如果我用10K併發連接測試它,它可以是30-40%。有時它可以 - 很少 - 看起來它不能處理連接接受:我從我的壓力測試中創建新的連接,與我的測試機器一樣嚴重 - 每秒大約120個連接

那麼,什麼會導致這種異常?如何處理它?在服務器端執行什麼以避免這個問題?如何調優TCP連接accept?

在此先感謝!

+0

我認爲這是壓力測試的重點=確保您的機器可以處理負載。這就是你如何發現當你接近容量極限時會發生什麼。 – DOK 2011-06-04 13:21:56

+0

是的,但是我想讓它變得更好 - 如果可能的話...... – Tom 2011-06-04 13:47:05

+1

如果您想讓您的軟件更好,請確保它正確處理異常。你不會阻止/避免它們。 – 2011-06-04 15:56:25

回答

2

您的連接速度比軟件可以偵聽新連接的速度要快,換句話說,您即將達到該端口的每秒連接數限制。我想你可以通過監聽第二個端口來每秒增加一倍的連接數量,客戶端在出現異常時應該重新連接。

連接數量也有限制,請參閱Chris O's answer

+0

你說得對。如果我以最大170個連接/秒速率/端口建立新的連接,我不會得到這個異常。如果我以這樣的速度建立聯繫,那麼我可以在沒有任何錯誤的情況下創建10 000個併發連接。 – Tom 2011-06-04 19:45:47

+0

嗨湯姆,我遇到了同樣的問題。當我的偵聽端口每秒接收超過200個連接時,以下連接將獲得相同的例外。我能知道你是如何解決它的嗎? – kevin 2012-06-29 10:35:51

+0

@kevin'您需要對該問題發表評論,而不是回答。因爲我們都有同名的名字,所以你不能用@在這裏瞄準他...... – 2012-06-29 14:57:53

6

您可能會不時使用可用的端口。您可以使用SysInternals的TcpView實用程序輕鬆查看。

在Windows上,當您釋放端口時,它不會立即進入可用狀態,而是會在某個時間間隔內處於TIME_WAIT狀態。直到它離開這個狀態,沒有應用程序可以使用這個端口。時間延遲,最大端口數量和可用端口範圍都與操作系統,XP與Win7和Win2008服務器不同。

有可以縮短這個時間間隔兩個註冊表項: HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/TCPTimedWaitDelay

,同時增加可通過一個應用程序打開的端口的最大數量: HKLM/System/CurrentControlSet/Services/Tcpip/Parameters/MaxUserPort

編輯:MaxFreeTcbs似乎是一個第三個設置可能有幫助(我還沒有嘗試過),在this TechNet article中提到,它有更多的建議來追蹤奇怪的網絡問題。 HTH。

+0

MaxUserPort:65534 - 據我所知它不能再多了; TCPTimedWaitDelay:30. - 你怎麼看待這個?應該改變嗎? Thx – Tom 2011-06-04 13:43:42

+0

測試和測量;-)我添加了一篇提到第三個參數的文章的鏈接,以防萬一您能幫助您,設置爲「MaxFreeTcbs」。 – 2011-06-04 13:59:20

+1

所以,我做了更多的測量。我的問題不是關於端口耗盡,而是與這些參數無關。如果我以最高170個連接/秒的速率建立新的連接,我不會得到這個例外。如果我以這樣的速度建立聯繫,那麼我可以在沒有任何錯誤的情況下創建10 000個併發連接。如果我做得更高,這個例外即將到來。我不知道這個最大連接速率是否正常......因爲我認爲這取決於操作系統和硬件。 – Tom 2011-06-04 19:43:55

相關問題