niginx高性能原因
1epoll多路復用
2.master worker進程模型:可以允許做平滑的配置重啟,并且不會斷開與客戶端的鏈接
3.協程機制 :非阻塞進程的機制
?
最開始開發人員使用的是bio阻塞shi進程模型,socket.write所有的字節流都input完后才對應的client、才會返回
?
于是有了linux的select模型,變更輪訓查找,只要有變化,就會被喚醒,缺點:每次輪訓都遍歷,效率很低。而且理論上限只能監聽1024個請求
?
epoll模型:在監聽的時候有回掉函數,那個變化就直接回掉函數執行,而且上限很高java的NIO模型就是借用了linux的模型,NIO也有一個select模型,那NIO為什么不使用epoll多路呢?linux內核2.6以上會把select以epoll的模式去運行,若是2.6以前的版本就不會。
上圖,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里,
? 那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
?
轉載于:https://www.cnblogs.com/gaoqiaoliangjie/p/11053934.html
總結
以上是生活随笔為你收集整理的niginx高性能原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 身份证是在四川的护照在江苏办的护照办了十
- 下一篇: 垂直居中(总结)