Blog:博客園 個人

Nginx采用的是固定數量的多進程模型,由一個主進程(MasterProcess)和數量與主機CPU核數相同的工作進程協同處理各種事件。

主管理進程負責工作進程的配置加載、啟停等操作,工作進程負責處理具體請求。進程間的資源都是獨立的,每個工作進程處理多個連接,每個連接由一個工作進程全權處理,不需要進行進程切換,也就不會產生由進程切換引起的資源消耗問題。默認配置下,工作進程的數量與主機CPU核數相同,充分利用CPU和進程的親緣性(affinity)將工作進程與CPU綁定,從而最大限度地發揮多核CPU的處理能力。

Nginx主進程負責監聽外部控制信號,通過頻道機制將相關信號操作傳遞給工作進程,多個工作進程間通過共享內存來共享數據和信息。

Tips:進程親緣性(affinity),使進程或線程在指定的CPU(核)上運行。

Nginx的工作進程有如下幾種調度方式:

  • 無調度模式:所有工作進程都會在連接事件被觸發時爭相與客戶端建立連接,建立連接成功則開始處理客戶端請求。無調度模式下所有進程都會爭搶資源,但最終只有一個進程可以與客戶端建立連接,對於系統而言這將在瞬間產生大量的資源消耗,這就是所謂的驚群現象
  • 互斥鎖模式:每個工作進程都會周期性地爭搶互斥鎖,一旦某個工作進程搶到互斥鎖,就錶示其擁有接收HTTP建立連接事件的處理權,並將當前進程的socket監聽注入事件引擎(如epoll)中,接收外部的連接事件。其他工作進程只能繼續處理已經建立連接的讀寫事件,並周期性地輪詢查看互斥鎖的狀態,只有互斥鎖被釋放後工作進程才可以搶占互斥鎖,獲取HTTP建立連接事件的處理權。當工作進程最大連接數的1/8與該進程可用連接(free_connection)的差大於或等於1時,則放弃本輪爭搶互斥鎖的機會,不再接收新的連接請求,只處理已建立連接的讀寫事件。互斥鎖模式有效地避免了驚群現象,對於大量HTTP的短連接,該機制有效避免了因工作進程爭搶事件處理權而產生的資源消耗。但對於大量啟用長連接方式的HTTP連接,互斥鎖模式會將壓力集中在少數工作進程上,進而因工作進程負載不均而導致QPS下降。
  • 套接字分片:套接字分片是由內核提供的一種分配機制,該機制允許每個工作進程都有一組相同的監聽套接字。當有外部連接請求時,由內核决定哪個工作進程的套接字監聽可以接收連接。這有效避免了驚群現象的發生,相比互斥鎖機制提高了多核系統的性能。該功能需要在配置listen指令時啟用reuseport參數。

Tips:Nginx 1.11.3以後的版本中互斥鎖模式默認是關閉的。套接字分片模式則因為由Linux內核提供進程的調度機制,所以性能最好。

