国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何優(yōu)雅的處理 Accept 出現(xiàn) Emfile 的問題

系統(tǒng) Linux
在服務(wù)器的開發(fā)中,有時(shí)會遇到這種情況:當(dāng)調(diào)用 accept 函數(shù)接受客戶端連接,函數(shù)返回失敗,對應(yīng)的錯(cuò)誤碼是 EMFILE, 它表示當(dāng)前進(jìn)程打開的文件描述符已達(dá)上限,此時(shí),服務(wù)器不能再接受客戶端連接。

[[393901]]

本文轉(zhuǎn)載自微信公眾號「Linux開發(fā)那些事兒」,作者LinuxThings。轉(zhuǎn)載本文請聯(lián)系Linux開發(fā)那些事兒公眾號。

通常情況下,服務(wù)端調(diào)用 accept 函數(shù)會返回一個(gè)新的文件描述符,用于和客戶端之間的數(shù)據(jù)傳輸

在服務(wù)器的開發(fā)中,有時(shí)會遇到這種情況:當(dāng)調(diào)用 accept 函數(shù)接受客戶端連接,函數(shù)返回失敗,對應(yīng)的錯(cuò)誤碼是 EMFILE, 它表示當(dāng)前進(jìn)程打開的文件描述符已達(dá)上限,此時(shí),服務(wù)器不能再接受客戶端連接

當(dāng)遇到上述問題,怎么合理的處理呢,下面就來分析一下

建立連接的流程

先簡單回顧下客戶端和服務(wù)器建立連接的流程,具體的如下圖所示:

1. 客戶端發(fā)起 SYN 請求

2. 服務(wù)器收到客戶端的 SYN 請求后,內(nèi)核把連接放入半連接隊(duì)列,同時(shí)給客戶端返回一個(gè) SYN + ACK

3. 客戶端向服務(wù)器返回一個(gè)確認(rèn)的 ACK, 服務(wù)器收到本次 ACK 之后,三次握手完成,同時(shí),內(nèi)核把連接從半連接隊(duì)列中移除,創(chuàng)建新完全連接,加入到全連接隊(duì)列中

4. 應(yīng)用層調(diào)用 accept 函數(shù)從全連接隊(duì)列中取出連接

上面的第 1、第 2、第 3 步是 TCP 的三次握手,它是由內(nèi)核中TCP協(xié)議完成的, 第 4 步是應(yīng)用層調(diào)用 accept 接口

在 epoll 中的問題

epoll 是 Linux中IO多路復(fù)用模型,在服務(wù)器的開發(fā)中有廣泛的應(yīng)用,下面就以 epoll 為例來詳細(xì)說明

服務(wù)器端創(chuàng)建偵聽文件描述符 listenfd 之后, 向 epoll 注冊讀事件

當(dāng) epoll 檢測到 listenfd 上有讀事件發(fā)生,會立即通知應(yīng)用層,應(yīng)用層調(diào)用 accept 接受新連接,而此時(shí)進(jìn)程打開的文件描述符數(shù)量已經(jīng)達(dá)到上限了,所以每次 accept 都是失敗的

這里會出現(xiàn)以下幾個(gè)問題

  1. 由于 每次 accept 都失敗了,相當(dāng)于 listenfd 上的可讀事件沒有處理,epoll 會不停的觸發(fā) listenfd 上的可讀事件,應(yīng)用層也就會不停的調(diào)用 accept,然后又出現(xiàn) accept 調(diào)用失敗,如此這般不停的執(zhí)行無效的循環(huán),白白浪費(fèi)了CPU的資源
  2. 上面提到服務(wù)器在不停的執(zhí)行無效的循環(huán), 將會引發(fā)另一個(gè)問題,如果此時(shí)有新客戶端連接到來,建立連接的過程會很慢

前面說的 epoll 默認(rèn)是使用了水平觸發(fā)模式,如果使用垂直觸發(fā)模式會出現(xiàn)什么問題呢?

