3

我在 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 上没有很好地安排,因此我的数据包是下降?

4

1 回答 1

1

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

(1) 在达到 2,500 KB/sec 的吞吐量时,您在 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,这意味着您可能没有使用不同的套接字库。不过,我建议先检查发送缓冲区的大小。

于 2013-06-03T01:56:41.593 回答