【问题标题】:Faster WinSock sendto()更快的 WinSock sendto()
【发布时间】:2011-11-10 03:53:33
【问题描述】:

我使用的是 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 循环,并为每个线程分配不同的服务器。 添加更多线程或运行更多程序副本会导致吞吐量降低。

我正在运行另一个程序以侦听来自服务器的回复。我从主列表中获取服务器并将它们添加到我的阵列中。目前的问题是,全部看完都需要很长时间,我想定期检查一下。

我该如何优化我的程序/循环/在这里发送?

【问题讨论】:

  • 数据包大小为 79 字节,包括 ethernet+ip+udp 头。我想发送更多的pps。
  • 您需要我们的帮助来编写拒绝服务工具吗?
  • 你误会了。它不是 DoS 工具,我的主机阵列中有很多服务器,每台服务器的速度
  • 我似乎无法编辑我的其他评论:我有另一个程序正在运行,以侦听来自服务器的回复。我从主列表中获取服务器并将它们添加到我的阵列中。目前的问题是,全部看完的时间太长了,我想定期检查一下。
  • @Seth,好的,很抱歉怀疑你的意图。当我想到尽可能快地发送数据包时,首先想到的是 DOS。

标签: c++ winsock sendto


【解决方案1】:

我建议迁移到异步 I/O 以加快速度。一次发送一个的主要问题是,当 TCP 堆栈正在处理当前数据包时,您无法将下一个数据包排队。

或者,您可以采用线程池方法:触发一定数量的工作线程,每个工作线程从 FIFO 中提取一个客户端并将数据发送到客户端。当一个线程处理完它的客户端后,它会将客户端放回 FIFO 中并选择一个新的。您可以通过调整工作线程的数量来填充管道 - 但不能淹没它。

【讨论】:

  • 这是错误的。异步 I/O 不会神奇地改变 TCP/IP 堆栈与数据的关系。
【解决方案2】:

看看 WinSock 的 Registered I/O Extensions (RIO) 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)多播 UDP,以及 IPv4 和 IPv6。

如果您想实现以下任一目的,您可以使用 RIO API 扩展:

  • 扩展您的服务器以最小化每条消息的 CPU 使用率

  • 将网络堆栈的延迟贡献和抖动降至最低

  • 处理非常高速率的多播或 UDP 流量

使用 RIO API 扩展有以下额外好处:

  • RIO 适用于所有版本的 Windows Server 2012。

  • RIO 与普通网络适配器兼容,不需要特殊的网络适配器或 RDMA。

  • RIO 与现有的 Windows 网络功能完全兼容,包括 RSS、RSC、网络接口卡组合和静态卸载。

  • 当您在 Windows Server 2012 中部署 Hyper-V 时,RIO 与虚拟化一起使用。

  • RIO 套接字使用标准 Windows 网络堆栈和标准 TCP/IP 和 UDP 协议。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多