Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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
Java 将Solaris迁移到RH:网络延迟问题、tcp窗口大小;其他tcp参数_Java_Networking_Tcp_Solaris_Redhat - Fatal编程技术网

Java 将Solaris迁移到RH:网络延迟问题、tcp窗口大小;其他tcp参数

Java 将Solaris迁移到RH:网络延迟问题、tcp窗口大小;其他tcp参数,java,networking,tcp,solaris,redhat,Java,Networking,Tcp,Solaris,Redhat,我有一个客户机/服务器应用程序(Java),我正在从Solaris迁移到RH Linux。 自从我开始在RH中运行它以来,我注意到了一些与延迟相关的问题。 我设法找出了如下问题: 客户端向服务器发送一行5条消息(每个32字节)(相同的应用程序时间戳) 服务器回显消息 客户端接收回复并打印每个消息的往返时间 在Solaris中,一切正常:我在发送原始消息后大约80毫秒的时间内同时收到所有5条回复(客户端和服务器之间相距数千英里:我的ping RTT为80毫秒,一切正常) 在RH中,前3条消息正

我有一个客户机/服务器应用程序(Java),我正在从Solaris迁移到RH Linux。 自从我开始在RH中运行它以来,我注意到了一些与延迟相关的问题。 我设法找出了如下问题:

  • 客户端向服务器发送一行5条消息(每个32字节)(相同的应用程序时间戳)
  • 服务器回显消息
  • 客户端接收回复并打印每个消息的往返时间
在Solaris中,一切正常:我在发送原始消息后大约80毫秒的时间内同时收到所有5条回复(客户端和服务器之间相距数千英里:我的ping RTT为80毫秒,一切正常)

在RH中,前3条消息正常回显(它们在发送后80毫秒到达),但随后的2条消息在80毫秒后到达(因此总共160毫秒RTT)

模式总是一样的。显然看起来像是TCP问题

