nginx共有兩種程序模型,即master和worker程序。master主程序管理worker程序。管理包含:
worker程序可以在核心配置檔案中配置成多個。
## ./conf/nginx.conf
worker_processes 6;
檢視nginx程序
# ps -ef|grep nginx
管理員傳送指令(stop/reload等)到master程序,master再將指令分發給每個woker程序執行。
當客戶端請求進來,worker程序競爭該連線的accept_mutex鎖。
accept_mutex的意義:當乙個新連線到達時,如果啟用了accept_mutex,那麼多個worker將以序列方式來處理,其中有乙個worker會被喚醒,其他的worker繼續保持休眠狀態;如果沒有啟用accept_mutex,那麼所有的worker都會被喚醒,不過只有乙個worker能獲取新連線,其它的worker會重新進入休眠狀態,這就是「驚群問題」
對nginx而言,一般來說,worker_processes會設定成cpu個數,所以最多也就幾十個,即便發生驚群問題的話,影響相對也較小。
nginx預設(預設)啟用了accept_mutex,是一種保守的選擇。如果關閉了它,可能會引起一定程度的驚群問題,表現為上下文切換增多(sar -w)或者負載上公升,但是如果你的**訪問量比較大,為了系統的吞吐量,我還是建議大家關閉它。
傳統伺服器事件處理採用同步阻塞aio機制(例如apache),當客戶端請求進來後,worker1處理請求,此時worker1會阻塞,無法處理其他請求。針對於高併發的場景,則需要生產大量的worker。
nginx採用了linux的epoll模型,非同步非阻塞。單個worker可以同時處理幾萬個請求的,具體取決於cpu和記憶體。當多個client請求worker1,假設client1的請求阻塞,由於非同步非阻塞機制,worker1仍可以去處理其他客戶端請求。
events
為什麼要盡量保持worker程序數與cpu核心數一致?
乙個worker程序可以同時處理的請求數隻受限於記憶體大小,而且在架構設計上,不同的worker程序之間處理併發請求時幾乎沒有同步鎖的限制,worker程序通常不會進入睡眠狀態,因此,當nginx上的程序數與cpu核心數相等時(最好每乙個worker程序都繫結特定的cpu核心),盡可能減少程序上下文切換,避免多個worker程序搶占cpu,以及快取失效等問題。
當worker_processes的值為auto時,nginx會自動檢測當前主機的cpu核心數,並啟動對應數量的worker程序。
work程序繫結某個cpu核心使用worker_cpu_affinity指令。
結束
Nginx的事件處理機制
nginx的事件處理機制 對於乙個基本的web伺服器來說,事件通常有三種型別,網路事件 訊號 定時器。首先看乙個請求的基本過程 建立連線 接收資料 傳送資料 再次看系統底層的操作 上述過程 建立連線 接收資料 傳送資料 在系統底層就是讀寫事件。1 如果採用阻塞呼叫的方式,當讀寫事件沒有準備好時,必然...
Nginx的事件處理機制
nginx的事件處理機制 對於乙個基本的web伺服器來說,事件通常有三種型別,網路事件 訊號 定時器。首先看乙個請求的基本過程 建立連線 接收資料 傳送資料 再次看系統底層的操作 上述過程 建立連線 接收資料 傳送資料 在系統底層就是讀寫事件。1 如果採用阻塞呼叫的方式,當讀寫事件沒有準備好時,必然...
Nginx的事件處理機制
nginx的事件處理機制 對於乙個主要的webserver來說,事件通常有三種型別,網路事件 訊號 定時器。首先看乙個請求的基本過程 建立連線 接收資料 傳送資料 再次看系統底層的操作 上述過程 建立連線 接收資料 傳送資料 在系統底層就是讀寫事件。1 假設採用堵塞呼叫的方式,當讀寫事件沒有準備好時...