1. 程式人生 > >Ngnix的基本學習-多程序和Apache的比較

Ngnix的基本學習-多程序和Apache的比較

Ngnix的學習總結

Ngnix一直以來都是I/O密集性服務的不二選擇,今天就把這兩天整理學習關於Ngnix的基本知識整理下,如果有錯誤,請大家指出,謝謝批評。

基本的架構設計

  1. 介面設計
    所有的模組都遵循著同樣的ngx_module_t介面設計規範。
  2. Ngnix核心及其常用模組設計關係

    從圖中可以看出,總共有四個模組。
    首先是配置模組,配置模組是所有模組的基礎,他實現了最基本的配置項的解析功能。
    nginx定義了一種基礎型別的模組:核心模組,模組型別是NGX_CORE_MODULE。定義核心模組的目的是使得非模組化的框架程式碼只關注與如何呼叫6個核心模組。
    事件模組、HTTP模組、mail模組這三種模組的共性是:實際上它們在核心模組中各有1個模組作為自己的代言人,並在同類模組中有1個作為核心業務與管理功能的模組。

    事件模組是HTTP模組和mail模組的基礎。

Nginx核心程序模型

首先,正常執行中的nginx會有多個程序,最基本的有master process(監控程序,也叫做主程序)和woker process(工作程序),還可能有cache相關程序。

  1. master程序
    監控程序充當整個程序組與使用者的互動介面,同時對程序進行監護。它不需要處理網路事件,不負責業務的執行,只會通過管理worker程序來實現重啟服務、平滑升級、更換日誌檔案、配置檔案實時生效等功能。
    TIPS:master程序中for(::)無限迴圈內有一個關鍵的sigsuspend()函式呼叫,該函式呼叫是的master程序的大部分時間都處於掛起狀態,直到master程序收到訊號為止。

  2. worker程序
    基本的網路事件,是放在worker程序中來處理的,wenkor之間的程序是對等的,只可能在相同的wenkor中處理,一個wenkor程序不可能處理其他程序的請求。
    wenkor的個數,一般來說設定與cpu的個數相同,所以當我們提供8080埠的http請求服務時,一個請求過來,每個程序都有可能處理這個連結。因為更多的worker數,只會導致程序相互競爭cpu資源,從而帶來不必要的上下文切換

  3. 處理過程
    master(master程序會先建立好需要listen的socket)——–fork生成子程序workers,繼承socket(此時workers子程序們都繼承了父程序master的所有屬性,當然也包括已經建立好的socket,當然不是同一個socket,只是每個程序的這個socket會監控在同一個ip地址與埠,這個在網路協議裡面是允許的)
    ——當一個連線進入,產生驚群現象。
    驚群現象:一般來說,當一個連線進來後,所有在accept在這個socket上面的程序,都會收到通知,而只有一個程序可以accept這個連線,其它的則accept失敗。

Nginx對驚群現象的處理:
當一個worker程序在accept這個連線之後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線,一個完整的請求。一個請求,完全由worker程序來處理,而且只在一個worker程序中處理。

Nginx的事件處理機制:
首先,對於一個web伺服器來說,基本事務型別是:網路事件、訊號、定時器。
1. Ngnix採用的是非同步非阻塞的事件處理機制,由程序迴圈處理多個準備好的事件,從而實現高併發和輕量級。
2. 採用訊號事務機制通知worker進行工作
詳解: 以epoll為例:當事件沒有準備好時,就放入epoll裡面。如果有事件準備好了,那麼就去處理;如果事件返回的是EAGAIN,那麼繼續將其放入epoll裡面。從而,只要有事件準備好了,我們就去處理她,只有當所有時間都沒有準備好時,才在epoll裡面等著。這樣,我們就可以併發處理大量的併發了,當然,這裡的併發請求,是指未處理完的請求,執行緒只有一個,所以同時能處理的請求當然只有一個了,只是在請求間進行不斷地切換而已,切換也是因為非同步事件未準備好,而主動讓出的。
這裡的切換是沒有任何代價,你可以理解為迴圈處理多個準備好的事件

題外問題

Nginx與Apache對於高併發處理上的區別
對於Apache,每個請求都會獨佔一個工作執行緒,當併發數到達幾千時,就同時有幾千的執行緒在處理請求了。這對於作業系統來說,佔用的記憶體非常大,執行緒的上下文切換帶來的cpu開銷也很大,效能就難以上去,同時這些開銷是完全沒有意義的。
對於Nginx來講,一個程序只有一個主執行緒,通過非同步非阻塞的事件處理機制,實現了迴圈處理多個準備好的事件,從而實現輕量級和高併發。

