運行中nginx進程間的關系
在正式提供產品的環境下,部署nginx都是使用master進程來管理多個worker進程.
一般情況下,worker進程都與服務器上的核數相等,每一個worker進程都是繁忙的,它們真正的提供互聯網服務.
而master進程則很清閑,只負責監控管理worker進程.
worker進程之間通過共享內存,原子操作等一系列進程之間的通訊來實現負載均衡
共享內存( shared memory ) :共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
部署後nginx進程之間的關系,如下圖所示:
那麽為什麽要按照master-worker方式配置多個進程:有兩點
1.master進程可以是唯一的,只專註於管理真正提供服務的worker進程
2.多個worker進程提高了服務的健壯性,還充分利用現有的smp架構(堆成多處理架構),從而實現真正的多核並發處理
那麽為什麽worker進程設計的與cpu核數一致吶,先要看看apache與nginx有什麽不同之處:
apache一個進程處理一個請求,在大並發量的情況下,只能加大進程或者線程數,通常一臺服務器幾百個進程,大量進程切換帶來無謂的系統資源消耗
nginx一個worker進程可處理的請求數只限制在內存的大小,不同的worker進程處理並發請求沒有同步鎖限制,worker進程不會睡眠,故設置worker進程與cpu核數一致,進程間切換代價是最小的.(即cpu是8核,worker進程設置為8個.)(補充知識:進程與CPU調度的關系,單個核心處理多個進程的時候,是排隊處理的,所以將Worker進程數量設置超過核心數是沒有太大意義的,會導致進程間切換額外開銷)
運行中nginx進程間的關系