我使用的是 Windows Server 2008,我的程序是用 C++ 编写的。
我在 while(true) 循环中使用 WinSock2 和 sendto() 来发送数据包。
代码如下:
while(true)
{
if(c == snd->max)
c = snd->min;
dest.sin_addr.S_un.S_addr = hosts[c];
iphead->destaddr = hosts[c];
sendto(s, castpacket, pktsz, 0, castdest, szsad);
++c;
}
我需要尽快将尽可能多的数据发送到主机 std::vector 中尽可能多的 IP。
我目前在i7 930服务器上运行,只能达到350Mbps左右。
我目前将程序分成 4 个线程,所有线程都运行 while 循环,并为每个线程分配不同的服务器。
添加更多线程或运行更多程序副本会导致吞吐量降低。
我有另一个程序正在运行,侦听服务器的回复。我从主列表中获取服务器并将它们添加到我的阵列中。目前的问题是,把它们全部看完需要太长时间,而且我想定期检查它们。
我到底如何优化我的程序/循环/发送?
看看WinSock的注册 I/O 扩展 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/hh997032(v=ws.11)(里约)API:
RIO API 是 Windows Sockets (Winsock) 的新扩展,为您提供减少网络延迟的机会,提高消息发送率并提高需要非常高性能的应用程序响应时间的可预测性,非常高的消息率和可预测性。 RIO API 扩展允许处理大量小消息的应用程序实现更高的每秒 I/O 操作数 (IOPS)减少抖动和延迟。具有高消息速率和低延迟要求的服务器负载从 RIO API 扩展中获益最多,包括金融服务交易和高速市场数据接收和传播的应用程序。此外,当您在一台物理计算机上部署许多 Hyper-V 虚拟机 (VM) 时,RIO API 扩展可提供高 IOPS。
RIO 允许使用请求和完成队列通过预先注册的缓冲区执行发送和接收操作。发送和接收操作排队到与 Winsock 套接字关联的请求队列中。已完成的 I/O 操作被插入到完成队列中,并且许多不同的套接字可以与同一个完成队列关联。完成队列也可以分为发送完成和接收完成。完成操作(例如轮询)可以完全在用户模式下执行,而无需进行系统调用。
注册缓冲区的使用简化了与网络相关的处理,减少了抖动,此外,应用程序开发人员还可以指定协议栈使用的网络缓冲区的 NUMA 节点关联性,进一步增强整体性能,并减少延迟和抖动特性。
RIO API 扩展支持传输控制协议 (TCP)、用户数据报协议 (UDP), and 组播UDP,以及 IPv4 和 IPv6。
如果您想实现以下任一目的,可以使用 RIO API 扩展:
使用 RIO API 扩展具有以下额外优势:
-
RIO 适用于 Windows Server 2012 的所有版本。
-
RIO 与普通网络适配器兼容,不需要特殊的网络适配器或 RDMA。
-
RIO 与现有的 Windows 网络功能完全兼容,包括 RSS、RSC、网络接口卡组合和静态卸载。
-
当您在 Windows Server 2012 中部署 Hyper-V 时,RIO 可与虚拟化配合使用。
-
RIO 套接字使用标准 Windows 网络堆栈以及标准 TCP/IP 和 UDP 协议。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)