Nginx為什麼支援那麼高的併發量?

2022-02-16 10:14:52 字數 3060 閱讀 7138

我之前對常見的 io模型做了詳細總結,原理搞懂了,今天面試,面試官問了我乙個問題:

nginx為什麼有那麼高的併發量?我竟然語塞了!!!

哎!人吶,最怕的就是學東西只學一半兒,兄弟們可長點心吧!!!
nginx 以其高效能,穩定性,豐富的功能,簡單的配置和低資源消耗而聞名。本文從底層原理分析 nginx 為什麼這麼快!

worker 程序:所有 worker 程序都是平等的。

請求是連線到 nginx,master 程序負責處理和**?

如何選定哪個 worker 程序處理請求?請求的處理結果,是否還要經過 master 程序?

nginx 啟動時,master 程序,載入配置檔案。

master 程序,初始化監聽的 socket。

master 程序,fork 出多個 worker 程序。

worker 程序,競爭新的連線,獲勝方通過三次握手,建立 socket 連線,並處理請求。

nginx 採用多程序+非同步非阻塞方式(io 多路復用 epoll)。

nginx 的事件處理模型

基本的 http web server 工作模式:

nginx 也是這個套路,整體流程一致:

模組化體系結構

nginx 的模組根據其功能基本上可以分為以下幾種型別:

② phase handler:此型別的模組也被直接稱為 handler 模組。主要負責處理客戶端請求並產生待響應內容,比如 ngx_http_static_module 模組,負責客戶端的靜態頁面請求處理並將對應的磁碟檔案準備為響應內容輸出。

③ output filter:也稱為 filter 模組,主要是負責對輸出的內容進行處理,可以對輸出進行修改。

④ upstream:upstream 模組實現反向**的功能,將真正的請求**到後端伺服器上,並從後端伺服器上讀取響應,發回客戶端。

⑤ load-balancer:負載均衡模組,實現特定的演算法,在眾多的後端伺服器中,選擇乙個伺服器出來作為某個請求的**伺服器。

nginx 是多程序模型,worker 程序用於處理請求。

單個程序的連線數(檔案描述符 fd),有上限(nofile):ulimit -n。

nginx 上配置單個 worker 程序的最大連線數:worker_connections 上限為 nofile。

nginx 上配置 worker 程序的數量:worker_processes。

因此,nginx 的最大連線數:

每開啟乙個 socket 占用乙個 fd?

為什麼,乙個程序能夠開啟的 fd 數量有限制?

請求行:method、uri、http version

請求頭請求體

響應行:http version、status code

響應頭響應體

io模型詳細請參見

處理多個請求時,可以採用:io 多路復用或者阻塞 io+多執行緒:

單個連線的請求處理速度沒有優勢

消耗更少的系統資源(不需要執行緒排程開銷)。

適用於長連線的情況(多執行緒模式長連線容易造成執行緒過多,造成頻繁排程)。

實現簡單,可以不依賴系統呼叫

每個執行緒,都需要時間和空間。

執行緒數量增長時,執行緒排程開銷指數增長。

int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);

查詢 fd_set 中,是否有就緒的 fd,可以設定乙個超時時間,當有 fd (file descripter) 就緒或超時返回。

fd_set 是乙個位集合,大小是在編譯核心時的常量,預設大小為 1024。

特點:int poll(struct pollfd fds, nfds_t nfds, int timeout);

解決了連線數限制:poll 中將 select 中的 fd_set 替換成了乙個 pollfd 陣列,解決 fd 數量過小的問題。

資料複製:使用者空間和核心空間,複製連線就緒狀態資訊。

事件機制:避免線性掃瞄,為每個 fd,註冊乙個監聽事件,fd 變更為就緒時,將 fd 新增到就緒鍊錶。

fd 數量:無限制(os 級別的限制,單個程序能開啟多少個 fd)。

i/o 多路復用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作;監視多個檔案描述符。

但 select,poll,epoll 本質上都是同步 i/o:使用者程序負責讀寫(從核心空間拷貝到使用者空間),讀寫過程中,使用者程序是阻塞的;

非同步 io:無需使用者程序負責讀寫,非同步 io,會負責從核心空間拷貝到使用者空間。

關於 nginx 的併發處理能力:併發連線數,一般優化後,峰值能保持在 1~3w 左右。(記憶體和 cpu 核心數不同,會有進一步優化空間)。

nginx為什麼比Apache支援高併發???

最開始接觸程式設計時,使用的是apache伺服器,後來隨著 使用者訪問量的增加,考慮高併發是必不可少的環節,越來越多的公司使用nginx伺服器。我們公司最近也打算更換nginx伺服器。那麼nginx和apache有哪些異同點呢,nginx為什麼比apache支援高併發呢?首先,先看一下各自使用的io...

為什麼感覺學了那麼多,然並卵

在開始寫這篇文章之前,閱讀了前輩 itwriter 寫的的一篇好文章 為什麼你參加了那麼多培訓,卻依然表現平平?筆者建議你值得一讀。回到正文,思考乙個很有趣的問題,當你看到水中的魚兒的時候 你有沒有想過魚兒在水中為什麼淹不死暱?魚兒之所以在汪洋的水流中不會淹死,是因為魚在水中是靠鰓呼吸的,魚可以在水...

外星人電腦為什麼那麼貴 為什麼百麗的鞋那麼貴

鞋子品牌有很多,知名的不知名的成百上千,對於一些知名的品牌大家都知道,很高 今天我們來說說為什麼百麗的鞋那麼貴?一分價錢一分貨,但百麗專櫃和 的 卻相差甚大。belle百麗屬於中高階女鞋品牌,定位是職業人士 白領人士。在百貨公司裡面,2008年它的售價在200 500元這樣,發展到今天,已經變為40...