首頁 >運維 >Nginx >nginx為什麼這麼快

nginx為什麼這麼快

步履不停
步履不停原創
2019-06-20 17:52:123894瀏覽

nginx為什麼這麼快

主要原因是Nginx使用了最新的epoll(Linux 2.6核心)和kqueue(freebsd)網路I/O模型。

epoll是多路復用IO(I/O Multiplexing)中的一種方式,但是僅用於linux2.6以上內核,在開始討論這個問題之前,先來解釋一下為什麼需要多路復用IO.

以一個生活中的例子來解釋.

假設你在大學中讀書,要等待一個朋友來訪,而這個朋友只知道你在A號樓,但是不知道你具體住在哪裡,於是你們約好了在A號樓門口見面.

如果你使用的阻塞IO模型來處理這個問題,那麼你就只能一直守候在A號樓門口等待朋友的到來,在這段時間裡你不能做別的事情,不難知道,這種方式的效率是低下的.

現在時代變化了,開始使用多路復用IO模型來處理這個問題.你告訴你的朋友來了A號樓找樓管大媽,讓她告訴你該怎麼走.這裡的樓管大媽扮演的就是多路復用IO的角色.

進一步解釋select和epoll模型的差異.

select版大媽做的是如下的事情:比如同學甲的朋友來了,select版大媽比較笨,她帶著朋友挨個房間進行查詢誰是同學甲,你等的朋友來了,於是在實際的代碼中,select版大媽做的是以下的事情:


int## n = select(&readset,NULL,NULL,100);

#for (int i #= ##0#; n > 0#; i) {

if
(FD_ISSET(fdarray[i], &readset)){do_something( fdarray[i]);
--n;
}
}


#epoll版大媽就比較先進了,她記下了同學甲的訊息,比如說他的房間號碼,那麼等同學甲的朋友到來時,只需要告訴該朋友同學甲在哪個房間即可,不用自己親自帶著人滿大樓的找人了.於是epoll版大媽做的事情可以用以下的程式碼表示:



Code highlighting produced by Actipro CodeHighlighter (freeware)
n
=epoll_wait(epfd,events,20,500);

for
(i=0;i<n; i){do_something(events[n]) ;
}


#


在epoll中,關鍵的資料結構epoll_event定義如下:

typedef union epoll_data {
void * ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

# struct epoll_event {
__uint32_t events;
/* Epoll events ##*/epoll_data_t data ;
/* User data variable */};
可以看到, epoll_data是一個union結構體,它就是epoll版大媽用於保存同學信息的結構體,它可以保存很多類型的信息:fd,指針,等等.有了這個結構體,epoll大媽可以不用吹灰之力就可以定位到同學甲.


別小看了這些效率的提高,在一個大規模並發的伺服器中,輪詢IO是最耗時間的操作之一.再回到那個例子中,如果每到來一個朋友樓管大媽都要全樓的查詢同學,那麼處理的效率必然就低下了,過不久樓底就有不少的人了.

對比最早給出的阻塞IO的處理模型, 可以看到採用了多路復用IO之後, 程序可以自由的進行自己除了IO操作之外的工作, 只有到IO狀態發生變化的時候由多路復用IO進行通知, 然後再採取相應的操作, 而不用一直阻塞等待IO狀態發生變化了.

從上面的分析也可以看出,epoll比select的提高實際上是一個用空間換時間思想的具體應用。

更多Nginx相關技術文章,請造訪Nginx教學欄位學習!

以上是nginx為什麼這麼快的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多