關於高效大規模併發的epoll(nginx的優勢)

2021-06-29 13:54:14 字數 1848 閱讀 3241

epoll除了提供select/poll那種io事件的水平觸發(level triggered)外,還提供了邊緣觸發(edge triggered),這就使得使用者空間程式有可能快取io狀態,減少epoll_wait/epoll_pwait的呼叫,提高

應用程式

效率。一.epoll優點:

1.支援乙個程序開啟大數目的socket描述符

select 最不能忍受的是乙個程序所開啟的fd是有一定限制的,由fd_setsize設定,預設值是1024。對於那些需要支援的上萬連線數目的im伺服器來說顯然太少了。這時候你一是可以選擇修改這個巨集然後重新編譯核心,不過資料也同時指出這樣會帶來網路效率的下

降,二是可以選擇多程序的解決方案(傳統的apache方案),不過雖然linux上面建立程序的代價比較小,但仍舊是不可忽視的,加上程序間

資料同步

遠比不上執行緒間同步的高效,所以也不是一種完美的方案。不過 epoll則沒有這個限制,它所支援的fd上限是最大可以開啟檔案的數目,這個數字一般遠大於2048,舉個例子,在1gb記憶體的機器上大約是10萬左右,具體數目可以cat /proc/sys/fs/file-max檢視,一般來說這個數目和

系統記憶體

關係很大。

2.不需要掃瞄socket集合。

傳統的select/poll另乙個致命弱點就是當你擁有乙個很大的socket集合,不過由於

網路延時

,任一時間只有部分的socket是「活躍」的,但是select/poll每次呼叫都會線性掃瞄全部的集合,導致效率呈現線性下降。但是epoll不存在這個問題,它只會對「活躍」的socket進行操作---這是因為在核心實現中epoll是根據每個fd上面的callback函式實現的。那麼,只有「活躍」的socket才會主動的去呼叫 callback函式,其他idle狀態socket則不會,在這點上,epoll實現了乙個「偽」aio,因為這時候推動力在os核心。在一些 benchmark中,如果所有的socket基本上都是活躍的---比如乙個高速lan環境,epoll並不比select/poll有什麼效率,相反,如果過多使用epoll_ctl,效率相比還有稍微的下降。但是一旦使用idle connections模擬wan環境,epoll的效率就遠在select/poll之上了。

3.使用mmap減少使用者態與核心態的切換

這點實際上涉及到epoll的具體實現了。無論是select,poll還是epoll都需要核心把fd訊息通知給使用者空間,如何避免不必要的記憶體拷貝就很重要,在這點上,epoll是通過核心與使用者空間mmap同一塊記憶體實現的。而如果你像我一樣從2.5核心就關注epoll的話,一定不會忘記手工 mmap這一步的。

epoll相關的系統呼叫有:epoll_create, epoll_ctl和epoll_wait。linux-2.6.19又引入了可以遮蔽指定訊號的epoll_wait: epoll_pwait。至此epoll家族已全。其中epoll_create用來建立乙個epoll

檔案描述符

,epoll_ctl用來新增/修改/刪除需要偵聽的檔案描述符及其事件,epoll_wait/epoll_pwait接收發生在被偵聽的描述符上的,使用者感興趣的io事件。epoll

檔案描述符

用完後,直接用close關閉即可,非常方便。事實上,任何被偵聽的檔案符只要其被關閉,那麼它也會自動從被偵聽的

檔案描述符

集合中刪除,很是智慧型。

linux的tcpip協議棧自適應優勢

核心tcp/ip協議

棧使用記憶體池管理sk_buff結構,那麼可以在執行時期動態調整這個記憶體pool(skb_head_pool)的大小--- 通過echo ***x>/proc/sys/net/core/hot_list_length完成。再比如listen函式的第2個引數(tcp完成3次握手的資料報佇列長度),也可以根據你平台記憶體大小動態調整。

軟體的大規模生產

很多人都幻想軟體可以工廠化,流水線化生產,但是這一天卻從來沒有到來。軟體和工廠模式的不同在於軟體是研發出來,而工廠是研發出來後,持續生產。工廠中的生產階段是重點,而軟體的生產階段只需要複製複製,可以忽略不計。所謂的流水線指的是工廠的生產階段,所以軟體很難出現所謂的流水線。那麼軟體是不是無法擴大規模,...

大規模SfM的Cut Expand

expand 判斷cluster的大小。若cluster的image的數目足夠小,不進行任何操作,返回cluster cluster的大小可以進行cut,對cluster進行normalized cut,返回每個image及其所屬的cluster id 將image分配到clustered的chil...

軟體的大規模生產

很多人都幻想軟體可以工廠化,流水線化生產,但是這一天卻從來沒有到來。軟體和工廠模式的不同在於軟體是研發出來,而工廠是研發出來後,持續生產。工廠中的生產階段是重點,而軟體的生產階段只需要複製複製,可以忽略不計。所謂的流水線指的是工廠的生產階段,所以軟體很難出現所謂的流水線。那麼軟體是不是無法擴大規模,...