我最近使用 MS 为该 API 提供的稍微可接受的文档编写了基于 WinSock Registered IO (RIO) 的 UDP 接收。最终的性能非常令人失望:单套接字性能有些稳定,约为每秒 180k 数据包 - 使用多个 RSS 队列(即多个套接字)时,每秒约为 260k 数据包。已使用 Tracy 对代码进行了分析,结果表明一切正常。
到目前为止,人们可能会认为我在编写收集这些数字的代码方面做得很糟糕。于是,我在网上搜索了一下,发现2012 年的博客文章 http://www.serverframework.com/asynchronousevents/rio/这表明单套接字性能至少为每秒 450k 数据包。我下载了代码并在可能的测试设置(背对背 10 Gb/s 连接的机器)上运行它,并获得了与我的类似的性能。
现在事情变得有趣了:在给博主写了一封电子邮件后,我从那里得到了代码,他在自己的机器上进行了尝试,并得出了“RIO 性能令人失望”的结论,并且基本阻塞 IO 的性能优于它(至少在这个单套接字设置)。不幸的是,他没有时间进一步调查为什么 2012 年的代码在更好的硬件上会导致更差的性能。
所有测试都是在基于 Windows 10 Pro 的计算机上进行的,至少在我这边,具有(大概)适当的 NIC 配置,并且没有 SMT/超线程。进行测试时系统未承受任何负载。
确实,我最初提出的问题可以改写为:RIO API 是否发生了变化,导致 2012 年编写的代码现在性能非常糟糕?或者:使用 RIO 的“现代”方法是什么样的?或者:2021 年是否应该使用 RIO?
我也在 Win10 和 Win11 下使用 UDP 和 RIO 工作(和战斗)。我不太喜欢改变线程和进程优先级,但是......
通过将(出队线程的)线程优先级设置为,我获得了最佳性能结果THREAD_PRIORITY_TIME_CRITICAL
。
(我认为这会增加UDP接收的IO优先级。我找不到很多文档来验证这一点:也许在这里 https://superuser.com/questions/136021/how-to-change-i-o-priority-of-a-process-or-thread-in-win7)
此外,我已将进程优先级调整为REALTIME_PRIORITY_CLASS
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)