1. 程式人生 > >Nginx系列(三)--管理程序、多工作程序設計

Nginx系列(三)--管理程序、多工作程序設計

Nginx由一個master程序和多個worker程序組成,但master程序或者worker程序中並不會再建立執行緒。

 

一、master程序和worker程序的作用

master程序

不需要處理網路事件,不負責業務的執行,只會通過管理worker等子程序來實現重啟服務、平滑升級、更換日誌檔案、配置檔案實時生效等功能。

         master是通過fork系統呼叫子程序來實現和子程序的通訊。

worker程序

用來處理master程序fork過來的請求

        worker程序是通過處理訊號來實現和master通訊的

====================================================================================

二、訊號的處理過程

Master程序接收到訊號是怎樣進行處理的?

          master程序接收到訊號後,會先重新載入配置檔案,然後再啟動新的程序,並向所有老的程序傳送訊號,告訴他們可以光榮退休了。新的程序在啟動後,就開始接受新的請求,而老的程序在收到來自master訊號後,就不再接收新的請求,並且在當前程序中的所有未處理完的請求處理完成後再退出。

Worker程序接收到訊號是怎樣進行處理的?

首先,worker程序之間是平等的,每個程序,處理請求的機會也是一樣的。當我們提供80埠的http服務時,一個連線請求過來,每個程序都有可能處理這個連線,怎麼做到的呢?首先,每個worker程序都是從master

程序fork過來的,在master程序裡面,先建立好需要listensocket之後,然後再fork出多個worker程序,這樣每個worker程序都可以去接受這個socket。一般來說,當一個連線進來後,所有在accept這個socket上面的程序都會收到通知,而只有一個程序可以接受這個連線,其他的則accept失敗,這就是所謂的驚群現象。

那麼為了解決這個問題,Nginx提供了一個accept_mutex(可選項,預設開啟)。這是一個加在accept上的一把共享所。有了這把鎖之後,同一時刻,就會只有一個程序在accept連線,這樣就不會有驚群問題了。

當一個worker程序在accept這個連線之後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線。一個請求,完全由

worker程序來處理,而且只在一個worker程序中處理。

====================================================================================

三、這樣設計的優點

1、利用多核系統的併發處理能力

現在作業系統都是多核CPU,如果一直是隻有一個程序在工作,那麼浪費資源,如果是worker程序間地位不平等勢必造成程序瓶頸問題,Nginx為了避免這個問題,設計worker間程序平等。另外,worker數與cpu核數一致,則會達到CPU資源的充分利用,如果worker數多於cpu核數,勢必造成資源的競爭;若小於cpu核數,勢必造成資源浪費。提高網路效能,降低請求時延。

2、負載均衡

多個worker之間通過程序通訊來實現負載均衡。即當一個請求到來時,更容易分配到負載較輕的worker程序中處理。這將降低請求的時延,並在一定程度上提高網路效能

3、管理程序負責監控工作程序的狀態,並負責管理其行為

這樣做的好處是:

         a.管理程序不會佔用多少系統資源

         b.管理程序負責監控工作程序狀態,如果某個工作程序死掉,管理程序負責創建出新的工作程序,避免系統性能下降。提高了系統的可靠性。

         c.管理程序支援Nginx服務執行中的程序升級、配置項修改等,使得動態可擴充套件性、動態定製性、動態進化性較容易實現。