0

行为如下:例如,一个具有 200 个套接字的服务器工作者每秒处理 100K 回声。在同一个端口上启动另一个服务器工作程序(每个工作程序的套接字数量相同或少一倍,没关系),立即将第一个工作程序的性能降低到大约 50%,并且稍微提高了每台机器的整体性能(每个工作程序服务每秒大约 50K 回波)。

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

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

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

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

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

谢谢!

4

1 回答 1

0

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

然后,您可以根据 CPU 的数量以及线程所做的任何工作是否本质上是阻塞的,来调整线程的数量。

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

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

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

于 2012-04-11T07:48:22.337 回答