Nginx如此之快
nignx的併發連線數,一般最佳化後,峰值能保持在 1~3w 左右。 |
1.多程式:一個 Master 程式、多個 Worker 程式
2.Master 程式:管理 Worker 程式
3.對外介面:接收外部的操作(訊號)
4.對內轉發:根據外部的操作的不同,透過訊號管理 Worker
5.監控:監控 worker 程式的執行狀態,worker 程式異常終止後,自動重啟 worker 程式
6.Worker 程式:所有 Worker 程式都是平等的
7.實際處理:網路請求,由 Worker 程式處理;
8.Worker 程式數量:在 nginx.conf 中配置,一般設定為核心數,充分利用 CPU 資源,同時,避免程式數量過多,避免程式競爭 CPU 資源,增加上下文切換的損耗。
1.請求是連線到 Nginx,Master 程式負責處理和轉發?
2.如何選定哪個 Worker 程式處理請求?請求的處理結果,是否還要經過 Master 程式?
1.Nginx 啟動時,Master 程式,載入配置檔案
2.Master 程式,初始化監聽的 socket
3.Master 程式,fork 出多個 Worker 程式
4.Worker 程式,競爭新的連線,獲勝方透過三次握手,建立 Socket 連線,並處理請求
1.Nginx 採用:多程式 + 非同步非阻塞方式(IO 多路複用 epoll)
2.請求的完整過程:
3.建立連線
4.讀取請求:解析請求
5.處理請求
6.響應請求
7.請求的完整過程,對應到底層,就是:讀寫 socket 事件
request:Nginx 中 http 請求。
基本的 HTTP Web Server 工作模式:
1.接收請求:逐行讀取請求行和請求頭,判斷段有請求體後,讀取請求體
2.處理請求
3.返回響應:根據處理結果,生成相應的 HTTP 請求(響應行、響應頭、響應體)
Nginx 也是這個套路,整體流程一致。
1.event module: 搭建了獨立於作業系統的事件處理機制的框架,及提供了各具體事件的處理。包括ngx_events_module, ngx_event_core_module和ngx_epoll_module等。nginx具體使用何種事件處理模組,這依賴於具體的作業系統和編譯選項。
2.phase handler: 此型別的模組也被直接稱為handler模組。主要負責處理客戶端請求併產生待響應內容,比如ngx_http_static_module模組,負責客戶端的靜態頁面請求處理並將對應的磁碟檔案準備為響應內容輸出。
3.output filter: 也稱為filter模組,主要是負責對輸出的內容進行處理,可以對輸出進行修改。例如,可以實現對輸出的所有html頁面增加預定義的footbar一類的工作,或者對輸出的圖片的URL進行替換之類的工作。
4.upstream: upstream模組實現反向代理的功能,將真正的請求轉發到後端伺服器上,並從後端伺服器上讀取響應,發回客戶端。upstream模組是一種特殊的handler,只不過響應內容不是真正由自己產生的,而是從後端伺服器上讀取的。
5.load-balancer: 負載均衡模組,實現特定的演算法,在眾多的後端伺服器中,選擇一個伺服器出來作為某個請求的轉發伺服器。
Nginx vs. Apache
網路 IO 模型:
1.nginx:IO 多路複用,epoll(freebsd 上是 kqueue )
2.高效能
3.高併發
4.佔用系統資源少
5.apache:阻塞 + 多程式/多執行緒
6.更穩定,bug 少
7.模組更豐富
處理多個請求時,可以採用:IO 多路複用 或者 阻塞 IO +多執行緒
IO 多路服用:一個 執行緒,跟蹤多個 socket 狀態,哪個就緒,就讀寫哪個;
阻塞 IO + 多執行緒:每一個請求,新建一個服務執行緒
IO 多路複用:單個連線的請求處理速度沒有優勢,適合 IO 密集型 場景,事件驅動
大併發量:只使用一個執行緒,處理大量的併發請求,降低上下文環境切換損耗,也不需要考慮併發問題,相對可以處理更多的請求;
消耗更少的系統資源(不需要執行緒排程開銷)
適用於長連線的情況(多執行緒模式長連線容易造成執行緒過多,造成頻繁排程)
阻塞IO + 多執行緒:實現簡單,可以不依賴系統呼叫,適合 CPU 密集型 場景
每個執行緒,都需要時間和空間;
執行緒數量增長時,執行緒排程開銷指數增長
1.Nginx 是多程式模型,Worker 程式用於處理請求;
2.單個程式的連線數(檔案描述符 fd),有上限(nofile):ulimit -n
3.Nginx 上配置單個 worker 程式的最大連線數:worker_connections 上限為 nofile
4.Nginx 上配置 worker 程式的數量:worker_processes
1.Nginx 的最大連線數:Worker 程式數量 x 單個 Worker 程式的最大連線數
2.上面是 Nginx 作為通用伺服器時,最大的連線數
3.Nginx 作為反向代理伺服器時,能夠服務的最大連線數:(Worker 程式數量 x 單個 Worker 程式的最大連線數)/ 2。
4.Nginx 反向代理時,會建立 Client 的連線和後端 Web Server 的連線,佔用 2 個連線
每開啟一個 socket 佔用一個 fd
為什麼,一個程式能夠開啟的 fd 數量有限制?
處理多個請求時,可以採用:IO 多路複用 或者 阻塞 IO +多執行緒
IO 多路複用:一個 執行緒,跟蹤多個 socket 狀態,哪個就緒,就讀寫哪個;
阻塞 IO + 多執行緒:每一個請求,新建一個服務執行緒
IO 多路複用 和 多執行緒 的適用場景?
IO 多路複用:單個連線的請求處理速度沒有優勢
大併發量:只使用一個執行緒,處理大量的併發請求,降低上下文環境切換損耗,也不需要考慮併發問題,相對可以處理更多的請求;
消耗更少的系統資源(不需要執行緒排程開銷)
適用於長連線的情況(多執行緒模式長連線容易造成執行緒過多,造成頻繁排程)
阻塞IO + 多執行緒:實現簡單,可以不依賴系統呼叫。
每個執行緒,都需要時間和空間;
執行緒數量增長時,執行緒排程開銷指數增長
詳細內容,參考:
select/poll 系統呼叫:
// select 系統呼叫 int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); // poll 系統呼叫 int poll(struct pollfd fds[], nfds_t nfds, int timeout);
查詢 fd_set 中,是否有就緒的 fd,可以設定一個超時時間,當有 fd (File descripter) 就緒或超時返回;
fd_set 是一個位集合,大小是在編譯核心時的常量,預設大小為 1024
特點:
連線數限制,fd_set 可表示的 fd 數量太小了;
線性掃描:判斷 fd 是否就緒,需要遍歷一邊 fd_set;
資料複製:使用者空間和核心空間,複製連線就緒狀態資訊
解決了連線數限制:
poll 中將 select 中的 fd_set 替換成了一個 pollfd 陣列
解決 fd 數量過小的問題
資料複製:使用者空間和核心空間,複製連線就緒狀態資訊
epoll:event 事件驅動
事件機制:避免線性掃描
為每個 fd,註冊一個監聽事件
fd 變更為就緒時,將 fd 新增到就緒連結串列
fd 數量:無限制(OS 級別的限制,單個程式能開啟多少個 fd)
1.I/O多路複用的機制;
2.I/O多路複用就透過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。
3.監視多個檔案描述符
4.但select,poll,epoll本質上都是同步I/O:
5.使用者程式負責讀寫(從核心空間複製到使用者空間),讀寫過程中,使用者程式是阻塞的;
6.非同步 IO,無需使用者程式負責讀寫,非同步IO,會負責從核心空間複製到使用者空間;
關於 Nginx 的併發處理能力
併發連線數,一般最佳化後,峰值能保持在 1~3w 左右。(記憶體和 CPU 核心數不同,會有進一步最佳化空間)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524109/viewspace-2675687/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 為什麼 Python 增長如此之快?Python
- Nginx 代理快取Nginx快取
- 單執行緒架構的Redis如此之快的 4 個原因執行緒架構Redis
- nginx快取使用詳解,nginx快取使用及配置步驟Nginx快取
- Nginx快取設定教程Nginx快取
- nginx反向代理快取教程。Nginx快取
- Nginx瀏覽器快取Nginx瀏覽器快取
- nginx快取與優化Nginx快取優化
- Nginx快取原理及機制Nginx快取
- 深入Nginx + PHP 快取詳解NginxPHP快取
- Nginx快取伺服器配置Nginx快取伺服器
- Nginx配置瀏覽器快取Nginx瀏覽器快取
- Nginx 為什麼這麼快?Nginx
- nginx靜態檔案快取Nginx快取
- nginx快取優先順序Nginx快取
- Nginx 的五種快取方法Nginx快取
- 009.Nginx快取及配置Nginx快取
- Nginx 快取使用指南-簡單Nginx快取
- nginx 只快取靜態檔案Nginx快取
- [解讀] 同是NAND Flash快閃記憶體(SSD)技術,MLC和SLC差距為何如此之大?NaN記憶體
- Nginx 面試 40 連問,快頂不住了~~Nginx面試
- 使用Nginx+Memcache做頁面快取Nginx快取
- nginx DNS 解析快取的更新問題NginxDNS快取
- 為什麼網路攻擊如此之多?
- 為什麼專案估算偏差如此之大?
- Linux下玩轉nginx系列(六)---nginx實現cache(快取)服務LinuxNginx快取
- 使用 NGINX 和 NGINX Plus 實現智慧高效的位元組範圍快取Nginx快取
- Nginx之11吸星大法 - (頁面快取)Nginx快取
- nginx快取配置及開啟gzip壓縮Nginx快取
- Nginx 是如何讓你的快取延期的Nginx快取
- Nginx 快取引發的跨域慘案Nginx快取跨域
- 單執行緒Redis效能為何如此之高?執行緒Redis
- 提高軟體質量為何如此之難
- 軟體開發人員薪水差距如此之大
- Nginx 內容快取及常見引數配置Nginx快取
- 利用nginx設定瀏覽器協商快取Nginx瀏覽器快取
- Nginx下快取靜態檔案(如css js)Nginx快取CSSJS
- nginx的web快取服務環境部署記錄NginxWeb快取