niginx高性能緣由

1epoll多路複用java

2.master worker進程模型:能夠容許作平滑的配置重啓,而且不會斷開與客戶端的連接linux

3.協程機制    :非阻塞進程的機制nginx

 

最開始開發人員使用的是bio阻塞shi進程模型,socket.write全部的字節流都input完後纔對應的client、纔會返回多線程

 

因而有了linux的select模型,變動輪訓查找,只要有變化,就會被喚醒,缺點:每次輪訓都遍歷,效率很低。並且理論上限只能監聽1024個請求socket

 

epoll模型:在監聽的時候有回掉函數,那個變化就直接回掉函數執行,並且上限很高java的NIO模型就是借用了linux的模型,NIO也有一個select模型,那NIO爲何不使用epoll多路呢?linux內核2.6以上會把select以epoll的模式去運行,如果2.6之前的版本就不會。tcp

上圖,master是能夠管理worker的進程空間的,worker用來處理客戶端連接的,當啓動master進程的時候,就會在master上啓動一個socket的文件舉鼎,而後這個文件又會監聽在80端口上,這時候就會啓動epoll的多路複用模型,當client發起請求就會有一個tcpip的過程,創建三次握手,會向80端口發起socket conect的操做,這時候epoll模型就會產生回掉,函數

可是這時候的master是不處理connect的請求的,他會讓對應的woker去處理,nginx在裏面搞了一個互斥鎖,由於master和woker都會共享內存,三個worker都會去搶佔,由於是在內存上的,速度很快,誰先搶佔到就是誰去調用完成三次握手。一旦某一個worker搶佔到了,之後這條道路就是都是worker來處理了。worker會講這個請求扔到epoll裏,lua

  那master的做用:只用來處理管理者的命令,以及某個worker死掉的話,他會接管權限,而且new出一個新的worker,線程

三次握手:首先服務端80端口監聽,而後client發起connect操做到80端口,而後80端口upset來完成三次握手的創建連接協程

2.sbin/nginx -s reload 重啓以後,worker的端口號會變,master的不會變,由於master不能掛,掛了整個nginx就廢了。

執行這條命令後,master會將全部的socket進行收回,而後從新生成worker去分配。

3.每一個worker裏只有一個線程,都是單線程的,爲何不使用多線程呢?

  首先,多線程就是爲了防止單線程堵塞,形成效率問題。可是worker裏的單線程是非阻塞的,只不過是調用socket的read和write,並且是在epoll中,速度是很是快的,不會形成堵塞,單線程反而更快,僅僅只是一分內核空間到用戶的拷貝。

4. 協程是比內存更小的概念,依附於線程的內存模型,切換開銷小,它遇到阻塞就會歸還執行權,重點是無需加鎖,它是串行的執行過程,lua就是基於協程的

5

相關文章
相關標籤/搜索