如何弄清楚为什么UDP只接受相对较慢速率的数据包?

时间:2013-06-02 23:06:22

标签: c++ sockets udp porting interix

我在Windows XP上使用Interix来更轻松地移植我的C ++ Linux应用程序以移植到Windows XP。我的应用程序通过套接字向运行Linux的附近机器发送和接收数据包。发送时,我只获得大约180 KB /秒的吞吐量,并且在接收时我得到大约525 KB /秒。在Linux上运行的相同代码接近2,500 KB /秒。

当我尝试以高于180 KB /秒的速率发送时,数据包会被丢弃以使速率降低到大约该水平。

我觉得我应该能够在发送时获得比180 KB /秒更好的吞吐量,但我不确定如何确定丢弃数据包的原因是什么。

为了提高吞吐量,我怎样才能调查这种缓慢的过程?

- 更多历史记录 -

为了达到上述数字,我已经通过执行以下操作提高了吞吐量(这在Linux上没有任何区别,但有助于Interix的吞吐量):

  • 我将SO_RCVBUF和SO_SNDBUF从256KB更改为25MB,这提高了吞吐量约20%
  • 我运行优化而不是调试,这提高了吞吐量约15%
  • 我关闭了所有转到stdout和日志文件的日志消息,这使吞吐量增加了一倍。

所以看起来CPU似乎是Interix的限制因素,但不是Linux。此外,我正在虚拟机管理程序中托管的虚拟机上运行。 Windows XP有2个内核和2 GB内存。

我注意到分析器显示两个内核上的CPU平均利用率从未超过50%。当我有两个应用程序运行实例时,甚至会在两个内核上徘徊50%左右。也许我的应用程序是多线程的,具有从UDP套接字读取的专用线程和写入UDP套接字的专用线程(在任何给定时间只有一个是活动的)在Interix上没有很好地安排,因此我的数据包是滴?

1 个答案:

答案 0 :(得分:1)

在回答您的问题时,我根据您对问题的描述做出以下假设:

(1)当你实现2,500 KB /秒的吞吐量时,你正在Linux中使用完全相同的程序,而不是套接字库,当然,在Windows和Windows之间会有所不同。 Linux操作系统。如果这个假设是正确的,我们可能不必担心影响吞吐量的其他代码片段。

(2)当使用Linux实现2,500 KB /秒的吞吐量时,该节点位于网络中的精确相同位置。如果这个假设是正确的,我们不必担心影响吞吐量的网络问题。

鉴于这两个假设,我会说你在Windows端的套接字设置中可能有问题。我建议先检查发送缓冲区的大小。默认情况下,发送缓冲区的大小为8192字节。如果增加此值,您应该会看到吞吐量增加。使用setsockopt()来改变它。以下是使用手册:http://msdn.microsoft.com/en-us/library/windows/desktop/ms740476(v=vs.85).aspx

编辑:看起来我第一次读错了你的帖子。我刚刚注意到你正在使用Interix,这意味着你可能没有使用不同的套接字库。不过,我建议先检查发送缓冲区大小。