網絡通信之--accept死循環

網絡通信之--accept死循環


1. 發生背景
通信服務器一直運行,每次成功 accept ,都會分配新的 socket 資源,但是因爲未能有效的檢測和處理socket 的關閉事件,導致未能釋放 socket,最後,socket 資源被耗盡,再也不能接入新的連接了。同時,新的連接不斷的通過 TCP 層,內核不斷的通知應用層有新的可讀事件,但是因爲 accept 無法創建新連接,無法消除這些讀事件。導致內核和accept 陷入死循環。這種情況是使用 epoll的 LT (level trigger)和 seelct 情況下會發生。

2. 發生場景

 

1. C1 建立一個新連接到 reactor,,reactor 調用 accept 服務,給C1 分配新的 soakcet 資源是5。
2. C2 建立一個新連接到 reactor,,reactor 調用 accept 服務,給C1 分配新的 soakcet 資源是6。
3. 緊接着,更多的客戶端創建連接,CX 不斷的觸發新連接。Accept 不斷的分配新的 socket。
4. Reactor 不斷的釋放連接,但是釋放的速度小與新創建的 socket 速度。
5. 一個新的CX連接進來,這個時候,kernel 通知 reactor ,reactor 通知accept,accept 調用未能成功,一般返回 EMFILE。Accept 調用失敗,無法釋放內核的讀事件。
6. kernel還是不斷的通知reactor導致accept 不斷的執行,導致死循環。

發佈了84 篇原創文章 · 獲贊 26 · 訪問量 36萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章