垂直觸發(fā)模式下,listenfd 從無讀事件狀態(tài)到有讀事件狀態(tài)時(shí),才會通知到應(yīng)用層,在應(yīng)用層處理完 listenfd 上所有的讀事件之前,epoll 不會再通知應(yīng)用層

也就是說,應(yīng)用層收到 listenfd 上讀事件通知之后,需要把 listenfd 上所有的讀事件全部處理完,下次listenfd 上再有讀事件時(shí),才會通知應(yīng)用層

回到 accept 的問題上,在垂直觸發(fā)模式下,當(dāng) epoll 通知應(yīng)用層 listenfd 上有可讀事件時(shí),應(yīng)用層調(diào)用 accept, 由于此時(shí)進(jìn)程打開的文件描述符數(shù)量已經(jīng)達(dá)到上限了,所以 accept 調(diào)用失敗

也即 listenfd 上的可讀事件還沒有處理,在應(yīng)用層處理完 listenfd 上可讀事件之前,epoll 不會再通知應(yīng)用層 listenfd 上有可讀事件

如果在應(yīng)用層處理完 listenfd 上可讀事件之前,有新的客戶端連接到來,這個(gè)時(shí)候 epoll 是不會通知應(yīng)用層 listenfd 上有可讀事件,這會導(dǎo)致一個(gè)嚴(yán)重的問題:accept 只要出現(xiàn)了 EMFILE的錯(cuò)誤碼,就再也無法接受客戶端的連接了

所以,當(dāng)出現(xiàn) EMFILE 時(shí),不管使用 epoll 的水平觸發(fā)模式還是垂直觸發(fā)模式都會存在問題

如何解決

EMFILE 表示進(jìn)程打開的文件描述符數(shù)量達(dá)到上限了,可以把這個(gè)值調(diào)大些,但這治標(biāo)不治本

本來系統(tǒng)設(shè)置文件描述符數(shù)量上限是為了限制進(jìn)程對系統(tǒng)資源的過度占用,況且,這個(gè)值調(diào)整到多大合適呢,總不能無限大吧,所以調(diào)整上限值的方式不是最合適的方式

accept 成功時(shí)會返回一個(gè)新的文件描述符,如果此時(shí)進(jìn)程打開的文件描述符數(shù)量已經(jīng)達(dá)到上限了,就會返回失敗

假如此時(shí)能關(guān)閉一個(gè)空閑的文件描述符,讓出一個(gè)名額,再調(diào)用 accept 就會創(chuàng)建成功,這種方式具體的處理步驟如下:

1、事先準(zhǔn)備一個(gè)空閑的文件描述符 idlefd,相當(dāng)于先占一個(gè)"坑"位

2、調(diào)用 close 關(guān)閉 idlefd,關(guān)閉之后,進(jìn)程就會獲得一個(gè)文件描述符名額

3、再次調(diào)用 accept 函數(shù), 此時(shí)就會返回新的文件描述符 clientfd, 立刻調(diào)用 close 函數(shù),關(guān)閉 clientfd

4、重新創(chuàng)建空閑文件描述符 idlefd,重新占領(lǐng) "坑" 位,再出現(xiàn)這種情況的時(shí)候又可以使用

由于測試代碼比較長,這里就不貼了,感興趣可以通過文末的方式獲取,下面是處理 EMFILE 的偽代碼:

  1. int ret = accept( listenfd, (struct sockaddr*)&addr, sizeof(addr) ); 
  2.  
  3. if (-1 == ret) 
  4.   if ( errno == EMFILE ) 
  5.   { 
  6.      //關(guān)閉空閑文件描述符,釋放 "坑"位 
  7.      close(idlefd); 
  8.       
  9.      //接受 clientfd 
  10.      clientfd = accept( listenfd, nullptr, nullptr); 
  11.      //關(guān)閉 clientfd,防止一直觸發(fā) listenfd 上的可讀事件 
  12.      close(clientfd); 
  13.       
  14.      //重新占領(lǐng) "坑"位 
  15.      idlefd = ::open("/dev/null", O_RDONLY | O_CLOEXEC); 
  16.   } 

 

