成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

epoll LT/ET 深入剖析

microelec / 2154人閱讀

摘要:深入剖析事件有兩種模型水平觸發(fā)接收緩沖區(qū)不為空有數(shù)據(jù)可讀讀事件一直觸發(fā)發(fā)送緩沖區(qū)不滿可以繼續(xù)寫(xiě)入數(shù)據(jù)寫(xiě)事件一直觸發(fā)符合思維習(xí)慣,返回的事件就是的狀態(tài)邊沿觸發(fā)的接收緩沖區(qū)狀態(tài)變化時(shí)觸發(fā)讀事件,即空的接收緩沖區(qū)剛接收到數(shù)據(jù)時(shí)觸發(fā)讀事件的發(fā)送緩沖

epoll LT/ET 深入剖析

EPOLL事件有兩種模型:

Level Triggered (LT) 水平觸發(fā)
.socket接收緩沖區(qū)不為空 有數(shù)據(jù)可讀 讀事件一直觸發(fā)
.socket發(fā)送緩沖區(qū)不滿 可以繼續(xù)寫(xiě)入數(shù)據(jù) 寫(xiě)事件一直觸發(fā)
符合思維習(xí)慣,epoll_wait返回的事件就是socket的狀態(tài)

Edge Triggered (ET) 邊沿觸發(fā)
.socket的接收緩沖區(qū)狀態(tài)變化時(shí)觸發(fā)讀事件,即空的接收緩沖區(qū)剛接收到數(shù)據(jù)時(shí)觸發(fā)讀事件
.socket的發(fā)送緩沖區(qū)狀態(tài)變化時(shí)觸發(fā)寫(xiě)事件,即滿的緩沖區(qū)剛空出空間時(shí)觸發(fā)讀事件
僅在狀態(tài)變化時(shí)觸發(fā)事件

ET還是LT?

LT的處理過(guò)程:
. accept一個(gè)連接,添加到epoll中監(jiān)聽(tīng)EPOLLIN事件
. 當(dāng)EPOLLIN事件到達(dá)時(shí),read fd中的數(shù)據(jù)并處理
. 當(dāng)需要寫(xiě)出數(shù)據(jù)時(shí),把數(shù)據(jù)write到fd中;如果數(shù)據(jù)較大,無(wú)法一次性寫(xiě)出,那么在epoll中監(jiān)聽(tīng)EPOLLOUT事件
. 當(dāng)EPOLLOUT事件到達(dá)時(shí),繼續(xù)把數(shù)據(jù)write到fd中;如果數(shù)據(jù)寫(xiě)出完畢,那么在epoll中關(guān)閉EPOLLOUT事件

ET的處理過(guò)程:
. accept一個(gè)一個(gè)連接,添加到epoll中監(jiān)聽(tīng)EPOLLIN|EPOLLOUT事件
. 當(dāng)EPOLLIN事件到達(dá)時(shí),read fd中的數(shù)據(jù)并處理,read需要一直讀,直到返回EAGAIN為止
. 當(dāng)需要寫(xiě)出數(shù)據(jù)時(shí),把數(shù)據(jù)write到fd中,直到數(shù)據(jù)全部寫(xiě)完,或者write返回EAGAIN
. 當(dāng)EPOLLOUT事件到達(dá)時(shí),繼續(xù)把數(shù)據(jù)write到fd中,直到數(shù)據(jù)全部寫(xiě)完,或者write返回EAGAIN

從ET的處理過(guò)程中可以看到,ET的要求是需要一直讀寫(xiě),直到返回EAGAIN,否則就會(huì)遺漏事件。而LT的處理過(guò)程中,直到返回EAGAIN不是硬性要求,但通常的處理過(guò)程都會(huì)讀寫(xiě)直到返回EAGAIN,但LT比ET多了一個(gè)開(kāi)關(guān)EPOLLOUT事件的步驟

LT的編程與poll/select接近,符合一直以來(lái)的習(xí)慣,不易出錯(cuò)
ET的編程可以做到更加簡(jiǎn)潔,某些場(chǎng)景下更加高效,但另一方面容易遺漏事件,容易產(chǎn)生bug

這里有兩個(gè)簡(jiǎn)單的例子演示了LT與ET的用法(其中epoll-et的代碼比epoll要少10行):
https://github.com/yedf/handy/blob/master/raw-examples/epoll.cc
https://github.com/yedf/handy/blob/master/raw-examples/epoll-et.cc

針對(duì)容易觸發(fā)LT開(kāi)關(guān)EPOLLOUT事件的情景(讓服務(wù)器返回1M大小的數(shù)據(jù)),我用ab做了性能測(cè)試
測(cè)試的結(jié)果顯示ET的性能稍好,詳情如下:
LT 啟動(dòng)命令 ./epoll a
ET 啟動(dòng)命令 ./epoll-et a
ab 命令:ab -n 1000 -k 127.0.0.1/
LT 結(jié)果:Requests per second: 42.56 [#/sec] (mean)
ET 結(jié)果:Requests per second: 48.55 [#/sec] (mean)

當(dāng)我把服務(wù)器返回的數(shù)據(jù)大小改為48576時(shí),開(kāi)關(guān)EPOLLOUT更加頻繁,性能的差異更大
ab 命令:ab -n 5000 -k 127.0.0.1/
LT 結(jié)果:Requests per second: 745.30 [#/sec] (mean)
ET 結(jié)果:Requests per second: 927.56 [#/sec] (mean)

對(duì)于nginx這種高性能服務(wù)器,ET模式是很好的,而其他的通用網(wǎng)絡(luò)庫(kù),更多是使用LT,避免使用的過(guò)程中出現(xiàn)bug

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/39240.html

相關(guān)文章

  • android源碼分析-深入MessageQueue

    摘要:相當(dāng)于層的初始化。注意,這里是層層自己的消息,與層的沒(méi)關(guān)系。好吧,這個(gè)過(guò)程基本上分析完畢了,其實(shí)就是通過(guò)不斷的處理消息,并且調(diào)用消息的回調(diào)。 承接上文在looper中會(huì)在一開(kāi)始就創(chuàng)建一個(gè)MessageQueue,并且在loop中每次都會(huì)從其中取出一個(gè)message處理。那么我們就來(lái)看看這個(gè)MessageQueue: MessageQueue(boolean quitAllowe...

    LeexMuller 評(píng)論0 收藏0
  • nginx 事件模塊簡(jiǎn)單剖析

    摘要:我們這里以單進(jìn)程啟動(dòng)為例中的函數(shù)調(diào)用這個(gè)函數(shù)回循環(huán)調(diào)用中的事件循環(huán)的核心函數(shù)是。這個(gè)方法僅在方法中調(diào)用,它是處理,分發(fā)事件的核心初始化事件驅(qū)動(dòng)模塊的方法退出事件驅(qū)動(dòng)模塊前調(diào)用的方法。讀事件的回調(diào)函數(shù)是這樣就進(jìn)入了框架處理流程 我們這里以單進(jìn)程啟動(dòng)為例nginx.c中的main 函數(shù)調(diào)用ngx_single_process_cycle 這個(gè)函數(shù)回循環(huán)調(diào)用 ngx_process_cy...

    huayeluoliuhen 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<