溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Nginx服務(wù)器的高性能原理IO復(fù)用介紹

發(fā)布時(shí)間:2021-08-31 09:36:45 來源:億速云 閱讀:174 作者:chen 欄目:服務(wù)器

這篇文章主要講解了“Nginx服務(wù)器的高性能原理IO復(fù)用介紹”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Nginx服務(wù)器的高性能原理IO復(fù)用介紹”吧!

導(dǎo)入

Nginx的處理IO的方式是異步非阻塞。Nginx之所以高性能除了異步非阻塞之外,還有一個(gè)核心的原因:IO復(fù)用。

什么是IO復(fù)用?

從最簡單的例子說起,一個(gè)請(qǐng)求連接來了之后,一般情況下是怎么處理請(qǐng)求的呢? 如圖1所示

Nginx服務(wù)器的高性能原理IO復(fù)用介紹

瀏覽器的每次請(qǐng)求都會(huì)分配或者新啟一個(gè)進(jìn)程與之對(duì)應(yīng),去處理請(qǐng)求。進(jìn)程上下文之間的切換和新啟進(jìn)程都會(huì)很浪費(fèi)資源,怎么優(yōu)化呢?(舉手)把多進(jìn)城變成多線程。  那么就有了如下圖2的優(yōu)化結(jié)果。

Nginx服務(wù)器的高性能原理IO復(fù)用介紹

這么做有啥不好呢?在思考一下,線程是進(jìn)程調(diào)度的最小單位,一個(gè)進(jìn)程有多個(gè)線程在同時(shí)處理請(qǐng)求,那么如果這個(gè)進(jìn)程因?yàn)楫惓G闆r意外終止了,那么它所擁有的所有的線程都將全部終止運(yùn)行,換句話說,服務(wù)掛了。哈哈,好刺激。

那么IO復(fù)用派上用場(chǎng)了~~前面我們提到了異步非阻塞,那么我們這樣來設(shè)計(jì),我們?cè)O(shè)計(jì)一個(gè)進(jìn)程池、事件響應(yīng)守護(hù)進(jìn)程、請(qǐng)求服務(wù)進(jìn)程。那么,我們的服務(wù)器的進(jìn)程架構(gòu)如下圖所示:

Nginx服務(wù)器的高性能原理IO復(fù)用介紹

如上圖,我們將服務(wù)器分成了三個(gè)模塊:

  1. 進(jìn)程池

  2. 事件響應(yīng)

  3. 事件注冊(cè)

當(dāng)瀏覽器請(qǐng)求到達(dá)服務(wù)器之后,首先連接到(3)請(qǐng)求服務(wù)進(jìn)程,并注冊(cè)一個(gè)事件,當(dāng)請(qǐng)求發(fā)送數(shù)據(jù)的時(shí)候,這個(gè)時(shí)候會(huì)產(chǎn)生一個(gè)讀事件,這個(gè)時(shí)候會(huì)有(2)事件響應(yīng)進(jìn)程會(huì)響應(yīng),將事件交給(1)進(jìn)程池處理,同時(shí)再注冊(cè)一個(gè)寫事件。當(dāng)進(jìn)程池將請(qǐng)求處理完成之后,會(huì)響應(yīng)寫事件將處理的結(jié)果返回給瀏覽器。

那么IO復(fù)用所復(fù)用的是什么呢?

IO復(fù)用就是用一個(gè)進(jìn)程來響應(yīng)真實(shí)的請(qǐng)求事件。本質(zhì)上復(fù)用的是進(jìn)程。

Select與Epoll

當(dāng)有讀寫事件發(fā)生了,事件守護(hù)進(jìn)程響應(yīng)交給進(jìn)程池處理,同時(shí)再注冊(cè)一個(gè)寫事件,但是進(jìn)程池怎么知道是哪個(gè)socket有事件發(fā)生了呢?所以每次有事件發(fā)生的時(shí)候,事件響應(yīng)進(jìn)程就會(huì)遍歷一下所有的socket連接句柄,判斷一下是否有事件發(fā)生,這種響應(yīng)事件的方式就被稱為Select模型。

怎么去優(yōu)化呢?如果每次有事件發(fā)生,如果能知道是確切的哪個(gè)socket連接的事件,效率就很高了,這樣方式就是Epoll模型。 舉個(gè)例子

  • 假如餐館有人要結(jié)賬,服務(wù)員就跟老板說一聲:“有人要結(jié)賬”,老板不知道是哪一桌要結(jié)賬,就需要挨個(gè)問一遍,這樣的方式就是select,時(shí)間復(fù)雜度O(n)。

  • 假如餐館有人要結(jié)賬,服務(wù)員就跟老板說一聲:“5號(hào)桌要結(jié)賬”,這樣的方式就是epoll,時(shí)間復(fù)雜度O(1)。

從大的方面了解一個(gè)高性能的服務(wù)器演化的過程,總結(jié)一下:池的概念會(huì)很大的提高性能,本次說到的是進(jìn)程池,改成線程池(其實(shí)是多進(jìn)程多線程模式)也是一樣。

感謝各位的閱讀,以上就是“Nginx服務(wù)器的高性能原理IO復(fù)用介紹”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Nginx服務(wù)器的高性能原理IO復(fù)用介紹這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI