昨天寫了一篇文章介紹了CLOSE_WAIT ,有個粉絲說我沒有講到到問題的關鍵,因為在實際項目中,我們關心的是如果服務器保持了大量的CLOSE_WAIT應該怎麼解決。說的也是,因為在具體的項目開發過程中,面對PM ,面對項目Schedule ,快速的重現問題、定位問題、解決問題才是王道。
這裡我分享自己在之前搭建的一個server 保持了大量的的CLOSE_WAIT的解決方法。
問題描述
開始的時候是發現自己搭建的server 運行一段時間以後就ping 不通了,客戶端也連接不上了,最後發現是server端有大量的CLOSE_WAIT狀态的tcp pcb ,至于怎麼發現的你就不要問了,我說過了我不是TCP/IP高手,發現問題是一個痛苦的過程
原因分析
我的系統運行的是FreeRTOS操作系統的 ,TCP協議作為FreeRTOS一個Task運行,TCP/IP協議棧的優先級并不高,這個其實也不是最主要的,最最要的是其他Task中,有個Task會頻繁的周期性的訪問臨界資源,說到這裡估計高手們應該都看出門道了,是的,臨界資源保護會屏蔽軟件中斷,協議棧線程受系統調度的影響,以至于server的應用程序不能實時響應網絡上連接處理。
解決方法
修改TCP/IP任務優先級,從而确保網絡任務的實時響應
擴大臨界資源訪問周期,确切的說是減少臨界資源的訪問,從而能夠讓TCP/IP任務獲得更多的CPU運行權限。
這樣修改以後,問題就沒了。對程序員來說,解掉一個棘手的bug ,有一種奧特曼打怪獸的感覺。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!