Linux
如何診斷埠廣播“ZeroWindow”狀態的原因
我有兩台 CentOS 伺服器(一台是應用伺服器,另一台是數據庫)通過一個埠進行通信。每隔一段時間,應用程序伺服器就會開始廣播連接到數據庫的埠具有“ZeroWindow”(視窗大小為零)狀態(如通過 tcpdumps 所見)。
發生這種情況時,DB 伺服器上的埠的 Send Q 會填滿字節,因為 App Server 端沒有任何東西在讀取它們。
發生這種情況時,如何判斷是什麼導致我的應用伺服器將埠發送到此“ZeroWindow”狀態?
埠不會“廣播”零視窗。TCP 接收視窗 (RWIN) 是 TCP 連接的一個屬性。使用 RWIN,接收者告訴發送者它可以接收多少字節到它的緩衝區中。在等待 ACK 之前,發送方將僅發送此視窗中的字節數。當 RWIN 設置為 0 時,發送方將不再發送任何數據包,直到 RWIN 再次增加。
大小為 0 的 RWIN 通常意味著接收器沒有更多的緩衝區可用於從 TCP 連接接收數據,這可能是因為應用程序沒有收集數據,或者收集的速度不夠快。
因此,您必須在接收器(應用伺服器)端調試應用程序,以了解它為什麼將 RWIN 設置為零。
首先,查看連接的輸出
netstat -tpn
並查看連接的 Recv-Q 是否在增加或保持在高值。這表明應用程序沒有收集數據(或速度不夠快)。之後,這取決於應用程序。