網路庫中線程打開的最大文件描述符數量超過限制處理

當用epoll監聽accpet的時候,若是線程打開的文件描述符數量已經達到上限。html

當有新的鏈接到來的時候,epoll被喚醒,accpet的返回值爲EMFILE。算法

若是不處理EMFILE,那麼下一輪epoll_wait,會被繼續喚醒,造成相似輪詢的情形。線程

解決方法爲:htm

  1. 調高進程的最大文件描述符數量。
  2. 死等,鴕鳥算法。直到可以accpet到文件描述符
  3. 關閉進程。
  4. 不在監聽listen fd
  5. 使用ET模式,可是,當漏掉依次accept的時候,那麼之後就不再會收到鏈接了。
  6. 實現準備一個文件描述符,在收到EMFILE的時候就關閉它,而後accetp,緊接着再關閉,再次打開原來的文件描述符。
  7. 定時踢掉沒有數據的鏈接。

方法6,存在競爭的狀況。(是在沒想出來,爲何會競爭,線程間的文件描述符,也不共享。)多是信號中打開文件?blog

若是使用方法4,那麼須要配合一個自定的文件描述符上限,一個原子變量示打開的文件描述符,超過上限,accept之後,直接關閉。進程

方法7,定時踢掉沒有數據的鏈接,參照:定時踢掉空閒鏈接get

相關文章
相關標籤/搜索