gpt4 book ai didi

c++ - 如何弄清楚为什么 UDP 仅以相对较慢的速率接受数据包?

转载 作者:太空狗 更新时间:2023-10-29 23:06:07 25 4
gpt4 key购买 nike

我在 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% 的吞吐量
  • 我关闭了所有发送到标准输出和日志文件的日志消息,这使吞吐量翻了一番。

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

我注意到分析器显示两个内核上的 CPU 平均利用率从未超过 50%。当我有两个应用程序实例正在运行时甚至会发生这种情况,但它仍然在两个内核上徘徊在 50% 左右。也许我的应用程序是多线程的,有一个专用线程从 UDP 套接字读取和一个专用线程写入 UDP 套接字(在任何给定时间只有一个处于事件状态)在 Interix 上没有很好地安排,因此我的数据包是下降?

最佳答案

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

(1) 在实现 2,500 KB/秒的吞吐量时,您在 Linux 中使用的是完全相同的程序,除了套接字库,当然,这在 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,这意味着您可能没有使用不同的套接字库。不过,我建议先检查发送缓冲区大小。

关于c++ - 如何弄清楚为什么 UDP 仅以相对较慢的速率接受数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16888142/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com