如何弄清楚为什么UDP只以相对较慢的速率接受数据包
How to figure out why UDP is only accepting packets at a relatively slow rate?
我在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,这意味着您可能没有使用不同的套接字库。然而,我建议先检查发送缓冲区大小。- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 将数据包从C++服务器发送到NodeJs服务器时出现MessagePack解码错误
- 使用C++将UDP数据包存储在Structure中
- FFmpeg av_read_frame从音频流返回数据包
- 为什么操作系统正在更改我的数据包的指定传出端口
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- recvfrom 只收到几个数据包,之后它进入等待状态
- 如何调试由 C++ 编写的 npm 数据包
- 如何在INET的应用层中发送广播数据包
- 在高数据包速率下最大限度地减少丢弃的 UDP 数据包 (Windows 10)
- 如何弄清楚为什么UDP只以相对较慢的速率接受数据包