—————————————-

Nginx比較Apache:事件驅動適合於IO密集型服務,多程序或執行緒適合於CPU密集型服務
1. Nginx更主要是作為反向代理,而非Web伺服器使用。其網路模式是事件驅動(select、poll、epoll)。
2. 事件驅動的本質還是IO事件,應用程式在多個IO控制代碼間快速切換,實現所謂的非同步IO。
3. 事件驅動伺服器,最適合做的就是這種IO密集型工作,如反向代理,它在客戶端與WEB伺服器之間起一個數據中轉作用,純粹是IO操作,自身並不涉及到複雜計算。
4. 反向代理用事件驅動來做,顯然更好,一個工作程序就可以run了,沒有程序、執行緒管理的開銷,CPU、記憶體消耗都小。
5. 當然,Nginx也可以是多程序 + 事件驅動的模式,幾個程序跑libevent,不需要Apache那樣動輒數百的程序數。
6. Nginx處理靜態檔案效果也很好,那是因為靜態檔案本身也是磁碟IO操作,處理過程一樣。至於說多少萬的併發連線,這個毫無意義。我隨手寫個網路程式都能處理幾萬7)的併發,但如果大部分客戶端阻塞在那裡,就沒什麼價值。

再看看Apache或者Resin這類應用伺服器,之所以稱他們為應用伺服器,是因為他們真的要跑具體的業務應用,如科學計算、圖形影象、資料庫讀寫等。它們很可能是CPU密集型的服務,事件驅動並不合適。

  1. 例如一個計算耗時2秒,那麼這2秒就是完全阻塞的,什麼event都沒用。想想MySQL如果改成事件驅動會怎麼樣,一個大型的join或sort就會阻塞住所有客戶端。
  2. 這個時候多程序或執行緒就體現出優勢,每個程序各幹各的事,互不阻塞和干擾。當然,現代CPU越來越快,單個計算阻塞的時間可能很小,但只要有阻塞,事件程式設計就毫無優勢。所以程序、執行緒這類技術,並不會消失,而是與事件機制相輔相成,長期存在。

總結之,事件驅動適合於IO密集型服務,多程序或執行緒適合於CPU密集型服務,它們各有各的優勢,並不存在誰取代誰的傾向。

相關推薦

Ngnix基本學習-程序Apache比較

Ngnix的學習總結 Ngnix一直以來都是I/O密集性服務的不二選擇,今天就把這兩天整理學習關於Ngnix的基本知識整理下,如果有錯誤,請大家指出,謝謝批評。 基本的架構設計 介面設計 所有的模組都遵循著同樣的ngx_module_t介面設計規範

Python基本學習-過載

