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

标签 linux windows sockets udp

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

最佳答案

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

我已经写了很多关于它的文章 here并与 Windows 上可用的先前 API 进行了多次性能比较。可以找到性能测试 here .

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

我的性能测试结果似乎暗示它有效。

关于linux - 发送大量UDP数据包时如何减少系统调用开销? (Windows 和 Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20119419/

相关文章:

linux - 在 Linux 中 udev 需要什么才能正常启动?

linux - 如何使用 ANT 任务在 Linux 中运行 LDAP 删除条目工具

mysql - 如何为带有 Mysql 数据库的 Delphi 项目创建安装程序

c++ - GTX 970 的 CUDA 设备属性

python - C和python代码之间的套接字通信

python - gaierror : [Errno 8] nodename nor servname provided, 或未知(使用 macOS Sierra)

linux - 在 Linux 上删除文件中的字符串

linux - 适用于 Windows 的 "Make"命令 - 可能的选项?

java - 通过预先存在的 Socket 路由 Http(s)URLConnection

regex - 使用 sed 查找和替换?