发送大量UDP数据包时如何减少系统调用开销?(Windows和Linux)



例如,我在Windows上发送100000个UDP数据包。对于每个数据包,我需要调用WSASendTo()一次,因此可能会引入大量的系统调用开销。有没有一种方法可以进行批量发送并减少这种开销?在谷歌上搜索了一段时间后,我找不到适用于Windows的解决方案。此外,我想知道这在Linux上是否可行。谢谢

在Windows上,您可以在Server 2012和Windows 8及更高版本上使用新的Windows注册I/O API(RIO)。

我在这里写了很多关于它的文章,并与Windows上以前的API进行了一些性能比较。性能测试可以在这里找到。

总结:"注册的I/O网络扩展,RIO,是一种新的API,已添加到Winsock中,以支持高速网络,从而在较低延迟和抖动的情况下提高网络性能。这些扩展主要针对服务器应用程序,并使用预注册的数据缓冲区和完成队列来提高性能当发出单个请求时,锁定内存页并将OVERLAPPED结构复制到内核空间,而不是依赖于预先锁定的缓冲区、固定大小的完成队列、完成时的可选事件通知以及一次性将多个完成从内核空间返回到用户空间的能力。"

我的性能测试结果似乎表明它是有效的。

在Windows中使用TransmitPackets()

微软最近刚刚采用了QUIC协议。为此,微软不得不提高UDP在Windows中的性能。因此,我们现在有了一个新的";UDP发送分段";以及";UDP接收合并";Windows中的API。

这解决了呼叫开销问题,并利用了支持它的NIC上的硬件卸载。这是目前传输UDP的最快方法。但需要注意的是,它主要要求调用中的所有UDP数据包具有相同的大小。

点击此处了解更多信息:https://techcommunity.microsoft.com/t5/networking-blog/making-msquic-blazing-fast/ba-p/2268963

最新更新