解释下惊群现象

处理请求过程如下:

master(master进程会先建立好需要listen的socket)——–fork生成子进程workers,继承socket(此时workers子进程们都继承了父进程master的所有属性,当然也包括已经

建立好的socket,当然不是同一个socket,只是每个进程的这个socket会监控在同一个ip地址与端口,这个在网络协议里面是允许的)——当一个连接进入,产生惊群现象。

一般来说,当一个连接进来后,所有在accept在这个socket上面的进程,都会收到通知,而只有一个进程可以accept这个连接,其它的则accept失败。

惊群现象:指一个fd的事件被触发后,等候这个fd的所有线程/进程都被唤醒。虽然都被唤醒,但是只有一个会去响应。最常见的例子就是对于socket的accept操作,当多个

用户进程/线程监听在同一个端口上时,由于实际只可能accept一次,因此就会产生惊群现象,

Nginx对惊群现象的处理:

 nginx提供了一个accept_mutex这个东西,这是一个加在accept上的一把共享锁。有了这把锁之后,同一时刻,就只会有一个进程在accpet连接,这样就不会有惊群问题了。accept_mutex是一个可控选项,我们可以显示地关掉,默认是打开的。

小结:

1)一个完整的请求读取请求、解析请求、处理请求,产生数据后,再返回给客户端,最后断开连接。

2)一个完整的请求完全由一个worker进程处理。

好处:

 1)节省锁带来的开销。每个worker进程都是独立的进程,不共享资源,不需要加锁。同时在编程以及问题查上时,也会方便很多。

 2)独立进程,减少风险。采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快重新启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。

发表评论

后才能评论