多型 多型指的是不同類的相同方法,相同引數,不同功能。 呼叫時便於將一組物件放在集合裡,無需判斷物件的具體型別,統一呼叫 里氏代換原則:父類能出現的地方,子類一定能出現,反之則不一定 例項參加Python基本學習-組合(組合可以呼叫不同類的相同方

程序執行緒學習

關於多程序和多執行緒,教科書上最經典的一句話是“程序是資源分配的最小單位,執行緒是CPU排程的最小單位”,這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。 經常在網路上看到有的XDJM問“多程序好還是多執

Apache學習---程序處理模組(MPM)原理詳解

          檢視Apache的模式,可以使用httpd -V命令來檢視: 1. prefork MPM prefork模式可以算是很古老但是非常穩定的Apache模式。Apache在啟動之初,就預先fork一些子程序,然後等待請求進來。之

核處理器&類UNIX系統 -> 之程序執行緒效能比較

網路上有很多討論關於在*NIX系統在SMP環境下到底是應該用多執行緒還是多程序, 到底哪一個有更好的效能,  比如有很多人認為考慮到linux使用1-1執行緒模型(對核心來說, 執行緒就是一個程序)並且系統已經為程序處理做了很多優化,效率提升, 所以在liunx SMP環

IO複用、程序執行緒三種併發程式設計模型比較

 I/O複用模型 I/O複用原理:讓應用程式可以同時對多個I/O埠進行監控以判斷其上的操作是否可以進行,達到時間複用的目的。在書上看到一個例子來解釋I/O的原理,我覺得很形象,如果用監控來自10根不同地方的水管(I/O埠)是否有水流到達(即是否可讀),那麼需要10個人(

學習整理——程序執行緒概念理解

程序         一個程序,包括了程式碼、資料和分配給程序的資源(記憶體),在計算機系統裡直觀地說一個程序就是一個PID。作業系統保護程序空間不受外部程序干擾,即一個程序不能訪問到另一個程序的記憶體。有時候程序間需要進行通訊,這時可以使用作業系統提供程序間通訊機制。通常

Python執行緒、程序協程的例項講解

執行緒、程序和協程是什麼 執行緒、程序和協程的詳細概念解釋和原理剖析不是本文的重點,本文重點講述在Python中怎樣實際使用這三種東西 參考: 程序、執行緒、協程之概念理解 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。執

Python學習程序併發寫入同一檔案

最近學習了Python的多程序,想到我的高德API爬蟲那個爬取讀寫速度我就心累,實在是慢,看到多程序可以充分利用CPU核數我就開始完善我的程式碼,不過過程是艱辛的,在此之中出現了很多問題,其中最大的問題是爬取的資料是正確的,但是讀寫到Excel中卻開啟是空,想了半天也沒解決,腦子笨沒辦法,不過我

程序執行緒的優缺點

在Linux下程式設計多用多程序程式設計少用多執行緒程式設計。          IBM有個傢伙做了個測試,發現切換執行緒context的時候,windows比linux快一倍多。進出最快的鎖(windows2k的

關於程序,執行緒,程序執行緒的網路程式設計

程序執行緒網路 多工程式設計 : 可以有效的利用計算機資源,同時執行多個任務 程序 : 程序就是程式在計算機中一次執行的過程 程序和程式的區別: 程式是一個靜態檔案的描述,不佔計算機的系統資源 程序是一個動態的過程,佔有cpu記憶體等資源,有一定的生命週期 * 同一個程式的不同執行過程即為不同的程序

Python之——Python中的程序執行緒

轉載請註明出處:https://blog.csdn.net/l1028386804/article/details/83042246 一、多程序 Python實現對程序的方式主要有兩種,一種方法是使用os模組中的fork方法,另一種方法是使用multiprocessing模組。區別在於:

Linux程序執行緒的優缺點

教科書上最經典的一句話是“程序是作業系統分配的最小單位,執行緒是CPU排程的最小單位”。 多執行緒的優點: 1)它是一種非常”節儉”的多工操作方式。在Linux系統下,啟動一個新的程序必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段,這是一種”昂貴”

linux程序執行緒

轉載自CodeUniverse的部落格 程序:可執行程式是儲存在磁碟裝置上的由程式碼和資料按某種格式組織的靜態實體,而程序是可被排程的程式碼的動態執行。 在Linux系統中,每個程序都有各自的生命週期。在一個程序的生命週期中,都有各自的執行環境以及所需的資源,這些資訊都記錄在各自的程序控制塊中,以便系統對

程序執行緒簡單tcp聊天程式

如果需要一個服務端可以連線多個客戶端,並同時與多個(不超多listen第二個引數及最大同時併發數)客戶端通訊,可以利用多程序即建立子程序,子程序來完成服務端的接受和傳送資料;也可以建立多個執行緒。對於tcp一些介面具體使用可以檢視這篇部落格:https://bl

(Java學習筆記)instanceofisInstance比較

前提條件: class Father{} class Child extends Father{} Father father = new Father(); Child child = new Child(); Father child_father = ne

python中的程序執行緒

作者:liuyazhuang  來源:CSDN  原文:https://blog.csdn.net/l1028386804/article/details/83042246?utm_source=copy  轉載出處:https://blog.csdn.net/l102838

網路程式設計實驗四——利用程序執行緒實現伺服器端的併發處理

一、實驗目的 1.在TCP檔案傳輸程式碼的基礎上,利用多程序實現伺服器端的併發處理。  2.利用多執行緒實現伺服器端的併發處理。 二、實驗原理 併發的面向連線伺服器演算法: 主1、建立套接字並將其繫結到所提供服務的熟知地址上。讓該套接字保持為無連線的。 主2、將

網路程式設計——4.利用程序執行緒實現伺服器端的併發處理

一、實驗要求     在TCP檔案傳輸程式碼的基礎上,利用單執行緒程序併發模型和多執行緒併發模型實現伺服器端的併發處理。 二、實驗分析     多執行緒與多程序相比,使用多執行緒相比多程序有以下兩個優點:更高的效率和共享儲存器,效率的提高源於上下文切換次數的減少。

websocket基於php 記一次結合PHP程序socket.io解決問題的經歷

記一次結合PHP多程序和socket.io解決問題的經歷     公司是做棋牌遊戲的。前段時間接到一個後臺人工鑑定並處理通牌作弊玩家的需求,其中需要根據幾個玩家的遊戲ID查詢並計算他們在某段時間內彼此之間玩牌輸贏次數和輸贏總額。   牌局資料是儲存在日誌中心的,他們把牌