nginx實現(xiàn)高性能和可擴展性的方法-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關nginx實現(xiàn)高性能和可擴展性的方法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)長期為近千家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為永勝企業(yè)提供專業(yè)的成都網站設計、成都做網站,永勝網站改版等技術服務。擁有十載豐富建站經驗和眾多成功案例,為您定制開發(fā)。

NGINX的整體架構的特點是由一組進程協(xié)同工作:

主進程:負責執(zhí)行特權操作,如閱讀配置文件、綁定套接字、創(chuàng)建/通知協(xié)調(Signalling)子進程。

工作進程:負責接收和處理連接請求,讀取和寫入磁盤,并與上游服務器通信。當NGINX處于活躍狀態(tài)時,只有工作進程是忙碌的。

緩存加載器進程:負責將磁盤高速緩存加載到內存中。這個進程在啟動時運行后隨即退出。

緩存管理器進程:負責整理磁盤緩存的數(shù)據(jù)保證其不越界。這個進程會間歇性運行。

NGINX能夠實現(xiàn)高性能和可擴展性的關鍵取決于兩個基本的設計選型:

盡可能限制工作進程的數(shù)量,從而減少上下文切換帶來的開銷。默認和推薦配置是讓每個CPU內核對應一個工作進程,從而高效利用硬件資源。

工作進程采用單線程,并以非阻塞的方式處理多個并發(fā)連接。

NGINX的每個工作進程通過狀態(tài)機處理多個連接請求,這個狀態(tài)機被實現(xiàn)為非阻塞的工作方式:

每個工作進程需要處理若干套接字,包括監(jiān)聽套接字或者連接套接字。

當監(jiān)聽套接字收到新的請求時,會打開一個新的連接套接字來處理與客戶端的通信。

當一個事件到達連接套接字時,工作進程迅速完成響應,并轉而處理其他任何套接字新收到的事件。

Garrett說,NGINX選擇這樣的設計,使它從根本上區(qū)別于其他Web服務器。通常的Web服務器會選用將每個連接分配給獨立線程的模式,這使得多個連接的處理非常容易,因為每個連接可以被認為是包含多個步驟的一個線性序列,但這樣會產生上下文切換的開銷。事實上,工作線程大部分的時間處于阻塞的狀態(tài),在等待客戶端或其它上游服務器。當試圖執(zhí)行I/O等操作的并發(fā)連接數(shù)/線程數(shù)的規(guī)模超過一定閾值,或是內存消耗殆盡的時候,上下文切換的成本就顯現(xiàn)出來了。

從另一方面講,NGINX的設計是不讓工作進程阻止網絡流量,除非沒有任何工作要做。此外,每一個新的連接只消耗很少的資源,僅包括一個文件描述符和少量的工作進程內存。

總的來說,NGINX的這種工作模式在系統(tǒng)調優(yōu)后,它的每個工作進程都能夠處理成百上千的HTTP并發(fā)連接。

深入NGINX:我們如何設計它的性能和擴展性

NGINX之所以能在性能上如此優(yōu)越,是由于其背后的設計。許多web服務器和應用服務器使用簡單的線程的(threaded)、或基于流程的(process-based)架構,NGINX則以一種復雜的事件驅動(event-driven)的架構脫穎而出,這種架構能支持現(xiàn)代硬件上成千上萬的并發(fā)連接。

Inside NGINX infographic涉及了從高層次進程架構的挖掘,到NGINX的單進程處理多連接的圖解。本篇文章講解了這些工作細節(jié)。

設置場景——NGINX進程模型

Setting the Scene ? the NGINX Process Model

為了更好地理解設計,你需要了解NGINX是如何工作的。NGINX有一個主進程(master process)(執(zhí)行特權操作,如讀取配置、綁定端口)和一系列工作進程(worker process)和輔助進程(helper process)。

這個四核服務器內,NGINX主進程創(chuàng)建了4個工作進程和2個緩存輔助進程(cache helper processes)來管理磁盤內容緩存(on-disk content cache)。

為什么架構很重要?

Why Is Architecture Important?

任何Unix應用程序的根本基礎都是線程或進程。(從Linux操作系統(tǒng)的角度看,線程和進程基本上是相同的,主要區(qū)別是他們共享內存的程度。) 進程或線程,是一組操作系統(tǒng)可調度的、運行在CPU內核上的獨立指令集。大多數(shù)復雜的應用程序都并行運行多個線程或進程,原因有兩個:

● 可以同時使用更多的計算機內核。

●線程和進程使并行操作很容易實現(xiàn)(例如,同時處理多個連接)。

