0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Nginx 如何實(shí)現(xiàn)高性能低消耗

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-11 11:31 ? 次閱讀

Nginx 是一個(gè)輕量級(jí)的HTTP 服務(wù)程序,相比其他服務(wù)器程序如Apache,Nginx占用內(nèi)存少,穩(wěn)定性高,并發(fā)處理能力強(qiáng)。同時(shí)Nginx 還是一個(gè)反向代理服務(wù)程序,和郵件代理服務(wù)程序。Nginx具有豐富的模塊庫(kù)、靈活的配置、較低資源消耗等優(yōu)點(diǎn)。下面,我們一起深入看一下Nginx的工作機(jī)制

1. Nginx 如何實(shí)現(xiàn)高性能低消耗的呢?

我們從以下幾個(gè)方面說(shuō)明以下:

網(wǎng)絡(luò)事件處理機(jī)制

  • Nginx 采用異步非阻塞的方式處理請(qǐng)求,可以同時(shí)處理上萬(wàn)的請(qǐng)求
  • Nginx 支持 select/epoll 等流行事件處理機(jī)制,根據(jù)系統(tǒng)環(huán)境自動(dòng)選擇
  • Nginx 采用獨(dú)立于系統(tǒng)的事件處理機(jī)制,能夠高效處理請(qǐng)求

資源分配技術(shù)

  • Nginx 采用分階段資源分配技術(shù),使得它的CPU和內(nèi)存消耗非常低

多核處理優(yōu)化

  • Nginx 默認(rèn)采用多進(jìn)程啟動(dòng)模式
  • Nginx 包含Master 進(jìn)程 和 Worker 進(jìn)程
  • 能夠充分利用 SMP 對(duì)稱多處理的優(yōu)勢(shì),減少Worker進(jìn)程磁盤(pán)I/O的阻塞
  • Nginx 支持Worker進(jìn)程和CPU內(nèi)核 一一對(duì)應(yīng)綁定,避免進(jìn)程上下文的切換致使cache失效

基于上面提到技術(shù),以及Nginx很多地方的優(yōu)化,讓Nginx成為最快的HTTP服務(wù)器。

2.Nginx的進(jìn)程模型

在Nginx的技術(shù)架構(gòu)中,進(jìn)程模型是至關(guān)重要的一部分。接下來(lái),我們一起看看Nginx進(jìn)程模型,以及它們的工作機(jī)制。

Linux 系統(tǒng)中,Nginx默認(rèn)以守護(hù)進(jìn)程daemon方式啟動(dòng),默認(rèn)采用多進(jìn)程方式。Nginx包括兩種類(lèi)型的進(jìn)程:

  • Master 進(jìn)程,數(shù)量只有一個(gè),管理Nginx本身和Worker進(jìn)程
  • Worker 進(jìn)程,數(shù)量一般和CPU核數(shù)相等,Nginx的所有請(qǐng)求處理,均是在Worker進(jìn)程中完成

下面,我們分別深入看一下Master和Worker進(jìn)程。

2.1 Master 進(jìn)程工作機(jī)制

在Nginx啟動(dòng)時(shí),Master進(jìn)程創(chuàng)建,主要負(fù)責(zé)初始化Nginx和相關(guān)模塊、fork Worker進(jìn)程、接收處理外界信號(hào)等工作。

Nginx的初始化過(guò)程:

  • 解析配置文件,這是Nginx初始化最重要的一個(gè)環(huán)節(jié)
  • 調(diào)用各個(gè)配置指令回調(diào)函數(shù),完成各個(gè)模塊的配置、相互關(guān)聯(lián)等
  • 建立listen 的 socket(listenfd)
  • 準(zhǔn)備工作都完成后,fork worker子進(jìn)程和cache子進(jìn)程

Master 進(jìn)程信號(hào)處理機(jī)制

我們通過(guò)kill命令發(fā)送信號(hào)給Nignx Master 進(jìn)程,看看Master進(jìn)程如何處理:

圖片

分析流程:

  • Master 進(jìn)程接收到 HUP 信號(hào)
  • Master 進(jìn)程重新加載配置文件
  • Master 進(jìn)程啟動(dòng)新的Worker進(jìn)程
  • Master 進(jìn)程發(fā)送信號(hào)給Worker 進(jìn)程
  • 老的Worker進(jìn)程不再接收新的請(qǐng)求
  • 老的Worker進(jìn)程處理完當(dāng)前請(qǐng)求,退出
  • 至此,Nginx完成平滑重啟

注意:Nginx 0.8 版本以后,提供了 -s參數(shù),用于管理Nginx服務(wù)的停止和重啟,注意line 11:

圖片

2.2 Worker 進(jìn)程工作機(jī)制

Worker進(jìn)程負(fù)責(zé)所有請(qǐng)求的處理工作,我們通過(guò)一個(gè)HTTP請(qǐng)求,來(lái)梳理一下Worker的工作流程:

  • 新的請(qǐng)求到來(lái):所有的Work進(jìn)程的listenfd都會(huì)變得可讀
  • 竟搶互斥鎖:所有 Worker 進(jìn)程在注冊(cè)listenfd讀事件前,要先搶accept_mutex
  • 搶到互斥鎖的Worker,注冊(cè)listenfd讀事件,在事件中調(diào)用accept接受該連接
  • 拿到請(qǐng)求后,Worker進(jìn)程開(kāi)始讀取請(qǐng)求,解析請(qǐng)求,處理請(qǐng)求,產(chǎn)生數(shù)據(jù),再返回給客戶端
  • Worker進(jìn)程斷開(kāi)連接

需要注意:一個(gè)HTTP請(qǐng)求,完全由Worker進(jìn)程處理,而且只在一個(gè)Worker中處理

2.3 Master-Worker 進(jìn)程架構(gòu)機(jī)制的優(yōu)勢(shì)有哪些??

對(duì)于每個(gè)Worker 進(jìn)程來(lái)說(shuō),獨(dú)立的進(jìn)程,不需要加鎖,節(jié)約鎖導(dǎo)致的資源開(kāi)銷(xiāo);worker進(jìn)程之間,互不干擾,平滑重啟就是很好的例子,服務(wù)不中斷。

2.4 網(wǎng)絡(luò)事件處理機(jī)制

Nginx 采用的是異步非阻塞事件處理機(jī)制,支持select/poll/epoll/kqueue 等等。Nginx 同時(shí)會(huì)監(jiān)控多個(gè)事件,調(diào)用他們是阻塞的。但是調(diào)用有超時(shí)時(shí)間,在超時(shí)時(shí)間內(nèi),如果有事件準(zhǔn)備好了,就返回,否則重新放入epoll中。當(dāng)讀寫(xiě)返回EAGAIN時(shí),事件將會(huì)被再次放入epoll中。

處理線程只有一個(gè),同時(shí)處理的請(qǐng)求也只有一個(gè),所謂多請(qǐng)求并發(fā),只是在不斷的切換請(qǐng)求而已。雖然是切換,但這種切換不涉及上下文切換,相比十分輕量。更多的并發(fā),只是會(huì)占用更多的內(nèi)存。

進(jìn)程相關(guān)的還有,信號(hào)和定時(shí)器,這部分另外單獨(dú)講解。

  1. Nginx 包含哪些模塊

Nginx是模塊化架構(gòu)的服務(wù),豐富的模塊,松散耦合,也讓Nginx更加強(qiáng)大!我看看Nginx 都有哪些模塊

內(nèi)核模塊

實(shí)現(xiàn)了底層的通訊協(xié)議,為其他模塊/進(jìn)程構(gòu)建運(yùn)行環(huán)境、協(xié)作基礎(chǔ),打開(kāi)listen 的端口,啟動(dòng)worker進(jìn)程

HTTP/Mail模塊

兩個(gè)特殊模塊,位于內(nèi)核模塊和各功能模塊間;在內(nèi)核模塊之上實(shí)現(xiàn)了另一層的抽象;處理HTTP/MAIL協(xié)議事件;確保調(diào)用功能模塊順序正確。

Event模塊

負(fù)責(zé)監(jiān)聽(tīng)accept后建立的連接,對(duì)讀寫(xiě)事件進(jìn)行添加刪除;與非阻塞 I/O 模型結(jié)合使用;支持select/poll/epoll/kqueue等;注意驚群效應(yīng),后面有解釋。

Handler模塊

負(fù)責(zé)接受客戶端請(qǐng)求并產(chǎn)生輸出;通過(guò)配置文件中l(wèi)ocation指令配置 content handler 模塊。

Filter模塊

