Nginx 多進程架構(gòu)和驚群問題

Nginx 多進程架構(gòu)是:一個master進程和多個worker 進程。
一個worker 通過非阻塞式論詢,可維護數(shù)千個連接,多個worker共享一個監(jiān)聽套接字.

Master進程

顧名思義,老板進程,主要負責有輕而巧的工作.
主要通過進程間通信對工人進程發(fā)號施令或是處理來自bash的start,stop,reload等用戶指令。

Worker 進程

顧名思義,工人進程,主要負責重而笨的工作,主要負責處理來自瀏覽器的連接。
網(wǎng)站高并發(fā)情況下,巨大的工作負荷都是壓到工人進程,老板進程在一旁觀看指揮。

在TCP Socket 服務開發(fā)中,多進程或多線程共享監(jiān)聽套接字時面臨驚群問題.

  1. 對于主流的linx版本, accept 阻塞調(diào)用,已經(jīng)不存在驚群問題.
    也就是說多個進程同時accept 同一個 監(jiān)聽套接字,只有一個進程獲的連接.

  2. 對于epoll_wait 非阻塞式的創(chuàng)建連接方式, 存在驚群問題。(即:一個連接請求喚醒多個worker 進程).

Nginx 在linux系統(tǒng)中使用epoll_wait 非阻塞式的方式,存在驚群問題。

瀏覽器的請求連接不經(jīng)過master進程,直接由worker 進程處理,
但是一個請求如何分配到特定的worker進程?

  1. nginx 默認的配置accept_mutex on;
    多個worker 進程通過爭鎖獲得連接,同時只有一個worker獲得連接。
    工人進程搶著活干(讓我來,別和我爭)
  2. accept_mutex off
    一個連接請求喚醒多個worker 進程,同時只有一個worker獲得連接。
    存在驚群問題,由于nginx 的worker 進程數(shù)量不大,這個驚群問題影響不大。
    少了爭鎖,這個配置高并發(fā)時可提高系統(tǒng)的響應能力。
  3. 開啟SO_REUSEPORT選項: reuseport
http {
        server {
          listen 80 reuseport;
          server_name  localhost;
          ...
     }
}

SO_REUSEPORT選項,是Linux 內(nèi)核3.9+處理大并發(fā)連接的新特性。
開啟后,連接請求通過linux內(nèi)核分配到worker 進程,性能最好。
此選項的系統(tǒng)需求:
Nginx 1.9.1+
DragonFly BSD/Linux 內(nèi)核3.9+

參考:
http://blog.csdn.net/Marcky/
https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容