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
- Java 併發集合的實現原理Java
- 併發程式設計 — CAS 原理詳解程式設計
- Java HashMap 的實現原理詳解JavaHashMap
- java併發之SynchronousQueue實現原理Java
- MySQL 併發處理MySql
- Postgres併發處理
- Nginx的工作原理和配置詳解Nginx
- 併發容器的原理,七大併發容器詳解、及使用場景
- 高併發的處理方法
- PostgreSQL的MVCC併發處理SQLMVC
- Java併發之CAS與原子類實現原理講解Java
- IOS SDWebImage實現原理詳解iOSWeb
- 併發Lock之ReentrantLock實現原理ReentrantLock
- 《java併發程式設計的藝術》併發底層實現原理Java程式設計
- 併發——深入分析ThreadLocal的實現原理thread
- nginx proxy cache的實現原理Nginx
- 高併發實戰之冪等處理
- 處理併發衝突
- 海量資料的併發處理
- 3種方式實現python多執行緒併發處理Python執行緒
- 併發處理中的問題以及解決這些問題的併發模型模型
- 詳解Spring Retry實現原理Spring
- Android影象處理 - 高斯模糊的原理及實現Android
- 詳解Redisson分散式限流的實現原理Redis分散式
- 最強幹貨:Java併發之AQS原理詳解JavaAQS
- 批處理中的for詳解
- Mysql加鎖過程詳解(5)-innodb 多版本併發控制原理詳解MySql
- 併發問題處理方式
- SQLite 併發的四種處理方式SQLite
- Go併發呼叫的超時處理Go
- 再談資料的併發處理
- Entity Framework Core中的併發處理Framework
- 處理高併發 IO瓶頸解決紅包程式
- python併發4:使用thread處理併發Pythonthread
- Redis Sentinel實現的機制與原理詳解Redis
- 【死磕Java併發】-----深入分析synchronized的實現原理Javasynchronized