【问题标题】:Maximizing performance on udp最大化 udp 的性能
【发布时间】:2010-07-22 14:21:03
【问题描述】:

我正在使用两个客户端进行一个项目,一个用于发送,另一个用于接收 udp 数据报,在 2 台直接相互连接的机器之间。 每个数据报大小为 1024 字节,使用 winsock(blocking) 发送。 他们都在非常快的机器上运行(单独的)。带有 16gb 内存和 8 个 cpu,带有 raid 0 驱动器。
我正在寻找使我的吞吐量最大化的技巧,技巧应该在winsock级别,但如果你有其他技巧,那也很棒。
目前我得到 250-400mbit 的传输速度。我正在寻找更多。
谢谢。

【问题讨论】:

  • 两台机器之间链路的带宽是多少?你确定你没有 CPU 瓶颈(即你没有在 100% CPU 中运行)吗?
  • 带宽为 1gbps。没有.. cpu 是 30% ~

标签: c windows udp winsock


【解决方案1】:

由于我不知道除了发送和接收您的应用程序之外还有什么其他功能,因此很难知道还有什么可能会限制它,但这里有一些事情可以尝试。我假设您使用的是 IPv4,而我不是 Windows 程序员。

在使用可靠连接时最大化发送的数据包大小。对于 100 mbs 以太网,最大数据包为 1518,以太网使用其中的 18 个,IPv4 使用 20-64(通常是 20,认为),而 UDP 使用 8 个字节。这意味着通常您应该能够为每个数据包发送 1472 字节的 UDP 有效负载。

如果您使用支持它的千兆以太网设备,您的数据包大小会增加到 9000 字节(巨型帧),因此发送更接近该大小的数据应该会加快速度。

如果您要从侦听器向发送者发送任何确认,请尝试确保它们很少发送,并且一次可以确认多个数据包。尽量让听者不必说太多,并尽量让发送者不必等待听者获得继续发送的许可。

在发送方应用程序所在的计算机上,考虑为接收方所在的计算机设置一个静态 ARP 条目。如果没有这个,每隔几秒就会有一个暂停,同时发出一个新的 ARP 请求以确保 ARP 缓存是最新的。一些 ARP 实现可能会在 ARP 条目过期之前很好地执行此请求,这会降低影响,但有些则不会。

关闭尽可能多的网络用户。如果您使用的是以太网交换机,那么您应该专注于将流量引入/来自运行您的应用程序所在/使用的计算机/网络设备的流量(这包括广播消息,如许多 ARP 请求)。如果它是集线器,那么您可能希望让整个网络安静下来。 Windows 倾向于向网络发送源源不断的垃圾流,这在许多情况下没有用处。

一个应用程序或用户可以拥有多少网络带宽可能会受到限制。或者操作系统允许它自己使用多少网络带宽可能会受到限制。如果它们存在,它们可能可以在注册表中进行更改。

网络接口芯片实际上并不一直支持网络的最大带宽并不罕见。有些芯片可能会因为忙于处理前一个数据包而丢失数据包,还有一些芯片不能像以太网规范允许的那样紧密地发送数据包。此外,即使是,系统的其余部分也可能无法跟上。

【讨论】:

    【解决方案2】:

    需要注意的事项:

    • 连接的 UDP 套接字 (some info) 缩短了内核中的几个操作,因此速度更快(有关详细信息,请参阅 Stevens UnP 书籍)。
    • 套接字发送和接收缓冲区 - 使用SO_SNDBUFSO_RCVBUF 套接字选项来平衡峰值和丢包
    • 看看是否可以增加链接MTU并使用jumbo frames

    【讨论】:

      【解决方案3】:

      使用 1Gbps 网络并升级您的网络硬件...

      【讨论】:

        【解决方案4】:

        使用 iperf 等经过验证的代码测试硬件的数据包限制:

        http://www.noc.ucf.edu/Tools/Iperf/

        我正在链接 Windows 版本,最好从 Linux LiveCD 启动并尝试使用 Linux 版本来比较 IP 堆栈。

        如果您的 NIC 性能不佳,请尝试使用英特尔千兆服务器适配器:

        http://www.intel.com/network/connectivity/products/server_adapters.htm

        【讨论】:

          【解决方案5】:

          对于 TCP 连接,已经证明使用多个并行连接将更好地利用数据连接。我不确定这是否适用于 UDP,但它可能有助于解决数据包处理的一些延迟问题。

          所以你可能想尝试多个线程的阻塞调用。

          【讨论】:

          • 我仅限于一个特定的发送和接收端口。据我所知,你不能在同一个端口上打开 2 个套接字..
          【解决方案6】:

          除了 Nikolai 对发送和接收缓冲区的建议,如果可以的话,切换到重叠 I/O 并有许多待处理的接收,这也有助于最大限度地减少由于缺少缓冲区而被堆栈丢弃的数据报的数量空间。

          如果您正在寻找可靠的数据传输,请考虑UDT

          【讨论】:

            猜你喜欢
            • 2012-06-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-28
            • 2018-03-25
            • 2010-09-30
            • 1970-01-01
            • 2014-01-11
            相关资源
            最近更新 更多