1. 程式人生 > 實用技巧 >伺服器高併發網路設計模型

伺服器高併發網路設計模型

>>> hot3.png

Nginx網路模型

一、程序模型

Nginx之所以為廣大碼農喜愛,除了其高效能外,還有其優雅的系統架構。與Memcached的經典多執行緒模型相比,Nginx是經典的多程序模型。Nginx啟動後以daemon的方式在後臺執行,後臺程序包含一個master程序和多個worker程序,具體如下圖:


圖1 Nginx多程序模型

master程序主要用來管理worker程序,具體包括如下4個主要功能:
(1)接收來自外界的訊號。
(2)向各worker程序傳送訊號。
(3)監控woker程序的執行狀態。
(4)當woker程序退出後(異常情況下),會自動重新啟動新的woker程序。

woker程序主要用來處理網路事件,各個woker程序之間是對等且相互獨立的,它們同等競爭來自客戶端的請求,一個請求只可能在一個woker程序中處理,woker程序個數一般設定為機器CPU核數。

二、程序控制

對Nginx程序的控制主要是通過master程序來做到的,主要有兩種方式:
(1)手動傳送訊號
從圖1可以看出,master接收訊號以管理眾woker程序,那麼,可以通過kill向master程序傳送訊號,比如kill -HUP pid用以通知Nginx從容重啟。所謂從容重啟就是不中斷服務:master程序在接收到訊號後,會先重新載入配置,然後再啟動新程序開始接收新請求,並向所有老程序傳送訊號告知不再接收新請求並在處理完所有未處理完的請求後自動退出。

(2)自動傳送訊號
可以通過帶命令列引數啟動新程序來發送訊號給master程序,比如./nginx -s reload用以啟動一個新的Nginx程序,而新程序在解析到reload引數後會向master程序傳送訊號(新程序會幫我們把手動傳送訊號中的動作自動完成)。當然也可以這樣./nginx -s stop來停止Nginx。

三、網路事件

Nginx採用非同步非阻塞的方式來處理網路事件,類似於Libevent,具體過程如下圖:


圖2 Nginx網路事件

master程序先建好需要listen的socket後,然後再fork出多個woker程序,這樣每個work程序都可以去accept這個socket。當一個client連線到來時,所有accept的work程序都會受到通知,但只有一個程序可以accept成功,其它的則會accept失敗。Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work程序在accept連線,從而解決驚群問題。當一個worker程序accept這個連線後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線,這樣一個完成的請求就結束了。

Memcached

memcached是一款非常普及的伺服器端快取軟體,memcached主要是基於Libevent庫進行開發的。

網路模型流程分析

Memcached主要是基於Libevent的事件庫來實現網路執行緒模型的。
Memcached的網路執行緒模型主要涉及兩個主要檔案:memcached.c 和thread.c檔案。
我們這邊主要分析tcp的模型。memcached也支援udp。

1. memcached首先在主執行緒中會建立main_base,memcached的主執行緒的主要工作就是監聽和接收listen和accpet新進入的連線。

2. 當memcached啟動的時候會初始化N個worker thread工作執行緒,每個工作執行緒都會有自己的LIBEVENT_THREAD資料結構來儲存執行緒的資訊(執行緒基本資訊、執行緒佇列、pipe資訊)。worker thread工作執行緒和main thread主執行緒之間主要通過pipe來進行通訊。

3. 當用戶有連線進來的時候,main thread主執行緒會通過求餘的方式選擇一個worker thread工作執行緒。

4. main thread會將當前使用者的連線資訊放入一個CQ_ITEM,並且將CQ_ITEM放入這個執行緒的conn_queue處理佇列,然後主執行緒會通過寫入pipe的方式來通知worker thread工作執行緒。

5. 當工作執行緒得到主執行緒main thread的通知後,就會去自己的conn_queue佇列中取得一條連線資訊進行處理,建立libevent的socket讀寫事件。

6. 工作執行緒會監聽使用者的socket,如果使用者有訊息傳遞過來,則會進行訊息解析和處理,返回相應的結果。

流程圖

詳情見:http://www.lvtao.net/c/623.html

高併發伺服器程式碼:https://github.com/manmao/Module/tree/master/mult_process_server

轉載於:https://my.oschina.net/manmao/blog/738952