服务器处理程序一般会采用fork模式, 每来一个新的连接时,会创建一个新的进程,新的进程中会重新创建一个socket,后续新连接的消息就由fork出来的这个进程处理.
NGINX架构修改了这种模式, 新连接过来时,还是由work进程来处理.
对于fork模式, 新建的进程如果采用阻塞模式,应该是性能更高,因为在没有报文时,该进程不会被调度.
而同一个进程处理多个连接,就必须抛弃阻塞模式,因为阻塞模式会阻塞进程处理其他的连接,同时如果select的话, 可能也不是最佳选择,首先select支持fd的数目有限,如果需要支持更多的fd,还需要修改linux系统头文件,还有select当支持fd过多时,性能很低, 所以效率较高的处理方式就是epoll.
linux创建进程的开销很大,并且也占用相当多的资源, 当linux进程变多时, linux进程调度开销也很大.
nginx采用一个进程处理多个连接就减少了上述开销,较少了连接的处理时间和资源消耗.
nginx考虑非常细致, 在多核上,为了减少因为work进程切换到不同核上带来的cache miss开销, nginx为work增加了核绑定处理.
nginx的事件驱动对性能提升也很大.