Nginx支持比Apache高并发的缘由

1.先从各自使用的多路复用IO模型提及:
  
select模型:(apache使用,因为受模块等限制,用的很少)
  
linux

  1. 单个进程可以 监视的文件描述符的数量存在最大限制
  2. select()所维护的 存储大量文件描述符的数据结构 ,随着文件描述符数量的增加,其在用户态和内核的地址空间的复制所引起的开销也会线性增加
  3. 因为网络响应时间的延迟使得大量TCP链接处于非活跃状态,但调用select()仍是会对 全部的socket进行一次线性扫描 ,会形成必定的开销

poll:nginx

poll是unix沿用select本身从新实现了一遍,惟一解决的问题是poll 没有最大文件描述符数量的限制web

epoll模型:(nginx使用)apache

epoll带来了两个优点,大幅度提高了性能:编程

  1. 基于事件的就绪通知方式 ,select/poll方式,进程只有在调用必定的方法后,内核才会对全部监视的文件描述符进行扫描,而epoll事件经过epoll_ctl()注册一个文件描述符,一旦某个文件描述符就绪时,内核会采用相似call back的回调机制,迅速激活这个文件描述符,epoll_wait()便会获得通知
  2. 调用一次epoll_wait()得到就绪文件描述符时,返回的并非实际的描述符,而是一个表明就绪描述符数量的值,拿到这些值去epoll指定的一个数组中依次取得相应数量的文件描述符便可,这里使用内存映射(mmap)技术, 避免了复制大量文件描述符带来的开销

固然epoll也有必定的局限性, epoll只有Linux2.6才有实现 ,而其余平台都没有,这和apache这种优秀的跨平台服务器,显然是有些背道而驰了。

简单来讲epoll是select的升级版,单进程管理的文件描述符没有最大限制。但epoll只有linux平台可以使用。做为跨平台的Apache没有使用。

2.再看一下Apache经常使用的两种并发策略:

      1) perfork模式的工做原理:  
                    当Apache被启动时,Apache会自动建立StartServers个进程,而且尽力将空闲进程数保持在MinSpareServers和MaxSpareServers之间。
                    若是空闲进程小于MinSpareServers,Apache将会以大约每秒1个的速度新建进程。
                    若是空闲进程小于MaxSpareServers,Apache将会删除多余的空闲进程,释放服务器资源。
                    进程数的最大值由MaxClients控制,在Apache1.3中最大只能设置为256,但在Apache2.0中,能够经过在配置开头增长ServerLimit项目来突破256的限制,此时必须MaxClients  ≤ ServerLimit ≤ 20000
                    MaxRequestsPerChild用来控制每一个进程在处理了多少次请求以后自动销毁,这个参数能够设置为0表示无限(即不销毁进程)

     2) worker模式的工做原理:
            由主控制进程生成“StartServers”个子进程,每一个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求。
            一样,为了避免在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置容许的最大线程总数。
            若是现有子进程中的线程总数不能知足负载,控制进程将派生新的子进程。
           每一个子线程处理服务请求次数由MaxRequestPerChild定义。 缺省的设置值为0,即响应无限此请求。
           默认生成3个子进程来处理请求。

  两种策略的缺陷:
        perfork模式:每个链接建立一个进程,每一个进程内单线程。对于一个负载相对较高的网站来讲,256的进程限制是不够的,若是服务器已经达到256的极限,那么接下去的访问就须要排队,这也就是为何某些服务器负载不高,可是访问却很慢的缘由之一。数组

        worker模式:也是多进程处理,也会建立多个进程和多个线程,若是进程数达到管理员设置的阀值,则会拒绝新的请求。
       两种模式都会建立多个进程或线程,而每一个进程或线程都会为其分配cpu和内存(线程要比进程小的多,因此worker支持比perfork高的并发),并发过大会榨干服务器资源。
服务器


3.Nginx的工做原理:

      Nginx并不会为每个的web请求建立新的进程,相反,管理员能够配置Nginx主进程的工做进程的数量(一个常见的作法是为每个CPU配置一个工做进程)。全部这些进程都是单线程的。
      每个工做进程能够处理数千个并发的请求。它经过一个线程来异步非阻塞的完成了这些工做(epoll),而没有使用多线程的编程模型。

 
  nginx的优点:

      采用单线程来异步非阻塞处理请求,不会为每一个请求分配cpu和内存资源,节省了大量资源,同时也减小了大量的CPU的上下文切换。因此才使得Nginx支持更高的并发。网络

相关文章
相关标签/搜索