Nginx為啥使用ET模式Epoll?

Web伺服器nginx使用ET模式的epoll。我想問,它相對LT模式epoll有哪些優勢呢?另外一篇帖子(epoll的邊沿觸發模式(ET)真的比水平觸發模式(LT)快嗎?(當然LT模式也使用非阻塞IO,重點是要求ET模式下的代碼不能造成飢餓))說ET不一定比LT快,那麼為什麼要使用ET模式呢?


使用ET模式,可以便捷的處理EPOLLOUT事件,省去打開與關閉EPOLLOUT的epoll_ctl(EPOLL_CTL_MOD)調用。從而有可能讓你的性能得到一定的提升。

例如你需要寫出1M的數據,寫出到socket 256k時,返回了EAGAIN,ET模式下,當再次返回EPOLLOUT時,繼續寫出待寫出的數據,當沒有數據需要寫出時,不處理直接略過即可。而LT模式則需要先打開EPOLLOUT,當沒有數據需要寫出時,再關閉EPOLLOUT(否則會一直會返回EPOLLOUT事件)

當nginx處理大並發大流量的請求時,LT模式會出現較多的epoll_ctl調用用於開關EPOLLOUT,因此ET模式就更合適了

關於某些場景下ET模式比LT模式效率更好,我有篇文章進行了詳細的解釋與測試,參看

epoll LT/ET 深入剖析


ET理論上性能會更高。不過在實際的應用中,特別是負載不大的應用中,這個差別不大。


在極端情況下會提升很大,就是同時高並發(上千)加大流量(每秒上百M)的時候,確實會有很大的提升。


看連接的空閑程度,連接的空閑程度很高就用ET,所以按照場景,http的客戶端idel情況很高,用ET,如果是rpg的遊戲伺服器,用LT,ET差不多


epoll的ET是邊緣觸發,也就是說內核中協議棧中的空間中的數據從無到有的時候觸發一次可讀;協議棧從滿到空的時候觸發一次可寫。這就是說再使用epoll_wait的時候可以一次將內存協議棧中的數據讀出來,或者一次就將內存協議站在數據一次塞滿。比水平觸發類型觸發的次數少,一次處理的數據多。性能好一些,對編程能力要求高一些。


nginx為了能平滑重啟,對監聽套接字是水平觸發。


推薦閱讀:

如何搭建編程伺服器?
怎樣用Node.js快速搭建伺服器?
如何把智能機改裝成web伺服器?
請問用tcp協議實現sever push技術的思路?
為何雲計算伺服器,或google等大公司的後台伺服器,不選用大型機而用幾十萬的小型機呢?

TAG:編程 | Linux | 伺服器 | Nginx | epoll |