Nginx:進程調度的更多相關文章

  1. Nginx 的編譯安裝和URL地址重寫

    本文轉自:http://www.178linux.com/14119#rd?sukey=ecafc0a7cc4a741b573a095a3eb78af6b4c9116b74d0bbc9844d8fc5 ...

  2. Nginx安裝學習使用詳細記錄

    選擇Nginx的優點:Nginx 可以在大多數 Unix like OS 上編譯運行,並有 Windows 移植版. Nginx 的1.4.0穩定版已經於2013年4月24日發布,一般情况下,對於新建 ...

  3. select與epoll、apache與nginx實現原理對比

    轉自:http://www.tuicool.com/articles/AzmiY3 關於select與epoll 兩種IO模型,都屬於多路IO就緒通知,提供了對大量文件描述符就緒檢查的高性能方案,只不 ...

  4. nginx worker_processes 配置

    搜索到原作者的話:As a general rule you need the only worker with large number ofworker_connections, say 10,0 ...

  5. nginx並發模型與traffic_server並發模型簡單比較

    ginx並發模型: nginx 的進程模型采用的是prefork方式,預先分配的worker子進程數量由配置文件指定,默認為1,不超過1024.master主進程創建監聽套接口,fork子進程以後,由 ...

  6. Nginx多進程高並發、低時延、高可靠機制在緩存(redis、memcache)twemproxy代理中的應用

    1. 開發背景 現有開源緩存代理中間件有twemproxy.codis等,其中twemproxy為單進程單線程模型,只支持memcache單機版和redis單機版,都不支持集群版功能. 由於twemp ...

  7. {Python之進程} 背景知識 什麼是進程 進程調度 並發與並行 同步\异步\阻塞\非阻塞 進程的創建與結束 multiprocess模塊 進程池和mutiprocess.Poll

    Python之進程 進程 本節目錄 一 背景知識 二 什麼是進程 三 進程調度 四 並發與並行 五 同步\异步\阻塞\非阻塞 六 進程的創建與結束 七 multiprocess模塊 八 進程池和mut ...

  8. Nginx多進程高並發、低時延、高可靠機制在緩存代理中的應用

    1. 開發背景 現有開源緩存代理中間件有twemproxy.codis等,其中twemproxy為單進程單線程模型,只支持memcache單機版和redis單機版,都不支持集群版功能. 由於twemp ...

  9. Nginx多進程高並發、低時延、高可靠機制緩存代理中的應用

    1. 開發背景 現有開源緩存代理中間件有twemproxy.codis等,其中twemproxy為單進程單線程模型,只支持memcache單機版和redis單機版,都不支持集群版功能. 由於twemp ...

  10. 轉載:負載均衡器技術Nginx和F5的優缺點對比

    https://blog.csdn.net/zxc456733/article/details/78861100 nginx(一) nginx詳解 nginx是一個被廣泛使用的集群架構組件,我們有必要 ...

隨機推薦

  1. 創建簡單的機器人模型smartcar

    前面我們使用的是已有的機器人模型進行仿真,這一節我們將建立一個簡單的智能車機器人 smartcar,為後面建立複雜機器人打下基礎. 一.創建硬件描述包. cd ~/catkin_ws/srcroscr ...

  2. iOS相機操作筆記

    最近忙於項目,需要拍攝圖片,這裏先列出部分測試代碼. // // FirstViewController.m // UiTest // // Created by Tang Huaming on 16 ...

  3. IntelliJ IDEA 進行js Debug調試

    idea的js調試目前看來不同給力,一是玩轉它需要安裝穀歌插件支持,二是貌似存在一些bug... 一.新建一個jsp並打上斷點 二.調試 idea出現提示: 安裝JetBrains IDE Suppo ...

  4. Fiddler 日志

    Fiddler 日志(Logging) 在開發擴展插件及編寫FiddlerScript時對調試程序非常有用. 1.輸出日志 在FiddlerScript脚本中,你可以這樣輸出輸出日志: Fiddler ...

  5. Java和Tomcat類加載機制

    轉自:http://blog.csdn.net/codolio/article/details/5027423 加載類是運行程序的基礎,了解Java和Tomcat的類加載機制對更有效地開發.調試Web ...

  6. HTML中如何添加日曆插件(JQUERY)

    日期插件的包為:mydate.js1:首先將日期插件的包引入到頁面中 1 <script language="JavaScript" src="../Inc/Js/ ...

  7. 關於css中overflow的一些理解

    在做移動端開發的時候,遇到過這麼個問題:要把圖片進行放大,但有時候圖片比較長,一個手機的版面看不了,於是需要用到overflow的屬性,剛開始用了overflow-y:scroll, 於是問題來了,如 ...

  8. HDU 1217 Arbitrage(Floyd的應用)

    給出一些國家之間的匯率,看看能否從中發現某些肮髒的......朋友交易. 這是Floyd的應用,dp思想,每次都選取最大值,最後看看自己跟自己的.....交易是否大於一.... #include< ...

  9. 通過iis訪問電腦文件

    新公司沒有開發環境,移動端項目,需要自己在手機上先進行查看效果,提供了一個方法iis,之前有聽過,但是一直沒有用過,今天來記錄一下這個配置過程: 環境:win10 1.安裝iis 控制面板——程序—— ...

  10. HTML瀏覽器標題欄如何設置

    瀏覽器標題欄如何設置 只需要在HTML中的 <head></head> 內加入 “Link’’ 和 “Title” 標簽即可.獻上代碼: <head> <me ...