Nginx实现高速并发处理的原理详解

大憨熊 提交于 2020-12-21 16:11:14

  众所周知,Nginx是当下最流行的Web服务器,它具有很强的负载均衡,反向代理,邮件代理以及静态缓存的功能。在提供这些功能的同时,Nginx的性能也极其优秀,可以轻松支持百万、千万级的并发连接,能够为Tomcat、Django等性能不佳的Web应用抗住绝大部分外部流量。那么,Nginx是如何实现高速并发处理呢?这就要从它优秀的架构设计来说起。

  框架结构

  如下图所示,Nginx结合采用多进程和IO多路复用的结构处理并发客户请求。

  Master进程主要负责信号处理,监控和管理Worker进程。 Master进程本身不处理具体业务。Worker进程处理具体业务,包括处理连接请求和网络读写事件的处理。多个worker进程可以独立地处理各自的客户连接。Worker进程之间通过信号量和共享内存进行通信。
  

  通过配置与系统CPU等量的worker进程,可以实现某一个进程绑定某一个特定CPU从而减少系统开销。在每一个worker进程处理多个client并发连接请求时,Nginx 采用IO多路复用技术在一个进程内同时处理多个client的网络读写事件。与多进程/线程处理多连接请求模型相比,IO多路复用可以减少大量的进程调度带来的系统开销,从而提高系统整体的处理性能。

  并发处理方式
  

  网络服务器在处理并发处理方式,如上图socket处理流程所示,根据accept得到新连接以后是启用新的进程/线程还是直接在原来本进程内处理,分为如下两种方式。

  一种是多进程/线程方式,这种方式为每一个新来的连接生成一个新的进程/线程来单独处理。另外一种是IO多路复用,这种方式在一个进程/线程中维护所有的连接的socket,通过事件处理的方式依次处理所有连接上的网络事件。

  多线程模型如下:
  

  在多进程/线程的模型中,根据accept在新老进程中的位置又分为两种。一种类型是accept在父进程中进行,每次accept以后,fork一个新进程或者创建一个新线程来处理新accept的连接。一种类型是父进程在listen调用以后,fork出多个进程或者创建多个线程分别进行accept.

  IO多路复用模型如下:
 

  IO多路复用又称为event driven IO。就是在同一个进程内同时处理多路IO,进而提高系统吞吐量。一般是通过维护一个连接池,当某个连接有数据到达,通知进程来进行数据处理。Nginx支持多种并发连接请求,比如select,poll,epoll,kqueue(针对bsd)等等,这些请求可以通过配置文件进行选择。一般在linux上epoll的效率要比select,poll高很多。

  综上所述,Nginx通过本身优秀的框架设计,加上内核对并行网络处理的支持,得到了非常好的并发处理性能。
  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!