責(zé)任編輯:武曉燕 來源: Linux開發(fā)那些事兒
相關(guān)推薦

2021-06-02 00:29:08

Node.jsAcceptEmfile

2023-10-10 13:23:18

空指針異常Java

2018-01-24 19:59:03

數(shù)據(jù)庫Oracle壞塊

2019-01-24 16:11:19

前端全局異常數(shù)據(jù)校驗(yàn)

2022-05-16 09:03:29

CPU服務(wù)日志

2022-02-15 08:38:04

錯(cuò)誤邏輯異常編程程序

2017-07-26 11:32:50

NETRabbitMQ系統(tǒng)集成

2021-01-19 10:35:49

JVM場景函數(shù)

2015-11-26 10:53:45

LinuxWindowsMac OS

2021-06-17 09:32:39

重復(fù)請求并發(fā)請求Java

2020-10-16 11:48:06

服務(wù)器系統(tǒng)運(yùn)維

2021-06-05 13:44:08

遞歸策略鏈表

2021-03-04 08:19:31

警告屏蔽函數(shù)

2018-06-24 09:27:55

線程Tomcat多線程

2024-09-26 10:51:51

2022-03-01 21:25:30

對象代碼Proxy

2021-10-04 08:26:10

用戶名密碼信息

2025-01-20 07:10:00

LambdaJavanull

2021-07-05 07:55:11

Goroutine錯(cuò)誤語言

2025-02-27 09:39:56

JavaJava 8對象
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

