Nginx
首先要明白,Nginx采用的是多进程(单线程)&多路IO复用模型。使用了I/O多路复用技术的Nginx,就成了”并发事件驱动“的服务器。
多进程的工作模式
1、Nginx在启动后,master进程fork()多个相互独立的worker进程。
2、接收来自外界的信号,然向各worker进程发送信号,每个进程都有可能来处理这个连接。
3、 master进程能监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动再fork()新worker进程。
注意worker进程数,一般会设置成机器cpu核数。因为更多的worker只会导致进程之间相互竞争cpu,从而带来不必要的上下文切换。
使用多进程模式,不仅能提高并发率,而且进程之间是相互独立的,一 个worker进程挂了不会影响到其他worker进程。
惊群现象
master进程首先通过socket()来创建一个监听描述符,然后fork()若干个worker,子进程将继承父进程的监听描述符,之后子进程在该监听描述符上accept()创建已连接描述符(connected descriptor),然后通过已连接描述符来与客户端通信。
那么,由于所有子进程都继承了父进程的 sockfd,那么当连接进来时,所有子进程都将收到通知并“争着”与它建立连接,这就叫“惊群现象”。大量的进程被激活又挂起,只有一个进程可以accept() 到这个连接,这当然会消耗系统资源。