Windows网络IOCP在多核上的可扩展性

时间:2012-04-10 18:15:48

标签: windows sockets networking scalability iocp

行为如下:例如一个服务器工作者有200个插槽,每秒处理100K回声。在同一端口上启动另一个服务器工作者(具有相同数量的套接字或每个工作者减少两倍,无关紧要),立即将第一个工作人员性能降低到约50%,并略微提高每台机器的整体性能(每个工作人员服务)每秒约50K回声。)

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

我尝试了不同的方法,例如为每个工作者提供一个独立的IOCP端口(在CreateIoCompletionPort中指定NumberOfConcurrentThreads为1),或者为所有工作者尝试一个共享IOCP端口(NumberOfConcurrentThreads等于工作人员数),性能是相同的。我的工作人员共享零数据,因此没有锁等等。

我希望我遗漏了一些东西,而不是Windows内核网络的可扩展性问题。 我正在使用Windows 7 Enterprise x64。

当然,期望是近似线性扩展性能。

有人知道一台机器上多个内核上IOCP的实用可扩展性吗? 当活动套接字数量增加时会出现什么情况?

谢谢!

1 个答案:

答案 0 :(得分:0)

非NUMA系统的常用方法是为所有连接提供单个IOCP,并为IOCP提供一组线程(通常可调整大小)。

然后,您可以根据CPU的数量调整线程数,以及线程完成的任何工作是否都是阻塞的。

性能应该很好地扩展,除非您拥有一些所有连接必须访问的共享资源,此时共享资源的争用将影响您的可伸缩性。

我有一些免费的IOCP代码here和一个简单的多客户端测试,它允许您运行数千个并发连接here

对于NUMA系统,事情可能稍微复杂一些,因为理想情况下,您希望每个NUMA节点拥有一个IOCP,线程池和缓冲区分配器,以保持对本地节点的内存访问。