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