在测试我在Windows7终极x64上编写的UDP多播服务器时,我遇到了一件非常奇怪的事情。在后台使用foobar2000播放音乐显着地提高了服务器的传输速率,但也造成了较小的分组丢失。关掉音乐,立即将传输速率降低到低于可接受的水平,但同时也造成了0分组丢失。(我有一个客户端应用程序,它可以与服务器对话并报告未确认的数据包)
我知道Vista(和up)的节流行为使媒体和网络应用程序一起运行得很好,但我当然不认为播放音乐会改善网络性能,也不认为关闭它会显著降低网络性能。
,从代码的角度看,在我的服务器应用程序中,能做些什么,使它无论是否在Vista和上面播放音乐,都能始终如一地执行?我当然不想告诉我的所有客户如何调整他们的注册表以获得可接受的传输速率,我也希望避免让他们简单地“播放音乐”,以获得可接受的传输速率。在我看来,这个应用程序应该“起作用”。
我认为该解决方案涉及一些类似于进程优先级、MMCSS或其他一些模糊的Windows调用的内容,以便让它在这里做正确的事情(TM)。
同样,遗憾的是,创建一个可重复的测试用例是一项不平凡的工作.只有当物理NIC的驱动程序正在积极地工作并且不能使用回环接口再现时,才会发生节流行为。需要客户端实现、服务器实现和物理网络硬件来进行测试。
发布于 2010-06-23 11:52:54
你所观察到的是你的媒体播放器把你的机器的时钟分辨率设置为1ms的副作用。
,这只会在戏剧中发生,
副作用是-你的应用程序有更小的时间,这会使你的应用程序更重要,因为你可能有很多CPU从你的应用程序和更长的时间被窃取-更长的时间。
要测试它,您可以简单地将应用程序中的定时器分辨率设置为1ms,并比较性能而不播放媒体。
应该是相同的,好像没有关闭设置,但与媒体播放。
发布于 2009-11-08 13:59:49
自从我写网络协议相关代码以来已经有很多年了,但我会给出一个猜测。
我怀疑这是吞吐量和延迟的问题。播放音乐是在传输数据包时引入I/O争用和增加延迟。但是,增加的延迟很可能导致数据包排队,从而批量增加吞吐量。
要在代码中解决这个问题,您可以尝试自己分批发送数据包。我假设,当数据准备就绪时,您将每个数据包发送到系统以进行传输。对多个数据包进行分组,并同时将它们发送到系统。即使是两到三个包的组也会产生巨大的差异,特别是当您是每个系统调用之间的介绍你自己的小延迟时。
我找不到任何直接相关的链接,从一个快速搜索谷歌。但是,您可以在关于Linux网络调优的讨论或这个常见问题中看到这个概念,它描述了诸如批处理这样的技术来提高吞吐量。
发布于 2009-11-04 08:48:39
Foobar有许多插件是由不同的人编写的。这可能是你的问题的原因。我建议你离真正的原因更近一点。每次插件被禁用时,试着一个接一个地关闭插件,执行测试。
希望这个想法能有所帮助。
https://stackoverflow.com/questions/1672249
复制相似问题