Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
启用TCP_节点延迟的Linux环回性能_Linux_Networking_Tcp_Loopback - Fatal编程技术网

启用TCP_节点延迟的Linux环回性能

启用TCP_节点延迟的Linux环回性能,linux,networking,tcp,loopback,Linux,Networking,Tcp,Loopback,最近,我在运行一些性能测试时偶然发现了一个有趣的TCP性能问题,这些测试比较了网络性能和环回性能。在我的例子中,网络性能超过了环回性能(1Gig网络,相同子网)。在我处理的情况下,延迟是至关重要的,因此启用了TCP_节点延迟。我们提出的最好的理论是,TCP拥塞控制正在阻止数据包。我们做了一些数据包分析,我们可以肯定地看到数据包被持有,但原因并不明显。现在的问题是 1) 在什么情况下,以及为什么通过环回进行通信会比通过网络进行通信慢 2) 当尽可能快地发送时,为什么切换TCP_节点延迟对环回上的最

最近,我在运行一些性能测试时偶然发现了一个有趣的TCP性能问题,这些测试比较了网络性能和环回性能。在我的例子中,网络性能超过了环回性能(1Gig网络,相同子网)。在我处理的情况下,延迟是至关重要的,因此启用了TCP_节点延迟。我们提出的最好的理论是,TCP拥塞控制正在阻止数据包。我们做了一些数据包分析,我们可以肯定地看到数据包被持有,但原因并不明显。现在的问题是

1) 在什么情况下,以及为什么通过环回进行通信会比通过网络进行通信慢

2) 当尽可能快地发送时,为什么切换TCP_节点延迟对环回上的最大吞吐量的影响比网络上的影响大得多

3) 我们如何检测和分析TCP拥塞控制作为性能不佳的潜在解释

4) 关于这种现象的原因,有人有其他的理论吗?如果是,有什么方法来证明这一理论

这里是一些简单的点到点C++应用程序生成的示例数据:

Transport Message Size (bytes) TCP NoDelay Send Buffer (bytes) Sender Host Receiver Host Throughput (bytes/sec) Message Rate (msgs/sec) TCP 128 On 16777216 HostA HostB 118085994 922546 TCP 128 Off 16777216 HostA HostB 118072006 922437 TCP 128 On 4096 HostA HostB 11097417 86698 TCP 128 Off 4096 HostA HostB 62441935 487827 TCP 128 On 16777216 HostA HostA 20606417 160987 TCP 128 Off 16777216 HostA HostA 239580949 1871726 TCP 128 On 4096 HostA HostA 18053364 141041 TCP 128 Off 4096 HostA HostA 214148304 1673033 UnixStream 128 - 16777216 HostA HostA 89215454 696995 UnixDatagram 128 - 16777216 HostA HostA 41275468 322464 NamedPipe 128 - - HostA HostA 73488749 574130 传输消息大小(字节)TCP节点延迟发送缓冲区(字节)发送方主机接收方主机吞吐量(字节/秒)消息速率(msgs/秒) 16777216主机上的TCP 128主机A主机B 118085994 922546 TCP 128关闭16777216主机A主机B 118072006 922437 4096主机上的TCP 128主机B 11097417 86698 TCP 128关闭4096主机A主机B 62441935 487827 16777216主机上的TCP 128主机主机20606417 160987 TCP 128关闭16777216主机主机239580949 1871726 4096主机上的TCP 128主机A 18053364 141041 TCP 128关闭4096主机主机主机214148304 1673033 UnixStream 128-16777216 HostA HostA 89215454 696995 UnixDatagram 128-16777216主机主机41275468 322464 命名管道128——霍斯塔霍斯塔73488749 574130 以下是更多有用的信息:

  • 我只看到这个小问题 信息
  • HostA和HostB都有相同的 硬件套件(XeonX5550@2.67GHz,共32个核/128千兆内存/1千兆网卡)
  • 操作系统是RHEL 5.4内核(2.6.18-164.2.1.el5)
谢谢你

1或2)我不知道你为什么要费心使用环回,我个人不知道它能多接近真实的界面以及它的有效性。我知道微软在环回接口上禁用了NAGLE(如果你介意的话)。看看,有一个关于这个的讨论

3) 我会仔细观察这两种情况下的前几个数据包,看看前五个数据包是否有严重延迟。请参见

1)在什么情况下,以及为什么通过环回进行通信会比通过网络进行通信慢

环回将两台tx+rx的数据包设置+tcp chksum计算放在同一台机器上,因此它需要进行2倍的处理,而对于两台机器,您可以在它们之间分割tx/rx。这可能会对环回产生负面影响

2) 当尽可能快地发送时,为什么切换TCP_节点延迟对环回上的最大吞吐量的影响比网络上的影响大得多

不确定您是如何得出这个结论的,但是环回与网络的实现方式非常不同,如果您试图将它们推到极限,您将遇到不同的问题。环回接口(如回答1中所述)会导致同一台机器上的tx+rx处理开销。另一方面,NIC在其循环缓冲区中可以有多少未完成的数据包等方面有很多限制,这将导致完全不同的瓶颈(芯片之间的瓶颈也有很大差异,甚至芯片之间的交换机也有很大差异)

3) 我们如何检测和分析TCP拥塞控制作为性能不佳的潜在解释

拥塞控制只有在数据包丢失时才起作用。你看到丢包了吗?否则,您可能会遇到tcp窗口大小与网络延迟因素的限制

4) 关于这种现象的原因,有人有其他的理论吗?如果是,有什么方法来证明这一理论

我不理解你在这里提到的现象。我在您的表中看到的是,您有一些带有大发送缓冲区的套接字—这是完全合法的。在一台速度很快的机器上,您的应用程序肯定能够生成比网络所能输出的数据更多的数据,因此我不确定您在这里将什么归类为问题

最后一点注意:由于各种原因,小消息会对您的网络造成更大的性能影响,例如:

  • 每个包的开销是固定的(对于mac+ip+tcp报头),负载越小,开销就越大
  • 许多NIC限制都与未完成数据包的数量有关,这意味着当使用较小的数据包时,您将使用更少的数据遇到NIC瓶颈
  • 网络本身取决于数据包开销,因此您可以通过网络传输的最大数据量也取决于数据包的大小