Blog:部落格園 個人

Nginx採用的是固定數量的多程序模型,由一個主程序(MasterProcess)和數量與主機CPU核數相同的工作程序協同處理各種事件。

主管理程序負責工作程序的配置載入、啟停等操作,工作程序負責處理具體請求。程序間的資源都是獨立的,每個工作程序處理多個連線,每個連線由一個工作程序全權處理,不需要進行程序切換,也就不會產生由程序切換引起的資源消耗問題。預設配置下,工作程序的數量與主機CPU核數相同,充分利用CPU和程序的親緣性(affinity)將工作程序與CPU繫結,從而最大限度地發揮多核CPU的處理能力。

Nginx主程序負責監聽外部控制訊號,通過頻道機制將相關訊號操作傳遞給工作程序,多個工作程序間通過共享記憶體來共享資料和資訊。

Tips:程序親緣性(affinity),使程序或執行緒在指定的CPU(核)上執行。

Nginx的工作程序有如下幾種排程方式:

  • 無排程模式:所有工作程序都會在連線事件被觸發時爭相與客戶端建立連線,建立連線成功則開始處理客戶端請求。無排程模式下所有程序都會爭搶資源,但最終只有一個程序可以與客戶端建立連線,對於系統而言這將在瞬間產生大量的資源消耗,這就是所謂的驚群現象
  • 互斥鎖模式:每個工作程序都會週期性地爭搶互斥鎖,一旦某個工作程序搶到互斥鎖,就表示其擁有接收HTTP建立連線事件的處理權,並將當前程序的socket監聽注入事件引擎(如epoll)中,接收外部的連線事件。其他工作程序只能繼續處理已經建立連線的讀寫事件,並週期性地輪詢檢視互斥鎖的狀態,只有互斥鎖被釋放後工作程序才可以搶佔互斥鎖,獲取HTTP建立連線事件的處理權。當工作程序最大連線數的1/8與該程序可用連線(free_connection)的差大於或等於1時,則放棄本輪爭搶互斥鎖的機會,不再接收新的連線請求,只處理已建立連線的讀寫事件。互斥鎖模式有效地避免了驚群現象,對於大量HTTP的短連線,該機制有效避免了因工作程序爭搶事件處理權而產生的資源消耗。但對於大量啟用長連線方式的HTTP連線,互斥鎖模式會將壓力集中在少數工作程序上,進而因工作程序負載不均而導致QPS下降。
  • 套接字分片:套接字分片是由核心提供的一種分配機制,該機制允許每個工作程序都有一組相同的監聽套接字。當有外部連線請求時,由核心決定哪個工作程序的套接字監聽可以接收連線。這有效避免了驚群現象的發生,相比互斥鎖機制提高了多核系統的效能。該功能需要在配置listen指令時啟用reuseport引數。

Tips:Nginx 1.11.3以後的版本中互斥鎖模式預設是關閉的。套接字分片模式則因為由Linux核心提供程序的排程機制,所以效能最好。