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

12

在我编写的Windows 7 Ultimate x64的UDP组播服务器上进行测试时,我发现了一个非常奇怪的问题。在背景中使用foobar2000播放音乐明显地提高了服务器的传输速率,但也导致了轻微的数据包丢失。关闭音乐会立即将传输速率降至低于可接受的水平,但同时也产生了零数据包丢失。(我有一个客户端应用程序,它与服务器通信并报告未确认的数据包)

我知道Vista及以上版本的操作系统有限制网络和媒体应用程序的行为,以使它们能够良好运行,但我肯定不希望播放音乐会提高网络性能,也不希望关闭音乐会如此显著地降低网络性能。

从代码的角度来解决这个问题,我该怎么做才能让我的服务器应用程序在Vista及以上版本的操作系统上无论是否播放音乐都能一致表现?我当然不希望通知所有客户端如何调整注册表以获得可接受的传输速率,并且也不希望让他们仅仅“播放音乐”以获得可接受的传输速率。我认为应用程序应该像预期的那样“正常工作”。

我认为解决方案涉及到进程优先级,MMCSS或可能是其他一些Windows API调用,以获得正确的结果。

另外,很抱歉但创建可重现的测试用例需要相当大的工作量。限制行为仅在物理网卡驱动程序正在主动工作时才会出现,并且无法使用回环接口进行复现。需要一个客户端实现、一个服务器实现和物理网络硬件来进行测试。


当你说“正在播放音乐”时,是指它正在播放硬盘中的音乐并使用声卡吗?还是通过同一网络卡进行流媒体传输? - Toad
@reinier:是的,foobar2000正在从硬盘上缓慢加载数据,并通过USB 2.0将音频流式传输到我的外部音频接口。 - James Dunne
4个回答

4

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

此现象仅在播放期间发生。

这种副作用是-您的应用程序具有更小的时间片,并且这可以提高您的应用程序,因为您的应用程序可能会被大量 CPU 窃取,并且使用更长的时间片来执行更长的时间。

要测试它,您只需将应用程序中的计时器分辨率设置为1ms,并比较进行媒体播放时的性能。

应该与无时钟分辨率设置但带有媒体播放的情况相同。


2
多年来我没有写过与网络协议相关的代码,但我会提供一个猜测。
我怀疑这是吞吐量和延迟的问题。播放音乐会引入I/O争用,并增加传输数据包的延迟。然而,增加的延迟可能会导致数据包排队,从而批量增加吞吐量
要解决这个问题,您可以尝试自己将数据包分批发送。我假设您在数据准备好时将每个数据包发送到系统进行传输。将多个数据包分组并同时发送到系统。即使只有两个或三个数据包的组合也可能产生显着的差异,特别是如果您在每个系统调用之间引入自己的小延迟
我在谷歌上进行了快速搜索,但没有找到直接相关的链接。不过,您可以在Linux网络调优讨论中看到这个概念,或者在常见问题解答中了解如何使用批处理等技术来提高吞吐量。

我已经将数据包分组为每组1,024个。每个数据包大约有1,400字节。在1,024个数据包中,客户端会否定确认50-60个。当我关闭服务器上的媒体播放器时,否定确认计数立即降至0,并且可以获得更好的吞吐量。这似乎表明服务器负责数据包丢失。我想知道从服务器端能做些什么来自动适应这种I/O争用。 - James Dunne
你的评论似乎与你的问题相反。你真的想要每50-100微秒发送1024个数据包吗?那是疯狂的吞吐量。问题真的是吞吐量还是数据丢失? - g .
哦不不。50-100微秒的延迟是在1024个数据包扇区内发送单个数据包之间的延迟。另外,我不认为我在这个问题中提到了我的50-100微秒的延迟。你是在交叉参考我的SO问题吗? :) - James Dunne

0
Foobar有许多由不同人编写的插件。这些可能是你问题的原因。我建议你更接近真正的原因。尝试逐个关闭插件,在每次禁用插件时执行测试。
希望这个想法能帮到你。

我非常怀疑问题与 foobar2000 有关。我将尝试其他媒体播放器以进一步诊断问题。这可能与我使用的 USB 2.0 音频接口有关。我也会使用主板上的声卡进行一些测试。 - James Dunne

0

我应该提到,我在同一个应用程序中使用TCP和UDP协议。 TCP仅用于控制信息和所有客户端的协调; 它不应该成为瓶颈。 我纯粹使用UDP进行数据传输,并将数据包保持在1500字节以下。 我曾经全部使用UDP,但遇到了严重的同步问题,准备重新发明TCP轮子,所以我想为什么不只是使用TCP呢? - James Dunne
TCP/IP是我首先会查找您的问题的地方。 - Mike Trader
@Mike: 你认为服务器端的UDP数据包丢失是否与正在进行的TCP通信有关? TCP仅用于通知所有客户端下一批数据即将通过UDP发送。还有一个“部门完成”消息会在服务器稍后发送。在进行UDP批量传输时,应用程序之间没有发送任何TCP消息,除了OS为了保持连接而进行的正常TCP流量。 - James Dunne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接