我使用Windows上的Interix将我的C++ Linux应用程序更容易地移植到Windows。我的应用程序通过套接字向运行Linux的机器发送和接收数据包。在发送时,我只获得大约180 KB/秒的吞吐量,而当接收到时,我的吞吐量大约为525 KB/秒。在Linux上运行的相同代码接近每秒2500 KB。
当我试图以超过180 KB/秒的速率发送时,数据包会被丢弃,从而使速率降到大约那个级别。
我觉得我应该能够在发送超过180 KB/秒时获得更好的吞吐量,但不知道如何确定丢失数据包的原因是什么。
为了提高吞吐量,我该如何着手研究这种缓慢状态呢?
-更多的历史--
为了达到上述数字,我已经通过执行以下操作(这在Linux上没有什么不同,但在Interix上帮助吞吐量),从而稍微提高了吞吐量:
因此,CPU似乎是Interix上的一个限制因素,而不是Linux上的限制因素。此外,我在虚拟机上运行,虚拟机托管在虚拟机管理程序中。Windows有2个内核和2GB内存。
我注意到分析器显示了两个核心上的cpu,平均利用率不超过50%。甚至当我有两个运行我的应用程序的实例时,它仍然在两个核心上徘徊在50%左右。也许我的应用程序,它是多线程的,有一个可以从UDP套接字中读取的专用线程,以及一个用来写入UDP套接字的专用线程(在任何给定时间只有一个是活动的)--在Interix上没有很好地调度,因此我的数据包正在丢弃?
发布于 2013-06-03 01:56:41
在回答你的问题时,我根据你对问题的描述作出以下假设:
(1)在Linux中使用完全相同的程序时,除了套接字库之外,它的吞吐量为2,500 KB/秒,当然,这在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,这意味着您可能没有使用不同的套接字库。不过,我建议先检查发送缓冲区的大小。
https://stackoverflow.com/questions/16888142
复制相似问题