在我的solaris机箱上,我以前使用2个特定选项配置了tcp堆栈:

  • 全局禁用nagle算法
  • 将tcp\u延迟\u确认\u最大值设置为0
  • 在RH上,无法全局禁用nagle,但我在所有应用程序的套接字(TCP_NODELAY)上都禁用了它

    因此,我开始使用tcpdump(在服务器机器上),并比较两种输出:

    SOLARIS

     22 2.085645    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=111 Ack=106 Win=66672 Len=22    "MSG_1 RCV"
     23 2.085680    server         client          TCP      6006 > 56150 [ACK] Seq=106 Ack=133 Win=50400 Len=0
     24 2.085908    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=133 Ack=106 Win=66672 Len=22    "MSG_2 RCV"
     25 2.085925    server         client          TCP      6006 > 56150 [ACK] Seq=106 Ack=155 Win=50400 Len=0
     26 2.086175    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=155 Ack=106 Win=66672 Len=22    "MSG_3 RCV"
     27 2.086192    server         client          TCP      6006 > 56150 [ACK] Seq=106 Ack=177 Win=50400 Len=0
     28 2.086243    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=106 Ack=177 Win=50400 Len=21    "MSG_1 ECHO"
     29 2.086440    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=177 Ack=106 Win=66672 Len=22    "MSG_4 RCV"
     30 2.086454    server         client          TCP      6006 > 56150 [ACK] Seq=127 Ack=199 Win=50400 Len=0
     31 2.086659    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=127 Ack=199 Win=50400 Len=21    "MSG_2 ECHO"
     32 2.086708    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=199 Ack=106 Win=66672 Len=22    "MSG_5 RCV"
     33 2.086721    server         client          TCP      6006 > 56150 [ACK] Seq=148 Ack=221 Win=50400 Len=0
     34 2.086947    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=148 Ack=221 Win=50400 Len=21    "MSG_3 ECHO"
     35 2.087196    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=169 Ack=221 Win=50400 Len=21    "MSG_4 ECHO"
     36 2.087500    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=190 Ack=221 Win=50400 Len=21    "MSG_5 ECHO"
     37 2.165390    client         server          TCP      56150 > 6006 [ACK] Seq=221 Ack=148 Win=66632 Len=0
     38 2.166314    client         server          TCP      56150 > 6006 [ACK] Seq=221 Ack=190 Win=66588 Len=0
     39 2.364135    client         server          TCP      56150 > 6006 [ACK] Seq=221 Ack=211 Win=66568 Len=0
    
     17 2.081163    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=111 Ack=106 Win=66672 Len=22    "MSG_1 RCV"
     18 2.081178    server         client          TCP      6006 > 55879 [ACK] Seq=106 Ack=133 Win=5888 Len=0
     19 2.081297    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=106 Ack=133 Win=5888 Len=21 "MSG_1 ECHO"
     20 2.081711    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=133 Ack=106 Win=66672 Len=22    "MSG_2 RCV"
     21 2.081761    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=155 Ack=106 Win=66672 Len=22    "MSG_3 RCV"
     22 2.081846    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=127 Ack=177 Win=5888 Len=21 "MSG_2 ECHO"
     23 2.081995    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=148 Ack=177 Win=5888 Len=21 "MSG_3 ECHO"
     24 2.082011    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=177 Ack=106 Win=66672 Len=22    "MSG_4 RCV"
     25 2.082362    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=199 Ack=106 Win=66672 Len=22    "MSG_5 RCV"
     26 2.082377    server         client          TCP      6006 > 55879 [ACK] Seq=169 Ack=221 Win=5888 Len=0
     27 2.171003    client         server          TCP      55879 > 6006 [ACK] Seq=221 Ack=148 Win=66632 Len=0
     28 2.171019    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=169 Ack=221 Win=5888 Len=42 "MSG_4 ECHO + MSG_5 ECHO"
     29 2.257498    client         server          TCP      55879 > 6006 [ACK] Seq=221 Ack=211 Win=66568 Len=0
    
    REDHAT

     22 2.085645    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=111 Ack=106 Win=66672 Len=22    "MSG_1 RCV"
     23 2.085680    server         client          TCP      6006 > 56150 [ACK] Seq=106 Ack=133 Win=50400 Len=0
     24 2.085908    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=133 Ack=106 Win=66672 Len=22    "MSG_2 RCV"
     25 2.085925    server         client          TCP      6006 > 56150 [ACK] Seq=106 Ack=155 Win=50400 Len=0
     26 2.086175    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=155 Ack=106 Win=66672 Len=22    "MSG_3 RCV"
     27 2.086192    server         client          TCP      6006 > 56150 [ACK] Seq=106 Ack=177 Win=50400 Len=0
     28 2.086243    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=106 Ack=177 Win=50400 Len=21    "MSG_1 ECHO"
     29 2.086440    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=177 Ack=106 Win=66672 Len=22    "MSG_4 RCV"
     30 2.086454    server         client          TCP      6006 > 56150 [ACK] Seq=127 Ack=199 Win=50400 Len=0
     31 2.086659    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=127 Ack=199 Win=50400 Len=21    "MSG_2 ECHO"
     32 2.086708    client         server          TCP      56150 > 6006 [PSH, ACK] Seq=199 Ack=106 Win=66672 Len=22    "MSG_5 RCV"
     33 2.086721    server         client          TCP      6006 > 56150 [ACK] Seq=148 Ack=221 Win=50400 Len=0
     34 2.086947    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=148 Ack=221 Win=50400 Len=21    "MSG_3 ECHO"
     35 2.087196    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=169 Ack=221 Win=50400 Len=21    "MSG_4 ECHO"
     36 2.087500    server         client          TCP      6006 > 56150 [PSH, ACK] Seq=190 Ack=221 Win=50400 Len=21    "MSG_5 ECHO"
     37 2.165390    client         server          TCP      56150 > 6006 [ACK] Seq=221 Ack=148 Win=66632 Len=0
     38 2.166314    client         server          TCP      56150 > 6006 [ACK] Seq=221 Ack=190 Win=66588 Len=0
     39 2.364135    client         server          TCP      56150 > 6006 [ACK] Seq=221 Ack=211 Win=66568 Len=0
    
     17 2.081163    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=111 Ack=106 Win=66672 Len=22    "MSG_1 RCV"
     18 2.081178    server         client          TCP      6006 > 55879 [ACK] Seq=106 Ack=133 Win=5888 Len=0
     19 2.081297    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=106 Ack=133 Win=5888 Len=21 "MSG_1 ECHO"
     20 2.081711    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=133 Ack=106 Win=66672 Len=22    "MSG_2 RCV"
     21 2.081761    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=155 Ack=106 Win=66672 Len=22    "MSG_3 RCV"
     22 2.081846    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=127 Ack=177 Win=5888 Len=21 "MSG_2 ECHO"
     23 2.081995    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=148 Ack=177 Win=5888 Len=21 "MSG_3 ECHO"
     24 2.082011    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=177 Ack=106 Win=66672 Len=22    "MSG_4 RCV"
     25 2.082362    client         server          TCP      55879 > 6006 [PSH, ACK] Seq=199 Ack=106 Win=66672 Len=22    "MSG_5 RCV"
     26 2.082377    server         client          TCP      6006 > 55879 [ACK] Seq=169 Ack=221 Win=5888 Len=0
     27 2.171003    client         server          TCP      55879 > 6006 [ACK] Seq=221 Ack=148 Win=66632 Len=0
     28 2.171019    server         client          TCP      6006 > 55879 [PSH, ACK] Seq=169 Ack=221 Win=5888 Len=42 "MSG_4 ECHO + MSG_5 ECHO"
     29 2.257498    client         server          TCP      55879 > 6006 [ACK] Seq=221 Ack=211 Win=66568 Len=0
    
    因此,我得到确认,RH的工作不正常:数据包28发送得太晚,看起来服务器在做任何事情之前正在等待数据包27的确认

    在我看来这是最可能的原因

    然后我意识到Solaris和RH转储上的“Win”参数是不同的:Solaris上为50400,RH上为5888。这是另一个暗示

    我阅读了有关幻灯片窗口和缓冲区窗口的文档,并在我的套接字上使用java中的rcvBuffer和sendBuffer,但从未设法将这个5888值更改为任何其他值(每次我都直接使用tcpdump进行检查)

    有人知道怎么做吗?我很难获得明确的信息,因为在某些情况下,我可能需要绕过“自动协商”,等等

    通过在右侧将“tcp_slow_start_after_idle”参数设置为0,我最终仅部分解决了最初的问题,但根本没有更改“win”参数。前4组(共5条消息)也存在相同的问题,tcpdump中存在TCP重新传输和TCP Dup ACK,然后,以下所有组(共5条消息)的问题完全消失

    对我来说,这似乎不是一个非常干净和/或通用的解决方案。我真的很想在两种操作系统下复制完全相同的条件


    我会继续研究,但TCP专家的任何帮助都将不胜感激

    看来拥塞避免算法正在启动

    请注意,从数据包26开始,服务器已经看到并确认了来自客户端的所有内容,但是客户端只确认了服务器的初始SYN—它还没有确认服务器的任何消息。还要注意,再次启动的数据包27是客户端确认服务器的前两批数据(数据包19和22)


    Red Hat box使用哪种拥塞控制算法?(
    /proc/sys/net/ipv4/tcp\u拥塞控制)
    )-您可以尝试切换到其他可用的路径之一。

    跟踪与您的描述不匹配。redhat跟踪比Solaris花费的时间更少,因此我看不到延迟问题。此外,回音速度非常快(小于1毫秒),因此看起来这是在环回或LAN上完成的。左侧的时间戳无法比较(solaris和RH之间),它们只是相对于每个框中接收到第一个数据包的时间(我认为),几乎可以是任何时候。这些测试不是同时进行的。问题是在服务器上测量的接收消息和回显回复之间的响应时间。在solaris上,所有回音在右侧收到第一条消息(2.087500-2.085645=0.001855)后约2毫秒内发送,第四条和第五条回音在90毫秒后发送(2.171019-2.081163)。是的,这是我关心的问题,我看到很多回音没有被客户端确认,想象一下,在收到ACK之前,某种机制会停止服务器发送任何内容:它只在收到ACK后发送第四个和第五个回音。只是不太清楚是什么导致了这种机制以及如何影响它。将围绕拥塞控制进行研究,目前它是“立方体”,将研究。。。谢谢@巴斯蒂安:试着把它设置为“雷诺”(只需
    echo“reno”>/proc/sys/net/ipv4/tcp\u拥塞控制
    ),看看你是否更喜欢这种行为。