1 設計原理
一個高性能服務器典型特點是處理速度塊且占用資源少.尤其是當上萬連接同時 在線時候.若要做到處理速度快,並發模型設計尤其關鍵.
服務器並發量取決於兩個因素:一是服務器連接的進程數量,二是每個進程可同時處理的並發請求數量,因而服務器並發模型由兩部分構成,服務的提供 方式和鏈接處理機制,
由於這兩種別具一格的方式使得Nginx在同類型的網頁服務器中表現優秀
2 連接方式
一般web服務器連接方式分為三種:多進程方式、多線程方式和異步方式。多進程需要內存復制等額外開銷、多線程不需要開銷較小
異步則采用非阻塞的方式與每個客戶通信,服務器用一個進程進行輪詢,典型應用如Nginx的work process進程。其中效率最高是異步,最穩定是多進程、占用資源少是多線程
Nginx基於事件模型(異步方式)提供服務,更適合每秒連接數和請求數同時非線性增長的情況。即使負載增加了,內存和CPU使用事件數量始終保持可預期。Nginx使用普通的硬件就能在一個服務器上處理數萬的並發連接。這就是Nginx高性能的第一個原因。
3、連接處理機制
linux 連接模型有五種,同步io,同步費阻塞io,異步阻塞io(io復用),異步非阻塞io(信號驅動或者異步io)
以下是重點:
<1> io復用,I/O復用模型會用到select或poll函數,這兩個函數也會使進程阻塞,與阻塞I/O有所不同,他們也可以同時阻塞多個I/O操作,而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。此處理機制redis中也用這也是redis高效的原因之一,redis是單進程單線程的。下圖為io復用原理圖
在 io復用模型中,select和poll一般操作系統都會支持,但是每次等待都需要設置需要等待的套接字接口,並且內部實現不夠高效,很那支付監聽高並發的套接口集,不同的操作系統使用了不同的高級輪詢技術來支持高性能的監聽,一般這些方式都不是可移值的。而Nginx針對不同的操作系統,定制了不同的I/O處理機制,且一般都會采用操作系統的高性能接口,這是Nginx的高性能的第二個原因
<2>異步IO:當一個異步過程調用請求發出后,調用者不能立即得到結果。實際處理這個調用的部件在完成后,會通過狀態、通知和回調來通知調用者的輸入輸出操作
4、Nginx所做的其他
除了以上兩大原理,內部有大量可見的細節優化,采用多進程單線程的工作方式,並且利用cpu和進程的親緣性將進程和特定cpu綁定,避免了進程上下文切換的開銷,從而減少了cpu占用。另外它實現了高效的內存池,將內存占用降到最低等
參考鏈接:http://rdc.hundsun.com/portal/article/595.html