2012-07-10 63 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