Nginx實現高速併發處理的原理詳解
眾所周知,Nginx是當下最流行的Web伺服器,它具有很強的負載均衡,反向代理,郵件代理以及靜態快取的功能。在提供這些功能的同時,Nginx的效能也極其優秀,可以輕鬆支援百萬、千萬級的併發連線,能夠為Tomcat、Django等效能不佳的Web應用抗住絕大部分外部流量。那麼,Nginx是如何實現高速併發處理呢?這就要從它優秀的架構設計來說起。 框架結構 如下圖所示,Nginx結合採用多程式和IO多路複用的結構處理併發客戶請求。 Master程式主要負責訊號處理,監控和管理Worker程式。 Master程式本身不處理具體業務。Worker程式處理具體業務,包括處理連線請求和網路讀寫事件的處理。多個worker程式可以獨立地處理各自的客戶連線。Worker程式之間透過訊號量和共享記憶體進行通訊。 透過配置與系統CPU等量的worker程式,可以實現某一個程式繫結某一個特定CPU從而減少系統開銷。在每一個worker程式處理多個client併發連線請求時,Nginx 採用IO多路複用技術在一個程式內同時處理多個client的網路讀寫事件。與多程式/執行緒處理多連線請求模型相比,IO多路複用可以減少大量的程式排程帶來的系統開銷,從而提高系統整體的處理效能。 併發處理方式 網路伺服器在處理併發處理方式,如上圖socket處理流程所示,根據accept得到新連線以後是啟用新的程式/執行緒還是直接在原來本程式內處理,分為如下兩種方式。 一種是多程式/執行緒方式,這種方式為每一個新來的連線生成一個新的程式/執行緒來單獨處理。另外一種是IO多路複用,這種方式在一個程式/執行緒中維護所有的連線的socket,透過事件處理的方式依次處理所有連線上的網路事件。 多執行緒模型如下: 在多程式/執行緒的模型中,根據accept在新老程式中的位置又分為兩種。一種型別是accept在父程式中進行,每次accept以後,fork一個新程式或者建立一個新執行緒來處理新accept的連線。一種型別是父程式在listen呼叫以後,fork出多個程式或者建立多個執行緒分別進行accept. IO多路複用模型如下: IO多路複用又稱為event driven IO。就是在同一個程式內同時處理多路IO,進而提高系統吞吐量。一般是透過維護一個連線池,當某個連線有資料到達,通知程式來進行資料處理。Nginx支援多種併發連線請求,比如select,poll,epoll,kqueue(針對bsd)等等,這些請求可以透過配置檔案進行選擇。一般在linux上epoll的效率要比select,poll高很多。 綜上所述,Nginx透過本身優秀的框架設計,加上核心對並行網路處理的支援,得到了非常好的併發處理效能。 |
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25922618/viewspace-2749632/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Nginx 實現高併發的原理分析Nginx
- 併發容器之ArrayBlockingQueue和LinkedBlockingQueue實現原理詳解BloC
- 併發程式設計 — CAS 原理詳解程式設計
- Postgres併發處理
- MySQL 併發處理MySql
- 併發Lock之ReentrantLock實現原理ReentrantLock
- java併發之SynchronousQueue實現原理Java
- 併發——深入分析ThreadLocal的實現原理thread
- 併發容器的原理,七大併發容器詳解、及使用場景
- 3種方式實現python多執行緒併發處理Python執行緒
- 詳解Spring Retry實現原理Spring
- 高併發實戰之冪等處理
- MySQL原理簡介—8.MySQL併發事務處理MySql
- 海量資料的併發處理
- 處理併發衝突
- 《java併發程式設計的藝術》併發底層實現原理Java程式設計
- 詳解Redisson分散式限流的實現原理Redis分散式
- 最強幹貨:Java併發之AQS原理詳解JavaAQS
- Go併發呼叫的超時處理Go
- SQLite 併發的四種處理方式SQLite
- Entity Framework Core中的併發處理Framework
- 併發問題處理方式
- Nginx Ingress 高併發實踐Nginx
- 輕鬆應對百萬併發的Nginx是怎麼處理這些網路事件的?Nginx事件
- 【影像處理】基於OpenCV實現影像直方圖的原理OpenCV直方圖
- Nginx實現原理master和workerNginxAST
- 詳解AI開發中的資料預處理(清洗)AI
- 架構設計 | 非同步處理流程,多種實現模式詳解架構非同步模式
- 【死磕Java併發】-----深入分析synchronized的實現原理Javasynchronized
- 【死磕Java併發】—–深入分析volatile的實現原理Java
- 處理高併發的一般思路
- Java ConcurrentHashMap 高併發安全實現原理解析JavaHashMap
- 詳解布隆過濾器的原理和實現過濾器
- Python廣為使用的併發處理庫futures使用入門與內部原理Python
- 處理高併發 IO瓶頸解決紅包程式
- 轉載:Java處理高併發量訪問的處理總結Java
- 從零手寫實現 nginx-15-nginx.conf 解析處理轉換為 POJONginxPOJO
- 聊聊介面最大併發處理數