niginx高性能原因
1epoll多路復(fù)用
2.master worker進(jìn)程模型:可以允許做平滑的配置重啟,并且不會斷開與客戶端的鏈接
3.協(xié)程機(jī)制 :非阻塞進(jìn)程的機(jī)制
?
最開始開發(fā)人員使用的是bio阻塞shi進(jìn)程模型,socket.write所有的字節(jié)流都input完后才對應(yīng)的client、才會返回
?
于是有了linux的select模型,變更輪訓(xùn)查找,只要有變化,就會被喚醒,缺點(diǎn):每次輪訓(xùn)都遍歷,效率很低。而且理論上限只能監(jiān)聽1024個請求
?
epoll模型:在監(jiān)聽的時候有回掉函數(shù),那個變化就直接回掉函數(shù)執(zhí)行,而且上限很高java的NIO模型就是借用了linux的模型,NIO也有一個select模型,那NIO為什么不使用epoll多路呢?linux內(nèi)核2.6以上會把select以epoll的模式去運(yùn)行,若是2.6以前的版本就不會。
上圖,master是可以管理worker的進(jìn)程空間的,worker用來處理客戶端鏈接的,當(dāng)啟動master進(jìn)程的時候,就會在master上啟動一個socket的文件舉鼎,然后這個文件又會監(jiān)聽在80端口上,這時候就會啟動epoll的多路復(fù)用模型,當(dāng)client發(fā)起請求就會有一個tcpip的過程,建立三次握手,會向80端口發(fā)起socket conect的操作,這時候epoll模型就會產(chǎn)生回掉,
但是這時候的master是不處理connect的請求的,他會讓對應(yīng)的woker去處理,nginx在里面搞了一個互斥鎖,因為master和woker都會共享內(nèi)存,三個worker都會去搶占,因為是在內(nèi)存上的,速度很快,誰先搶占到就是誰去調(diào)用完成三次握手。一旦某一個worker搶占到了,以后這條道路就是都是worker來處理了。worker會講這個請求扔到epoll里,
? 那master的作用:只用來處理管理者的命令,以及某個worker死掉的話,他會接管權(quán)限,并且new出一個新的worker,
三次握手:首先服務(wù)端80端口監(jiān)聽,然后client發(fā)起connect操作到80端口,然后80端口upset來完成三次握手的建立鏈接
2.sbin/nginx -s reload 重啟之后,worker的端口號會變,master的不會變,因為master不能掛,掛了整個nginx就廢了。
執(zhí)行這條命令后,master會將所有的socket進(jìn)行收回,然后重新生成worker去分配。
3.每個worker里只有一個線程,都是單線程的,為什么不使用多線程呢?
首先,多線程就是為了防止單線程堵塞,造成效率問題。但是worker里的單線程是非阻塞的,只不過是調(diào)用socket的read和write,而且是在epoll中,速度是非常快的,不會造成堵塞,單線程反而更快,僅僅只是一份內(nèi)核空間到用戶的拷貝。
4. 協(xié)程是比內(nèi)存更小的概念,依附于線程的內(nèi)存模型,切換開銷小,它遇到阻塞就會歸還執(zhí)行權(quán),重點(diǎn)是無需加鎖,它是串行的執(zhí)行過程,lua就是基于協(xié)程的
5
?
轉(zhuǎn)載于:https://www.cnblogs.com/gaoqiaoliangjie/p/11053934.html
總結(jié)
以上是生活随笔為你收集整理的niginx高性能原因的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 身份证是在四川的护照在江苏办的护照办了十
- 下一篇: 垂直居中(总结)