1. 程式人生 > >運行中nginx進程間的關系

運行中nginx進程間的關系

log apache 大量 image 提高 健壯性 利用 機制 系統

在正式提供產品的環境下,部署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進程間的關系