進程和線程都消耗資源。它們都使用內存和其他OS資源,導致內核頻繁切換(被稱作上下文切換(context switch)的操作)。大多數(shù)現(xiàn)代服務器可以同時處理數(shù)百個小的、活躍的(active)線程或進程,但一旦內存耗盡,或高I/O負載導致大量的上下文切換時,服務器的性能就會嚴重下降。

對于網絡應用,通常會為每個連接(connection)分配一個線程或進程。這種架構易于實現(xiàn),但是當應用程序需要處理成千上萬的并發(fā)連接時,這種架構的擴展性就會出現(xiàn)問題。

NGINX是如何工作的?

How Does NGINX Work?

NGINX使用一個了可預見式的(predictable)進程模型,調度可用的硬件資源:

1.主進程執(zhí)行特權操作,如讀取配置和綁定端口,還負責創(chuàng)建子進程(下面的三種類型)。

2.緩存加載進程(cache loader process)在啟動時運行,把基于磁盤的緩存(disk-based cache)加載到內存中,然后退出。對它的調度很謹慎,所以其資源需求很低。

3.緩存管理進程(cache manager process)周期性運行,并削減磁盤緩存(prunes entries from the disk caches),以使其保持在配置范圍內。

4.工作進程(worker processes)才是執(zhí)行所有實際任務的進程:處理網絡連接、讀取和寫入內容到磁盤,與上游服務器通信等。

多數(shù)情況下,NGINX建議每1個CPU核心都運行1個工作進程,使硬件資源得到最有效的利用。你可以在配置中設置如下指令:

worker_processes auto

當NGINX服務器在運行時,只有工作進程在忙碌。每個工作進程都以非阻塞的方式處理多個連接,以消減上下文切換的開銷。

每個工作進程都是單線程且獨立運行的,抓取并處理新的連接。進程間通過共享內存的方式,來共享緩存數(shù)據(jù)、會話持久性數(shù)據(jù)(session persistence data)和其他共享資源。

NGINX內部的工作進程

Inside the NGINX Worker Process

每一個NGINX的工作進程都是NGINX配置(NGINX configuration)初始化的,并被主進程設置了一組監(jiān)聽套接字(listen sockets)。

NGINX工作進程會監(jiān)聽套接字上的事件(accept_mutex和kernel socket sharding),來決定什么時候開始工作。事件是由新的連接初始化的。這些連接被會分配給狀態(tài)機(state machine)——HTTP狀態(tài)機是最常用的,但NGINX還為流(原生TCP)和大量的郵件協(xié)議(SMTP,IMAP和POP3)實現(xiàn)了狀態(tài)機。

狀態(tài)機本質上是一組告知NGINX如何處理請求的指令。大多數(shù)和NGINX具有相同功能的web服務器也使用類似的狀態(tài)機——只是實現(xiàn)不同。

調度狀態(tài)機

Scheduling the State Machine

把狀態(tài)機想象成國際象棋的規(guī)則。每個HTTP事務(HTTP transaction)都是一局象棋比賽。棋盤的一邊是web服務器——坐著一位可以迅速做出決定的大師級棋手。另一邊是遠程客戶端——在相對較慢的網絡中,訪問站點或應用程序的web瀏覽器。

然而,比賽的規(guī)則可能會很復雜。例如,web服務器可能需要與各方溝通(代理一個上游的應用程序),或者和認證服務器交流。web服務器的第三方模塊也可以拓展比賽規(guī)則。

阻塞狀態(tài)機

A Blocking State Machine

回憶一下我們之前對進程和線程的描述:是一組操作系統(tǒng)可調度的、運行在CPU內核上的獨立指令集。大多數(shù)web服務器和web應用都使用一個連接 /一個進程或一個連接/一個線程的模型來進行這局國際象棋比賽。每個進程或線程都包含一個將比賽玩到最后的指令。在這個過程中,進程是由服務器來運行的,它的大部分時間都花在“阻塞(blocked)”上,等待客戶端完成其下一個動作。

1.web服務器進程(web server process)在監(jiān)聽套接字上,監(jiān)聽新的連接(客戶端發(fā)起的新比賽)。

2.一局新的比賽發(fā)起后,進程就開始工作,每一步棋下完后都進入阻塞狀態(tài),等待客戶端走下一步棋。

3.一旦比賽結束,web服務器進程會看看客戶是否想開始新的比賽(這相當于一個存活的連接)。如果連接被關閉(客戶端離開或者超時),web服務器進程會回到監(jiān)聽狀態(tài),等待全新的比賽。

