2012-07-10 99 views
2

我们的Java应用程序由一个客户端和一个服务器组成。在我们的生产环境中,建立连接需要很长时间(约40秒)。Java应用程序中的TCP握手很慢

start     client > server SYN 
2 milliseconds later server < client SYN,ACK 
38 *seconds* later  client > server ACK 

在我们的其他环境中,发生的所有三个包几乎瞬间:

我们使用tcpdump和可以看到下面的包是建立连接时捕获的网络流量。

任何人都可以提出什么可能会导致38秒延迟,或建议步骤来诊断它?请注意,由于这是一个生产环境,因此我们很难对诊断代码进行更改。

以下是关于我们的环境的一些细节:

  • 客户端使用SocketConnector从Apache Mina 1.0.1,其内部使用java.nio.channel.SocketChannel.connect(..)。
  • 的客户端的IBM WebSphere内部7.0.0.17
  • Java版本1.6.0 =,Java编译器= j9jit24,Java虚拟机的名称= IBM J9 VM
  • OS是AIX 6.1版本
+0

是来自客户端还是服务器的tcpdump? – 2012-07-10 16:03:16

+0

我认为tcpdump来自客户端(不幸的是它并没有被我捕获)。 – 2012-07-12 16:29:32

+1

然后慢慢来自客户端。您可能想了解SYNC-ACK和ACK之间A​​IX堆栈上发生的事情。 – 2012-07-12 16:32:47

回答

1

运行你没有用完描述符和/或你的TCP接受队列已满吗?

+0

您是指客户端还是服务器端?我问的原因是我认为接受队列只与服务器端相关,我不认为这是延迟发生的地方。 – 2012-07-12 08:06:22

+0

哈哈是的,你是对的 – 2012-07-12 14:05:03