我有一個.NET 2.0服務器似乎正在運行到縮放問題,可能是由於套接字處理代碼設計不佳,我正在尋找關於如何我的指導可能會重新設計它以提高性能。高性能C#服務器套接字的技巧/技巧
使用場景: 50 - 150個客戶端,每個客戶端的小型消息(每個10字節)的高速率(高達100秒/秒)。客戶端連接是長期的 - 通常是幾個小時。 (服務器是交易系統的一部分,客戶端消息被聚合成組以通過更少數量的「出站」套接字連接發送給交換機,並且確認消息被髮送回客戶機,因爲每個組由交換機處理)操作系統是Windows Server 2003,硬件是2 x 4核心X5355。
當前客戶端套接字設計: A TcpListener
產生一個線程來讀取客戶端連接時的每個客戶端套接字。線程在Socket.Receive
上阻塞,解析傳入消息並將它們插入一組隊列中供核心服務器邏輯處理。確認消息通過客戶端套接字使用與交換端交談的線程調用異步Socket.BeginSend
發回。
發現的問題:隨着客戶數量的增長(目前60-70),我們已經開始看到的間歇延遲長達數百毫秒的同時發送和從客戶端接收數據/。 (我們記錄每個確認消息的時間戳,並且我們可以看到在同一組中的一組ack通常以幾毫秒總計出現的時間戳序列中的偶爾長時間間隔。)
總體系統CPU使用率較低( < 10%),有足夠的可用RAM,核心邏輯和出站(交換)方面表現良好,所以問題似乎與面向客戶端的套接字代碼隔離。服務器和客戶端之間有充足的網絡帶寬(千兆局域網),並且排除了網絡或硬件層的問題。
任何建議或指向有用的資源將不勝感激。如果任何人有任何診斷或調試技巧來弄清楚到底發生了什麼問題,那麼這些也會很棒。
注意:我有MSDN雜誌文章Winsock: Get Closer to the Wire with High-Performance Sockets in .NET,我已經瀏覽了Kodart的「XF.Server」組件 - 它看起來很簡單。
同意了,雖然我想補充一點,即使你「排除」網絡問題,我會考慮更換各種部件(特別是服務器網卡),並確保您擁有所有最新的固件和驅動程序。 – 2008-11-26 05:26:10