記住重要的一點:每一個活躍的HTTP連接(每局象棋比賽)都需要一個專用的進程或線程(一位大師級棋手)。這種架構非常易于擴展第三方模塊 (“新規(guī)則”)。然而,這里存在著一個巨大的不平衡:一個以文件描述符(file descriptor)和少量內存為代表的輕量級HTTP連接,會映射到一個單獨的進程或線程——它們是非常重量級的操作系統(tǒng)對象。這在編程上是方便的,但它造成了巨大的浪費。

NGINX是真正的大師

NGINX is a True Grandmaster

也許你聽說過車輪表演賽,在比賽中一個象棋大師要在同一時間對付幾十個對手。

Kiril Georgiev在保加利亞首都索菲亞同時對陣360名棋手,最終取得284勝,70平,6負的戰(zhàn)績。

這就是NGINX工作進程玩“國際象棋”的方式。每一個工作進程都是一位大師(記?。和ǔG闆r下,每個工作進程占用一個CPU內核),能夠同時對戰(zhàn)上百棋手(實際上是成千上萬)。

1.工作進程在監(jiān)聽套接字和連接套接字上等待事件。

2.事件發(fā)生在套接字上,工作進程會處理這些事件。

●監(jiān)聽套接字上的事件意味著:客戶端開始了一局新的游戲。工作進程創(chuàng)建了一個新的連接套接字。

●連接套接字上的事件意味著:客戶端移動了棋子。工作進程會迅速響應。

工作進程從不會在網絡上停止,它時時刻刻都在等待其“對手”(客戶端)做出回應。當它已經移動了這局比賽的棋子,它會立即去處理下一局比賽,或者迎接新的對手。

為什么它會比阻塞式多進程的架構更快?

Why Is This Faster than a Blocking, Multi-Process Architecture?

NGINX的規(guī)??梢院芎玫刂С置總€工作進程上數(shù)以萬計的連接。每個新連接都會創(chuàng)建另一個文件描述符,并消耗工作進程中少量的額外內存。每一個連接的額外消耗都很少。NGINX進程可以保持固定的CPU占用率。當沒有工作時,上下文切換也較少。

在阻塞式的、一個連接/一個進程的模式中,每個連接需要大量的額外資源和開銷,并且上下文切換(從一個進程到另一個進程)非常頻繁。

如果想了解更多,請查看由NGINX公司發(fā)展和聯(lián)合創(chuàng)始人副總裁Andrew Alexeev編寫的有關NGINX體系結構的文章。

通過適當?shù)南到y(tǒng)調優(yōu),NGINX能大規(guī)模地處理每個工作進程數(shù)十萬并發(fā)的HTTP連接,并且能在流量高峰期間不丟失任何信息(新比賽開始)。

配置更新和NGINX升級

Updating Configuration and Upgrading NGINX

僅包含少量工作進程的NGINX進程架構,使得配置、甚至是二進制文件本身的更新都非常高效。

更新NGINX的配置,是一個非常簡單的、輕量級的、可靠的操作。運行nginx ?s reload命令即可,該命令會檢查磁盤上的配置,并給主進程發(fā)送一個SIGHUP信號。

當主進程接收到SIGHUP信號后,會做兩件事:

1.重新加載配置,fork一套新的工作進程。這些新的工作進程會立即開始接受連接和處理流量(traffic)(使用新的配置)。

2.發(fā)出信號,通知舊的工作進程安靜地退出。這些舊進程不會再接受新的連接了。只要它們處理的HTTP請求結束了,它們就會干凈地關閉連接。一旦所有的連接都被關閉,工作進程也就退出了。

這個過程會導致CPU占用率和內存使用的一個小高峰,但相比于從活動連接中加載資源,這個小高峰可忽略不計。你可以在一秒內重新加載配置多次。極少情況下,一代又一代工作進程等待連接關閉時會出現(xiàn)問題,但即便出現(xiàn)問題,它們也會被立即解決掉。

NGINX的二進制升級過程更加神奇——你可以飛速地升級NGINX本身,服務器不會有任何的丟連接、宕機、或服務中斷等情況。

二進制升級過程與配置更新相似。新的NGINX主進程與原來的主進程并行,它們共享監(jiān)聽套接字。兩個進程都是活躍的(active),它們各自的工作進程處理各自的流量(traffic)。然后,你可以通知舊的主進程與其工作進程完美退出。

在Controlling NGINX中,整個過程有更詳細的描述。

感謝各位的閱讀!關于“nginx實現(xiàn)高性能和可擴展性的方法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

新聞標題:nginx實現(xiàn)高性能和可擴展性的方法-創(chuàng)新互聯(lián)
轉載注明:http://bm7419.com/article42/dcoehc.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、品牌網站建設、靜態(tài)網站、微信公眾號、自適應網站用戶體驗

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網站建設