337p日本欧洲亚洲大胆色噜噜| 日韩高清国产精品| 久久高清免费| 国产一区自拍视频| 国产精品综合二区| 拍拍拍999自拍偷| 国产精品嫩草99a| 九色在线视频蝌蚪| 亚洲欧美精品伊人久久| 精品视频一区二区三区四区五区| 久久视频在线看| 成人精品影视| 四虎永久免费网站| 国产精品美女一区二区三区| 午夜精品一区| 伦伦影院午夜日韩欧美限制| 欧美国产精品| 男人操女人逼免费视频| 欧洲国内综合视频| 亚洲图片久久| 六月婷婷在线视频| 精品欧美久久久| 欧美区国产区| 狠狠干夜夜操| 不卡毛片在线看| 九九精品视频在线看| xxxxx日韩| 国产精品久久久久久婷婷天堂| eeuss影院一区二区三区| 日本孕妇大胆孕交无码| 91黄在线观看| 一区二区在线电影| 天堂av一区| 法国空姐在线观看免费| 91精品欧美久久久久久动漫 | 欧美日韩国产一中文字不卡| 国产一区二区| 美女黄色免费看| 精品国产凹凸成av人网站| 国产一区二区三区四区三区四| jizz蜜桃视频在线观看| 毛片精品免费在线观看| 丁香六月综合激情| 性欧美又大又长又硬| 亚欧洲精品在线视频免费观看| 欧美色图一区二区三区| 国产精品www.| 国产对白叫床清晰在线播放| 国产日韩换脸av一区在线观看| 国产精品国产三级国产aⅴ原创 | 久久亚洲精品国产亚洲老地址| 国产在线精品免费| 自拍一区在线观看| 成人在线观看www| 国产视频丨精品|在线观看| 视频一区视频二区中文字幕| 91在线视频| 国产精品区一区二区三含羞草| 欧美色视频日本版| 影音先锋日韩在线| eeuss影院www在线播放| 牛人盗摄一区二区三区视频| 欧美一区二区三区小说| av基地在线| 国产999精品久久| 欧洲杯什么时候开赛| 粉嫩粉嫩芽的虎白女18在线视频| 欧美极品美女视频| 91精品丝袜国产高跟在线| 粉嫩虎白女毛片人体| 欧美床上激情在线观看| 香蕉网站在线观看| 999香蕉视频| 欧美日韩国产三区| 欧美午夜宅男影院在线观看| 一区二区三区毛片免费| 青青草在线免费观看| 国产乱码精品一区二区三区日韩精品| 欧美性猛交xxxx黑人猛交| 欧美日本亚洲韩国国产| 免费观看在线黄色网| 美日韩免费视频| 国产视频精品自拍| 91浏览器在线视频| 国产免费播放一区二区| 98在线视频| 伊人久久大香线蕉av一区| 中文字幕久热精品在线视频| 国产欧美精品一区二区三区四区 | 毛葺葺老太做受视频| 久久久久久久激情视频| 亚洲电影在线播放| 国产精品jizz在线观看美国| 国产福利视频在线观看| 国产成人精品免费看在线播放| 色婷婷综合成人| 亚洲美女视频一区| 欧美色图首页| 日韩电影免费观看高清完整版| 日本激情视频在线播放| 亚洲a中文字幕| 亚洲人成电影网站色www| 中文字幕乱码亚洲精品一区| 欧美日韩1区| 精品久久毛片| 日韩美女一级视频| 日本香蕉视频在线观看| 国产精品国产三级国产专播精品人 | 91精品在线免费| 成人午夜又粗又硬又大| 免费看日本一区二区| 大地资源网3页在线观看| 草草久久久无码国产专区| 国产精品福利网| 日韩经典中文字幕在线观看| 中文字幕一区二区在线播放| 国产色综合网| 北条麻妃在线一区二区免费播放 | www国产91| 色综合久久66| 成人永久免费视频| 91亚洲一区| 精品免费av在线 | 福利成人在线观看| 给我免费播放片在线观看| 91精品久久久久久综合乱菊| 精品调教chinesegay| 一区二区三区中文字幕| 寂寞少妇一区二区三区| 成人av资源电影网站| xxxx另类黑人| 日本调教视频在线观看| 国产盗摄视频在线观看| 成人写真视频福利网| 最好看的2019年中文视频| 欧美午夜影院在线视频| 久久女同精品一区二区| 乱码第一页成人| 大色综合视频网站在线播放| 亚洲男男av| 成年人视频免费在线播放| 亚洲欧美一区二区三区在线播放| 久久精品国产精品亚洲色婷婷| 狠狠色噜噜狠狠色综合久| 久久久久久久久久久久av| 日韩欧美国产不卡| 黄色成人在线播放| 国产欧美一区二区精品秋霞影院| 日本亚洲免费观看| 亚洲一区欧美| 欧美日韩一区二区三区在线电影| 久久男人天堂| 欧美尤物美女在线| 91九色porny在线| 欧美黄色一级片视频| 欧美 国产 精品| 视频一区二区在线| 精品免费日产一区一区三区免费| 国产精品久久久久久久av大片| 欧美激情综合亚洲一二区| 中文字幕精品av| 日韩精品在线免费观看视频| 欧美日韩精品一区二区在线播放| 亚洲自拍偷拍av| 亚洲日本在线a| 中文字幕中文字幕一区| 久久先锋影音av| 91在线云播放| www.亚洲精品| 成人av综合在线| 国产剧情av麻豆香蕉精品| 首页亚洲欧美制服丝腿| 99伊人成综合| 一本色道久久| 99精品视频免费全部在线| 欧美日韩mv| 欧美日韩一视频区二区| 五月天久久久| 欧美日韩一二三四| 精品大片一区二区| 亚洲三级网址| 精品国产一级毛片| 亚洲日本三级| 狠狠操综合网| 精品免费在线| 日韩欧美视频| 香蕉视频国产精品 | 亚洲精品蜜桃久久久久久| 在线视频一区观看| 亚洲一区二区在线免费观看| 视频在线99| 国产又黄又爽免费视频| 老司机午夜网站| 国产 欧美 日韩 一区| 欧美精品自拍视频| 无码精品国产一区二区三区免费| 成人免费观看cn| 欧美 激情 在线| 99热在线免费| 1区不卡电影|