Nginx學習筆記(一) Nginx架構


Nginx架構

  Nginx全程是什么? Nginx ("engine x") 是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。

daemon守護線程

  nginx在啟動后,在unix系統中會以daemon的方式在后台運行,后台進程包含一個master進程和多個worker進程。

  當然nginx也是支持多線程的方式的,只是我們主流的方式還是多進程的方式,也是nginx的默認方式。

  master進程主要用來管理worker進程,包含:接收來自外界的信號,向各worker進程發送信號,監控worker進程的運行狀態,當worker進程退出后(異常情況下),會自動重新啟動新的worker進程。

  worker進程則是處理基本的網絡事件。多個worker進程之間是對等的,他們同等競爭來自客戶端的請求,各進程互相之間是獨立的。一個請求,只可能在一個worker進程中處理,一個worker進程,不可能處理其它進程的請求。

  worker進程的個數是可以設置的,一般我們會設置與機器cpu核數一致。更多的worker數,只會導致進程來競爭cpu資源了,從而帶來不必要的上下文切換。而且,nginx為了更好的利用多核特性,具有cpu綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因為進程的切換帶來cache的失效。

  驚群現象

  每個worker進程都是從master進程fork過來。在master進程里面,先建立好需要listen的socket之后,然后再fork出多個worker進程,這樣每個worker進程都可以去accept這個socket(當然不是同一個socket,只是每個進程的這個socket會監控在同一個ip地址與端口,這個在網絡協議里面是允許的)。一般來說,當一個連接進來后,所有在accept在這個socket上面的進程,都會收到通知,而只有一個進程可以accept這個連接,其它的則accept失敗。

相對於線程,采用進程的優點

  進程之間不共享資源,不需要加鎖,所以省掉了鎖帶來的開銷。

  采用獨立的進程,可以讓互相之間不會影響,一個進程退出后,其它進程還在工作,服務不會中斷,master進程則很快重新啟動新的worker進程。

  編程上更加容易。

  多線程的問題

  而多線程在多並發情況下,線程的內存占用大,線程上下文切換造成CPU大量的開銷。想想apache的常用工作方式(apache也有異步非阻塞版本,但因其與自帶某些模塊沖突,所以不常用),每個請求會獨占一個工作線程,當並發數上到幾千時,就同時有幾千的線程在處理請求了。這對操作系統來說,是個不小的挑戰,線程帶來的內存占用非常大,線程的上下文切換帶來的cpu開銷很大,自然性能就上不去了,而這些開銷完全是沒有意義的。

異步非阻塞

  異步的概念和同步相對的,也就是不是事件之間不是同時發生的。

  非阻塞的概念是和阻塞對應的,阻塞是事件按順序執行,每一事件都要等待上一事件的完成,而非阻塞是如果事件沒有准備好,這個事件可以直接返回,過一段時間再進行處理詢問,這期間可以做其他事情。但是,多次詢問也會帶來額外的開銷。

  總的來說,Nginx采用異步非阻塞的好處在於:

  • 不需要創建線程,每個請求只占用少量的內存
  • 沒有上下文切換,事件處理非常輕量

  淘寶tengine團隊說測試結果是“24G內存機器上,處理並發請求可達200萬”。

  

  參考:http://tengine.taobao.org/book/#id2


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM