nginx常用事件驅動模型

Nginx的事件驅動模型,支持select、poll、epoll、rtsig、kqueue、/dev/poll、eventport等。

實際應用中最常用的三種是select、poll、 epoll,其他模型可以瞭解一下,下面簡單介紹下其他的模型,後面重點介紹最常用的三種模型。


rtsig是Real-Time Signal的縮寫,是實時信號的意思。從嚴格意義上說,rtsig模型並不是常用的事件驅動模型,但Nginx服務器使用了使用實時信號對事件進行響應的支持,官方文檔中將rtsig模型與其他的事件驅動模型並列。


其中kqueue模型用於支持BSD系列平臺的事件驅動模型。kqueue是poll模型的一個變種,本質上和epoll一樣,可以理解爲支持不同的平臺。


/dev/poll是Unix平臺的事件驅動模型,其主要在Solaris7及以上版本、HP/UX11.22及以上版本、IRIX6.5.15及以上版本、Tru64 Unix 5.1A及以上版本的平臺使用。


eventport是用於支持Solaris10及以上版本的事件驅動模型。


下面介紹前面三種常用的模型

  • select模型

select模型是各個版本的Linux和Windows平臺都支持的基本事件驅動模型庫,並且在接口的定義上也基本相同,只是部分參數的含義略有差異。

使用select模型的一般步驟是:

  1. 創建所關注事件的描述符集合,對於一個描述符,可以關注其上面的讀(Read)事件、寫(Write)事件以及異常發生(Exception)事件。

在select模型中,要創建這3類事件描述符集合,分別用來收集讀事件、寫事件和異常事件的描述符。

  1. 調用底層提供的select()函數,等待事件發生。這裏需要注意的一點是,select的阻塞與是否設置非阻塞I/O是沒有關係的
  2. 輪詢所有事件描述符集合中的每一個事件描述符,檢查是否有相應的事件發生,如果有就進行處理。

Nginx服務器在編譯過程中如果沒有爲其指定其他高性能事件驅動模型庫,它將自動編譯該庫。我們可以使用–with-select_module和–without-select_module兩個參數強制Nginx是否編譯該庫。

  • poll模型

poll模型是Linux平臺上的事件驅動模型,在Linux2.1.23中引入的,Windows平臺不支持該模型。poll模型和select模型工作方式基本相同,區別在於,select模型創建了3個描述符集合,而poll模型只創建一個描述符集合。

poll模型只需要創建一個集合,在每個描述符對應的結構上分別設置讀事件、寫事件或者異常事件,最後輪詢的時候,可以同時檢查這三種事件是否發生。可以說,poll模型是select庫的優化實現。
Nginx服務器在編譯過程中如果沒有爲其制定其他高性能事件驅動模型庫,它將自動編譯該庫。我們可以使用–with-poll_module和–without-poll_module兩個參數強制Nginx是否編譯該庫。

  • epoll模型

epoll模型屬於poll模型的變種,在Linux2.5.44中引入。是Nginx服務器支持的高性能事件驅動庫之一,它是公認的非常優秀的事件驅動模型,和poll模型及select模型有很大的不同。epoll比poll更加高效,原因在於它不需要輪詢整個描述符集合,而是Linux內核會關注事件集合,當有變動時,內核會發來通知。

poll模型和select模型在實際工作中,最大的區別在於效率,它們的處理方式都是創建一個待處理事件列表,然後把這個列表發給內核,返回的時候,再去輪詢檢查這個列表,以判斷事件是否發生。這樣在描述符比較多的應用中,效率就顯得比較低下了。一種比較好的做法是,把描述符列表的管理交給內核負責,一旦有某種事件發生,內核把發生事件的描述符列表發送通知給進程,這樣就避免了輪詢整個描述符列表。

epoll模型是目前在Linux平臺上新能最好的模型,下面重點介紹下epoll的工作原理。

epoll的工作原理

  1. 首先,epoll模型通過相關調用通知內核創建一個由N個描述符的事件列表。然後,給這些描述符設置所關注的事件,並把它添加到內核的事件列表中去,在具體的編碼過程中也可以通過相關調用對事件列表中的描述符進行修改和刪除。
  2. 完成設置之後,epoll就開始等待內核通知事件發生了。某一事件發生後,內核將發生事件的描述符列表上報給epoll。得到事件列表的epoll,就可以進行事件處理了。

epoll在Linux平臺上是最高效的,它支持一個進程打開大數目的事件描述符,上限是系統可以打開文件的最大數目。同時,epoll的IO效率不隨描述符數目增加而線性下降,因爲它只會對內核上報的“活躍”的描述符進行操作。

通過事件驅動模型介紹可以看出,Nginx服務器針對不同的Linux或Unix衍生平臺提供了多種事件驅動模型的處理,儘量發揮系統平臺本身的優勢,最大程度地提高處理客戶端請求事件的能力。在實際工作中,我們需要根據具體情況和應用情景選擇使用不同的事件驅動模型,以保證Nginx服務器的高效運行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章