我正在研究是否可以在Windows上实现一个HPC应用程序,该应用程序可以使用十几个或多达200个多播组(即使用MSI-X和RSS )以高速率接收较小的UDP多播数据报(大多数为100-400字节)。扩展到多个内核),对每个数据包进行一些处理,然后将其发送出去。通过TCP发送时,我设法达到了我所需要的最大速度(6.4Gb / sec),而没有遇到障碍,但是以高pps速率接收数据报却成为一个问题。
在Windows 2012 R2上使用2端口10Gb以太网NIC的高规格NUMA计算机上的最新测试中,我每秒只能接收数十万个UDP数据报(早期丢弃,即没有实际处理数据)。使用2x12内核从等式中删除我的应用程序的处理开销,以了解它的运行速度),并且测试的12个多播组的内核部分似乎分布在一个NUMA节点的8或10个内核中(设置了最大RSS队列)到16)-尽管使用了.net应用,所以本地应用应该能够运行得更快。
但即使莱恩霍尔盖特 只设法在500kpps接收UDP数据包在他的高性能的Windows RIO测试,使用1024个字节的UDP有效载荷。
在QLogic的白皮书(未提及被测操作系统)中,“多线程超小数据包路由”(包括接收和后续发送?)的限制设置为5.7Mpps。在有关Linux网络的文章中,限制设置为每个内核1Mpps到2Mpps(据报道线性地或多或少地线性扩展),或者使用绕过内核的特殊解决方案甚至设置为15Mpps。
例如网图
只需一个运行在900Mhz的内核,就可以在10GigE链路上以线速(14.88Mpps)生成流量。这相当于每个数据包大约60-65个时钟周期,并且可以随内核和时钟频率很好地扩展(对于4个内核,在不到450 MHz的频率下实现了线速)。在接收端达到相似的速率。
那么,我可以带(最新版本的)Windows / Windows Server走多远,尤其是如前所述,接收UDP多播呢?
编辑有一个cloudflare博客文章-一个有趣的评论部分-有关如何在Linux上做到这一点:如何每秒接收一百万个数据包,并且有相应的黑客新闻评论页面。