負(fù)責(zé)輸出內(nèi)容處理,修改輸出內(nèi)容;Fiter模塊在獲取回復(fù)內(nèi)容之后,向用戶發(fā)送響應(yīng)之前,執(zhí)行處理動(dòng)作;調(diào)用順序在編譯時(shí)就確定了。

Upstream模塊

實(shí)現(xiàn)反向代理的功能,負(fù)責(zé)將請(qǐng)求轉(zhuǎn)發(fā)到后端服務(wù)器上,并讀取響應(yīng),發(fā)回客戶端;跨越單機(jī)的限制,完成網(wǎng)絡(luò)數(shù)據(jù)的接收、處理和轉(zhuǎn)發(fā);

LoadBalancer模塊

根據(jù)配置指定算法,在眾多的后端服務(wù)器中選擇一個(gè),完成請(qǐng)求的轉(zhuǎn)發(fā)服務(wù)器;都有哪些算法呢?

驚群效應(yīng):

  • 當(dāng)內(nèi)核 accept 一個(gè)連接時(shí),會(huì)喚醒所有等待中的進(jìn)程
  • 但實(shí)際上只有一個(gè)進(jìn)程能獲取連接,其他的進(jìn)程都是被無(wú)效喚醒的
  • 所以 Nginx 采用了自有的一套 accept 加鎖機(jī)制,避免多個(gè)進(jìn)程同時(shí)調(diào)用 accept
  • Nginx 多進(jìn)程的鎖在底層默認(rèn)是通過(guò) CPU 自旋鎖來(lái)實(shí)現(xiàn)。如果操作系統(tǒng)不支持自旋鎖,就采用文件鎖。
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10804

    瀏覽量

    210828
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2966

    瀏覽量

    73812
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7485

    瀏覽量

    88540
  • nginx
    +關(guān)注

    關(guān)注

    0

    文章

    142

    瀏覽量

    12154
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    解析keepalived+nginx實(shí)現(xiàn)高可用方案技術(shù)

    之前講了Nginx 如何實(shí)現(xiàn)負(fù)載均衡以及如何實(shí)現(xiàn)動(dòng)靜分離,實(shí)現(xiàn)系統(tǒng)的分布式部署,提高系統(tǒng)的并發(fā)性能。但是,有個(gè)問(wèn)題:如果
    的頭像 發(fā)表于 09-30 15:52 ?3719次閱讀
    解析keepalived+<b class='flag-5'>nginx</b><b class='flag-5'>實(shí)現(xiàn)</b>高可用方案技術(shù)

    高性能負(fù)載均衡Tomcat集群的實(shí)現(xiàn)

    Nginx+Tomcat搭建高性能負(fù)載均衡集群
    發(fā)表于 08-21 14:31

    使用nginx實(shí)現(xiàn)tomcat負(fù)載均衡

    Nginx+tomcat+memcached實(shí)現(xiàn)負(fù)載均衡及session(交叉存儲(chǔ))
    發(fā)表于 08-28 08:52

    nginx實(shí)現(xiàn)的負(fù)載均衡

    nginx實(shí)現(xiàn)負(fù)載均衡
    發(fā)表于 05-04 13:42

    低消耗電流電壓調(diào)整器 XC6503

      特瑞仕半導(dǎo)體 (TOREX SEMICONDUCTOR LTD.) 開(kāi)發(fā)了不需要輸出電容、最大輸出電流500mA 的低消耗電流電壓調(diào)整器、XC6503 系
    發(fā)表于 10-19 10:13 ?965次閱讀

    Apache與Nginx 簡(jiǎn)單對(duì)比 以及Nginx 基本使用方法

    Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理服務(wù)器,也是一個(gè)目前運(yùn)維必備的工具之一。
    的頭像 發(fā)表于 01-31 14:42 ?8258次閱讀
    Apache與<b class='flag-5'>Nginx</b> 簡(jiǎn)單對(duì)比  以及<b class='flag-5'>Nginx</b> 基本使用方法

    低消耗降壓PFM同步整流 DC/DC轉(zhuǎn)換器

    XC9265系列產(chǎn)品可對(duì)應(yīng)陶瓷電容,內(nèi)置了0.5Ω(TYP.)P溝道驅(qū)動(dòng)晶體管,及0.5Ω (TYP.)N溝道同步整流開(kāi)關(guān)晶體管,超低消耗的降壓PFM同步整流DC/DC轉(zhuǎn)換器。采用了PFM控制而實(shí)現(xiàn)了超低消耗電流,最適用于重視在
    的頭像 發(fā)表于 08-22 12:46 ?7095次閱讀
    超<b class='flag-5'>低消耗</b>降壓PFM同步整流 DC/DC轉(zhuǎn)換器

    軟件開(kāi)發(fā)工程師的進(jìn)階之路

    輕量級(jí),同樣起web 服務(wù),比apache 占用更少的內(nèi)存及資源 ,抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能
    的頭像 發(fā)表于 07-02 17:27 ?2360次閱讀

    XC6237:超低消耗電流,適用于物聯(lián)網(wǎng)設(shè)備和可穿戴設(shè)備

    低消耗電流 0.6μA LDO穩(wěn)壓器
    的頭像 發(fā)表于 07-03 09:43 ?3108次閱讀

    分析Nginx為什么快的原因

    Nginx 以其高性能,穩(wěn)定性,豐富的功能,簡(jiǎn)單的配置和低資源消耗而聞名。本文從底層原理分析 Nginx 為什么這么快!
    的頭像 發(fā)表于 05-04 14:26 ?2619次閱讀
    分析<b class='flag-5'>Nginx</b>為什么快的原因

    低消耗電流CMOS運(yùn)算放大器系列的應(yīng)用特點(diǎn)及優(yōu)勢(shì)

    此次開(kāi)發(fā)的超低消耗電流類(lèi)型,根據(jù)電路技術(shù)大幅度提升了傳統(tǒng)產(chǎn)品,實(shí)現(xiàn)業(yè)界最高級(jí)別的超低消耗電流0.35μA。當(dāng)中的Ground Sense類(lèi)型BU7411G/SG,實(shí)現(xiàn)了從1.6v開(kāi)始的
    發(fā)表于 02-23 10:56 ?1903次閱讀
    <b class='flag-5'>低消耗</b>電流CMOS運(yùn)算放大器系列的應(yīng)用特點(diǎn)及優(yōu)勢(shì)

    詳解Nginx高性能的HTTP和反向代理服務(wù)器

    Nginx 是一個(gè)高性能的 HTTP 和反向代理服務(wù)器,特點(diǎn)是占用內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上 Nginx 的并發(fā)能力確實(shí)在同類(lèi)型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好。
    的頭像 發(fā)表于 03-16 11:23 ?2382次閱讀

    TOREX:了解的IoT器件(電池工作、低消耗)解決方案

    因此,在為傳感器、MCU、無(wú)線通信各功能供應(yīng)超低消耗工作且高效電源的同時(shí),電池控制、監(jiān)視也變得重要。
    的頭像 發(fā)表于 05-22 00:38 ?599次閱讀
    TOREX:了解的IoT器件(電池工作、<b class='flag-5'>低消耗</b>)解決方案

    Nginx目錄結(jié)構(gòu)有哪些

    什么是NginxNginx是一個(gè) 輕量級(jí)/高性能的反向代理Web服務(wù)器,他實(shí)現(xiàn)非常高效的反向代理、負(fù)載平衡,他可以處理2-3萬(wàn)并發(fā)連接數(shù),官方監(jiān)測(cè)能支持5萬(wàn)并發(fā),現(xiàn)在中國(guó)使用
    的頭像 發(fā)表于 11-11 11:27 ?584次閱讀
    <b class='flag-5'>Nginx</b>目錄結(jié)構(gòu)有哪些

    實(shí)現(xiàn)業(yè)界最低消耗電流~ 用于 GNSS的低功耗寬頻帶 LNA“NT1195”開(kāi)始供樣品

    產(chǎn)品特點(diǎn) 1. 同時(shí)實(shí)現(xiàn)低消耗電流和低噪聲系數(shù)(NF)、高增益特性 通過(guò)我們多年培育的獨(dú)特技術(shù),實(shí)現(xiàn)了1.9mA的超低消耗電流和0.7dB的低噪聲系數(shù)(NF)以及18dB的高增益特性。
    的頭像 發(fā)表于 04-23 13:43 ?356次閱讀
    ~<b class='flag-5'>實(shí)現(xiàn)</b>業(yè)界最<b class='flag-5'>低消耗</b>電流~ 用于 GNSS的低功耗寬頻帶 LNA“NT1195”開(kāi)始供樣品