java - 對CLOSE_WAIT狀態中的連接進行故障排除





sockets tcp weblogic netstat (6)


這可能意味著您沒有通過accept()調用在套接字上調用“close”。

我有一個在Windows上運行在WebLogic 11g上的Java應用程序,經過幾天后,它變得沒有響應。 我注意到的一個可疑症狀是,即使服務器處於空閒狀態,大量連接(大約3000個)也會顯示在netstat並具有CLOSE_WAIT狀態。 由於應用程序服務器正在管理客戶端連接,我不確定是什麼導致了這種情況。 我們還進行了許多環回到同一服務器的Web服務調用,但我相信這些連接會正常關閉。 還有什麼可能導致這種情況,以及如何解決這樣的問題?




我找到了關於CLOSE_WAIT堆積的引用:“有些東西要么阻止在HTTP會話中發生進展(我們被卡住所以永遠不會最終調用close),或者引入了一些阻止套接字關閉的bug。有一個數字這可能發生的方式。“

想一想:在處理請求時,您的應用程序是否有任何可能被卡住的方式? 還是WebLogic本身?

檢查:你可以進行Java線程轉儲(在Oracle JVM for Linux上使用kill -SIGQUIT),試著看看你的線程是否被卡住?

檢查客戶端:首先,找出連接到CLOSE_WAIT套接字的客戶端的IP地址或主機名。 然後,查看這些客戶端是否發生任何可疑事件。




CLOSE_WAIT是遠程主機發送FIN(關閉它的連接)時本地TCP狀態機所處的狀態,但本地應用程序沒有完成相同的操作並發送了回复FIN。 雖然客戶端無法接收數據,但本地機器仍然可以在此時發送數據(除非它僅在連接上關閉了一半)。

當遠程主機關閉(發送FIN)時,您的本地應用程序將獲得某種事件(它是基本C庫中套接字上的“讀取”事件)但是從該連接讀取將返回錯誤以指示連接已關閉。 此時,本地應用程序應關閉連接。

我對Java知之甚少,對WebLogic一無所知,但我認為應用程序可能沒有正確處理讀錯誤,因此從不關閉連接。




問題是在webLogic中將“使用JSSE SSL”設置為true時觸發的錯誤。 使用WebLogic自己的SSL實現而不是JSSE對我們的應用程序來說不是問題,因此我只是取消選中該設置並且問題消失了。




我一直有同樣的問題,我一直在研究套接字來擺脫這個問題。

我先說幾句,但在我必須說我不是Java程序員之前。

我不會解釋close_wait是什麼,因為Brian White已經說了應該說的一切。

為避免close_wait,您需要確保服務器在發迴響應後不關閉連接,因為任何先斷開連接的服務器都會在close_wait和time_wait中卡住。 因此,如果您的服務器卡在close_wait中,它會在發送響應後告訴我它正在斷開連接。

你應該通過做一些事情來避免這種情況。

1 - 如果您的客戶端應用程序未使用http 1.1協議,則必須將其設置為使用它,因為'keep-alive http header選項。

2 - 如果客戶端正在運行http 1.1但不起作用,或者,如果必須使用http 1.0,則應設置連接請求標頭屬性:

connection: keep-alive

這告訴服務器在完成請求後客戶端和服務器都不應斷開連接。 通過這樣做,您的服務器將在收到每個請求後斷開連接。

3 - 在您的客戶端中,重用您的套接字。 例如,如果要在循環中創建大量套接字客戶端,則應創建一次套接字,並在每次需要發送請求時使用它。 我在我的應用程序中使用的方法是擁有一個套接字池並獲得一個可用的套接字(已經連接到服務器並且它具有keep-alive屬性)。 然後我使用它,當我完成後,我把它放回池中以便可重複使用。

4 - 如果您確實需要在發送請求後斷開連接,請確保您的客戶端執行此操作並保持connection: keep-alive

是的,當你在服務器端有很多close_waits或time_waits時,你可能會遇到問題。

看看[link] [1],它解釋了keep-alive

我希望這可以幫到你。 有了這些東西,我設法解決了我的問題。

[1]: http://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Persistenthttp://www.w3.org/Protocols/HTTP/1.1/draft-ietf-http-v11-spec-01.html#Persistent Connections




假設您有2個控制器。如果從一個控制器重定向到另一個控制器,則模型對像中的值將不會在另一個控制器中可用。 因此,如果您想共享模型對象值,那麼您必須在第一個控制器中說

addFlashAttribute("modelkey", "modelvalue");

然後第二個控制器的模型現在包含上面的鍵值對..

第二個問題? RedirectAttributes類中addAttributeaddFlashAttribute之間的區別是什麼

addAttribute將值作為requestparameters而不是model傳遞,因此當您使用addAttribute添加一些值時,您可以從request.getParameter訪問這些值

這是代碼。我已經習慣了解發生了什麼:

@RequestMapping(value = "/rm1", method = RequestMethod.POST)
public String rm1(Model model,RedirectAttributes rm) {
    System.out.println("Entered rm1 method ");

    rm.addFlashAttribute("modelkey", "modelvalue");
    rm.addAttribute("nonflash", "nonflashvalue");
    model.addAttribute("modelkey", "modelvalue");

    return "redirect:/rm2.htm";
}


@RequestMapping(value = "/rm2", method = RequestMethod.GET)
public String rm2(Model model,HttpServletRequest request) {
    System.out.println("Entered rm2 method ");

    Map md = model.asMap();
    for (Object modelKey : md.keySet()) {
        Object modelValue = md.get(modelKey);
        System.out.println(modelKey + " -- " + modelValue);
    }

    System.out.println("=== Request data ===");

    java.util.Enumeration<String> reqEnum = request.getParameterNames();
    while (reqEnum.hasMoreElements()) {
        String s = reqEnum.nextElement();
        System.out.println(s);
        System.out.println("==" + request.getParameter(s));
    }

    return "controller2output";
}




java sockets tcp weblogic netstat