2012-04-10 104 views
0

其行爲如下:例如一個帶200個插座的服務器工人每秒處理100K個回波。在同一端口上啓動另一個服務器工作人員(具有相同數量的套接字或每個工作人員少兩倍,這並不重要),立即將第一個工作人員的性能降低到大約50%,並略微提高每臺計算機的整體性能(每個工作人員服務每秒大約5萬回波)。Windows網絡IOCP在多個核心上的可伸縮性

因此,6核心機器的性能與1核心機器的性能大致相同。

我試過不同的方法,例如,每個工作者有一個獨立的IOCP端口(在CreateIoCompletionPort中指定NumberOfConcurrentThreads爲1),或者爲所有工作者嘗試一個共享IOCP端口(NumberOfConcurrentThreads等於工作人員數),則性能相同。我的工作人員共享零數據,所以沒有鎖等。

我希望我缺少一些東西,而不是Windows內核網絡可伸縮性問題。 我正在使用Windows 7 Enterprise x64。

當然,期望是大致線性縮放性能。

有人知道IOCP在一臺機器上的多核心的實際可伸縮性嗎? 當活動套接字的數量增加時,會出現什麼情況?

謝謝!

回答

0

非NUMA系統通常的方法是具有用於所有的連接的單個IOCP和一組螺紋的(通常在尺寸上可調)該服務的IOCP。

然後,您可以根據CPU的數量和線程完成的任何工作是否阻塞本質來調整線程數。

性能應該很好地擴展,除非您有一些共享資源,所有連接都必須訪問,共享資源爭用將影響您的可伸縮性。

我有一些免費的IOCP代碼here和一個簡單的多客戶端測試,它允許您運行數千個併發連接here

對於NUMA系統,理想情況下,你想有一個IOCP,線程池,每個緩衝NUMA節點分配,以保持記憶的東西可以稍微更復雜的訪問本地節點。

+0

感謝您的回覆。既然你正在處理你的項目,你能否提供一些關於你的框架如何在一臺機器上的核心/工作者數量之間進行擴展的數字?並在插座數量?非常感謝你。 – 2012-04-11 08:43:43

+0

我沒有這方面的數字。我們通常只進行性能測試來比較一個版本與另一個版本以及針對客戶的特定自定義服務器開發。 – 2012-04-11 12:00:30