高性能网络应用程序的最佳实践

时间:2009-11-04 07:45:53

标签: c# .net windows-7 network-programming bandwidth-throttling

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

我知道Vista的(和更高)限制行为可以使媒体和网络应用程序很好地协同工作,但我当然没想到播放音乐会提高网络性能,也不会让网络性能下降得如此显着。< / p>

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

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

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

4 个答案:

答案 0 :(得分:3)

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

仅在播放期间发生

副作用是 - 您的应用程序具有较小的时间段,这会影响您的应用程序,因为您的应用程序可能会盗取大量CPU并且时间较长 - 持续时间较长。

要测试它,您只需将应用内的计时器分辨率设置为1毫秒,然后比较的性能,而不用媒体播放。

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

答案 1 :(得分:2)

我编写网络协议相关代码已有很多年了,但我会猜测。

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

要在代码中解决此问题,您可以尝试自己批量发送数据包。我假设您正在将每个数据包发送到系统进行传输,因为数据已准备就绪。将多个数据包分组并同时将它们发送到系统。即使只是一组两个或三个数据包也会产生显着的差异,尤其是在每次系统调用之间introducing your own small delay时。

我在Google上的快速搜索中找不到任何直接相关的链接。但是,您可以在this discussion of network tuning for Linuxthis FAQ中看到概念,该概念描述了批处理以提高吞吐量等技术。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

这听起来像TSP / IP基于它的原始算法管理吞吐量。这里的白皮书应该给出更多背景知识。 http://www.asperasoft.com/?gclid=CICSzMqD8Z0CFShGagod_ltSMQ 他们的产品是UDP协议,效果很好。