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

How to figure out why UDP is only accepting packets at a relatively slow rate?

本文关键字:速率 数据包 相对 弄清楚 为什么 UDP      更新时间:2023-10-16

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

当我尝试以高于180 KB/sec的速率发送时,数据包将被丢弃以使速率回落到该水平。

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

我该如何调查这种慢速,以期提高吞吐量?

—Some More History—

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

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

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

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

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

(1)当达到2500 KB/sec的吞吐量时,您在Linux中使用的是完全相同的程序,而不是套接字库,当然,这在Windows和Linux之间是不同的。如果这个假设是正确的,我们可能不必担心其他代码段会影响吞吐量。

(2)当使用Linux实现2500kb/sec吞吐量时,节点在网络中的位置与位置完全相同。如果这个假设是正确的,我们就不必担心网络问题会影响您的吞吐量。

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

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