Nginx系列(4):Web服務器分析(理論上)

目錄

一、線程、進程、併發連接數

1.進程與線程

2.併發連接數

3.併發連接數的計算方法

二、Web服務器提供服務的方式

三、多進程、多線程、異步模式的對比

1.多進程

2.多線程

3.異步方式

四、Web 服務請求過程


一、線程、進程、併發連接數

在說Web服務器之前,先說說線程、進程、以及併發連接數

1.進程與線程

       進程是具有一定獨立功能的程序,關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。從邏輯角度來看,多線程的意義在於一個應用程序(進程)中,有多個執行部分可以同時執行。但操作系統並沒有將多個線程看做多個獨立的應用來實現,而是作爲進程來調度和管理以及資源分配。這就是進程和線程的重要區別。

進程和線程的主要區別在於,進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響,而線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變量,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。但對於一些要求同時進行並且又要共享某些變量的併發操作,只能用線程,不能用進程。好了,我想我已經說明白進程與線程了,下面我們來說一說併發連接數。

2.併發連接數

(1)什麼是最大併發連接數呢?

最大併發連接數是服務器同一時間能處理最大會話數量。

(2)何爲會話?

我們打開一個網站就是一個客戶端瀏覽器與服務端的一個會話,而我們瀏覽網頁是基於http協議。

(3)HTTP協議如何工作?

HTTP支持兩種建立連接的方式:非持久連接和持久連接(HTTP1.1默認的連接方式爲持久連接)。

(4)瀏覽器與Web服務器之間將完成下列7個步驟

  • 建立TCP連接
  • Web瀏覽器向Web服務器發送請求命令
  • Web瀏覽器發送請求頭信息
  • Web服務器應答
  • Web服務器發送應答頭信息
  • Web服務器向瀏覽器發送數據
  • Web服務器關閉TCP連接

       一般情況下,一旦Web服務器向瀏覽器發送了請求數據,它就要關閉TCP連接,但是瀏覽器一般其頭信息加入了這行代碼 Connection:keep-alive,TCP連接在發送後將仍然保持打開狀態,於是,瀏覽器可以繼續通過相同的連接發送請求。保持連接目的,節省了爲每 個請求建立新連接所需的時間,還節約了網絡帶寬。

3.併發連接數的計算方法

  • 下載:用戶下載服務器上的文件,則爲一個連接,用戶文件下載完畢後這個連接就消失了。有時候用戶用迅雷的多線程方式下載的話,這一個用戶開啓了5個線程的話,就算是5個連接。
  • 用戶打開你的頁面,就算停留在頁面沒有對服務器發出任何請求,那麼在用戶打開一面以後的15分鐘內也都要算一個在線。
  • 上面的情況用戶繼續打開同一個網站的其他頁面,那麼在線人數按照用戶最後一次點擊(發出請求)以後的15分鐘計算,在這個15分鐘內不管用戶怎麼點擊(包括新窗口打開)都還是一人在線。
  • 當用戶打開頁面然後正常關閉瀏覽器,用戶的在線人數也會馬上清除。

二、Web服務器提供服務的方式

       Web服務器由於要同時爲多個客戶提供服務,就必須使用某種方式來支持這種多任務的服務方式。

一般情況下可以有以下三種方式來選擇,多進程方式、多線程方式及異步方式

其中,多進程方式中服務器對一個客戶要使用一個進程來提供服務,由於在操作系統中,生成一個進程需要進程內存複製等額外的開銷,這樣在客戶較多時的性能就會降低。爲了克服這種生成進程的額外開銷,可以使用多線程方式或異步方式。在多線程方式中,使用進程中的多個線程提供服務, 由於線程的開銷較小,性能就會提高。事實上,不需要任何額外開銷的方式還是異步方式,它使用非阻塞的方式與每個客戶通信,服務器使用一個進程進行輪詢就行了。

       雖然異步方式最爲高效,但它也有自己的缺點。因爲異步方式下,多個任務之間的調度是由服務器程序自身來完成的,而且一旦一個地方出現問題則整個服務器就會出現問題。因此,向這種服務器增加功能,一方面要遵從該服務器自身特定的任務調度方式,另一方面要確保代碼中沒有錯誤存在,這就限制了服務器的功能,使得異步方式的Web服務器的效率最高,但功能簡單,如Nginx服務器。

       由於多線程方式使用線程進行任務調度,這樣服務器的開發由於遵從標準,從而變得簡單並有利於多人協作。然而多個線程位於同一個進程內,可以訪問同樣的內存空間,因此存在線程之間的影響,並且申請的內存必須確保申請和釋放。對於服務器系統來講,由於它要數天、數月甚至數年連續不停的運轉,一點點錯誤就會逐漸積累而最終導致影響服務器的正常運轉,因此很難編寫一個高穩定性的多線程服務器程序。但是,不是不能做到時。Apache的worker模塊就能很好的支持多線程的方式。

       多進程方式的優勢就在於穩定性,因爲一個進程退出的時候,操作系統會回收其佔用的資源,從而使它不會留下任何垃圾。即便程序中出現錯誤,由於進程是相互隔離的,那麼這個錯誤不會積累起來,而是隨着這個進程的退出而得到清除。Apache的prefork模塊就是支持多進程的模塊。


