11

在测试我在 Windows 7 Ultimate x64 上编写的 UDP 多播服务器时,我遇到了一件非常奇怪的事情。在后台使用 foobar2000 播放音乐显着提高了服务器的传输速率,但也有轻微的丢包。关闭音乐立即将传输速率降至可接受的水平以下,但也产生了 0 数据包丢失。(我有一个客户端应用程序与服务器对话并报告未确认的数据包)

我知道 Vista(及更高版本)的节流行为使媒体和网络应用程序可以很好地一起运行,但我当然没想到播放音乐会提高网络性能,也没有想到将其关闭会如此显着降低网络性能。

从我的服务器应用程序的代码的角度来看,我能做些什么,以便无论在 Vista 及更高版本上是否播放音乐,它都能始终如一地执行?我当然希望避免通知我所有的客户如何调整他们的注册表以获得可接受的传输速率,并且也希望避免让他们简单地“播放音乐”以获得可接受的传输速率。在我看来,该应用程序应该“正常工作”。

我认为该解决方案涉及类似于进程优先级、MMCSS 或其他一些模糊的 Windows API 调用,以使其在此处执行 The Right Thing(TM)。

另外,很抱歉,创建可重现的测试用例是一项非常重要的工作。仅当物理 NIC 的驱动程序正在积极工作并且无法使用环回接口重现时,才会发生限制行为。需要一个客户端实现、一个服务器实现和物理网络硬件来进行测试。

4

4 回答 4

4

您观察到的是媒体播放器将机器的时钟分辨率设置为 1 毫秒的副作用。

这只发生在比赛期间

副作用是 - 您的应用程序的时间片更小,这会改进您的应用程序,因为您可能从应用程序中窃取了大量 CPU 并且时间片更长 - 时间更长。

要对其进行测试,您可以简单地将应用程序中的计时器分辨率设置为 1 毫秒,并在没有媒体播放的情况下比较性能。

应该与没有 clocres 设置但有媒体播放的情况相同。

于 2010-06-23T11:52:54.940 回答
2

自从我编写网络协议相关代码以来已经有很多年了,但我会提供一个猜测。

我怀疑这是吞吐量和延迟的问题。播放音乐会引入 I/O 争用并在传输数据包时增加延迟。但是,增加的延迟可能会导致数据包排队,从而批量增加吞吐量

要在您的代码中解决此问题,您可以尝试自己批量发送数据包。我假设您在数据准备就绪时将每个数据包发送到系统进行传输。将多个数据包分组并同时发送到系统。即使只是一组两个或三个数据包也可能产生巨大的差异,特别是如果您在每个系统调用之间引入自己的小延迟。

我在 Google 上的快速搜索中找不到任何直接相关的链接。但是,您可以在Linux 网络调整的讨论中或在描述批处理等技术以提高吞吐量的常见问题解答中看到这个概念。

于 2009-11-08T13:59:49.357 回答
0

Foobar 有许多由不同人编写的插件。这些可能是您的问题的原因。我建议你更接近真正的原因。每次禁用插件时,尝试一一关闭插件执行测试。

希望这个想法会有所帮助。

于 2009-11-04T08:48:39.423 回答
0

这听起来像是基于其原始算法的 TSP/IP 管理吞吐量。这里的白皮书应该提供更多背景信息。 http://www.asperasoft.com/?gclid=CICSzMqD8Z0CFShGagod_ltSMQ 他们的产品是一个运行良好的 UDP 协议。

于 2009-11-04T09:29:38.780 回答