我正在运行 Windows Server 2012,其中有一个通过 UDP 传输的音频流应用程序。另一个应用程序正在接收也通过 UDP 传输的音频,但通过单独的 NIC 到达。但是,似乎第一个应用程序传输的数据包越多,第二个应用程序中丢失的传入数据包就越多。
系统的总 CPU 负载约为 40%,因此应该有足够的余量。这个问题有意义吗?我可以做些什么来改善这种行为?
答案1
经过大量挖掘后,我似乎找到了解决问题的方法。
微软为 Windows Server 2012 提供了一个修补程序,允许绕过传入多播流的基本过滤引擎:https://support.microsoft.com/en-us/help/2808584/datagram-loss-when-you-run-a-multicast-receiver-application-in-windows
但是,此修补程序不适用于 Windows Server 2012 R2。但后来我发现了这篇博文:https://personalnexus.wordpress.com/2017/02/06/the-case-of-multicast-message-loss-on-windows-server-2012-r2/
因此,到目前为止,我已经有了一份详细的清单,列出了需要在我们的服务器上进行配置并确保我们的应用程序能够使用多播消息,以确保一切顺利运行,并将消息丢失保持在可接受的水平。然而,在我们最新的 Windows Server 2012 R2 机器上,随着机器上的网络流量(一般而言,不仅仅是多播)的增加,我的应用程序经历了严重的数据报丢失。
我在网上研究了这个问题,得到了你期望的提示:获取最新的 NIC 驱动程序、增加 NIC 接收缓冲区大小、打开卸载、打开接收端缩放、微调接收端缩放、增加套接字缓冲区大小等。当然,我已经尝试了所有这些方法,但都没有奏效
根据博客文章的解决方案:
不幸的是,该文档描述了 Windows Server 2012 中的一个问题,并且那里提供的修补程序无法安装在 Windows Server 2012 R2 上。幸运的是,这并非必须。您只需设置注册表项,基本过滤引擎即可立即支持它。
New-ItemProperty HKLM:\System\CurrentControlSet\services\Tcpip\Parameters\ -Name UdpExemptPortRange -Value "XXXX-YYYY" -PropertyType MultiString -Force
到目前为止,流再次运行良好。显然,当有大量传出 UDP 流量时,BFE 无法处理大量传入 UDP 流量。