三、多進程、多線程、異步模式的對比

Web服務器總的來說提供服務的方式有三種,

  • 多進程方式
  • 多線程的方式
  • 異步方式

其中效率最高的是異步的方式,最穩定的是多進程方式,佔用資源較少的是多線程的方式。

1.多進程

       此種架構方式中,web服務器生成多個進程並行處理多個用戶請求,進程可以按需或事先生成。有的web服務器應用程序爲每個用戶請求生成一個單獨的進程來進行響應,不過,一旦併發請求數量達到成千上萬時,多個同時運行的進程將會消耗大量的系統資源。(即每個進程只能響應一個請求或多個進程對應多個請求)

優點:

  • 最大的優勢就在於穩定性,一個進程出錯不會影響其它進程。如,服務器同時連接100個請求對就的是100個進程,其中一個進程出錯,只會殺死一個進程,還有99個進程繼續響應用戶請求。
  • 每個進程響應一個請求

缺點:

  • 進程量大,進程切換次數過多,導致CPU資源使用效率低
  • 每個進程的地址空間是獨立的,很多空間中重複的數據,所以內存使用效率低
  • 進程切換由於內核完成,佔用CPU資源

2.多線程

       在多線程方式中,每個線程來響應一下請求,由於線程之間共享進程的數據,所以線程的開銷較小,性能就會提高。

優點:

  • 線程間共享進程數據
  • 每個線程響應一個請求
  • 線程切換不可避免(切換量級比較輕量)
  • 同一進程的線程可以共享進程的諸多資源,比如打開的文件
  • 對內存的需求較之進程有很大下降
  • 讀可以共享,寫不可以共享

缺點:

  • 線程快速切換時會帶來線程抖動
  • 多線程會導致服務器不穩定

3.異步方式

       一個進程或線程響應多個請求,不需要任何額外開銷的,性能最高,佔用資源最少。但也有問題一但進程或線程出錯就會導致整個服務器的宕機。


四、Web 服務請求過程

在上面的內容中,Web服務器的如何提供服務的,有多進程的方式、多線程的方式還有異步方式我們先簡單這麼理解,大家肯定還有很多疑問,我們先存疑,後面我們慢慢說,現在我們不管Web服務器是如何提供服務的,多進程也好、多線程好,異步也罷。下面我們來說一下,一個客戶端的具體請求Web服務的具體過程,從上圖中我們可以看到有11步,下面我們來具體說一下:

  • 首先我們客戶端發送一個請求到Web服務器,請求首先是到網卡。
  • 網卡將請求交由內核空間的內核處理,其實就是拆包了,發現請求的是80端口。
  • 內核便將請求發給了在用戶空間的Web服務器,Web服務器接受到請求發現客戶端請求的index.html頁面、
  • Web服務器便進行系統調用將請求發給內核
  • 內核發現在請求的是一頁面,便調用磁盤的驅動程序,連接磁盤
  • 內核通過驅動調用磁盤取得的頁面文件
  • 內核將取得的頁面文件保存在自己的緩存區域中便通知Web進程或線程來取相應的頁面文件
  • Web服務器通過系統調用將內核緩存中的頁面文件複製到進程緩存區域中
  • Web服務器取得頁面文件來響應用戶,再次通過系統調用將頁面文件發給內核
  • 內核進程頁面文件的封裝並通過網卡發送出去
  • 當報文到達網卡時通過網絡響應給客戶端

簡單來說就是:

用戶請求-->送達到用戶空間-->系統調用-->內核空間-->內核到磁盤上讀取網頁資源->返回到用戶空間->響應給用戶。

上述簡單的說明了一下,客戶端向Web服務請求過程,在這個過程中,有兩個I/O過程,一個就是客戶端請求的網絡I/O,另一個就是Web服務器請求頁面的磁盤I/O。 預知Linux的I/O模型如何,下篇內容繼續。


願你就像早晨八九點鐘的太陽,活力十足,永遠年輕。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章