精华内容
下载资源
问答
  • Nginx为什么比Apache快

    千次阅读 2017-09-22 18:19:46
    NginxApache都用到了多路复用IO模式,但是两个不同的是,Nginx用的是epoll,而Apache用的是select (注:多路复用IO一般用到的有select、poll、epoll) 一个应用程序的写操作的流程:  例如写一个字符串hello ...

    说道这个问题首先应该了解,什么是多路复用IO,-->请查看我另外一个关于IO的基础知识篇


    Nginx与Apache都用到了多路复用IO模式,但是两个不同的是,Nginx用的是epoll,而Apache用的是select

    (注:多路复用IO一般用到的有select、poll、epoll)

    一个应用程序的写操作的流程:

            例如写一个字符串hello word ,运行程序的时候,程序会先将hello word放入自己的缓冲区(buffer),然后write的时候拷贝到C库的CLIB buffer中(C库标准IOBuffer),write返回的时候hello word其实还在CLIB buffer中,这个时候如果进程给kill掉,则数据会丢失,当执行fclose的时候才会将数据刷新的磁盘中,当然还有一个函数fflush函数,不过,fflush函数只是将hello word拷贝到了page cache中,这个时候并没有进入磁盘,不过如果将应用进程core掉后数据不丢失,此时已经是系统层了,要想将数据刷新到磁盘中需要调用fsync函数


             如果想直接将hello word复制到page cache中有没有办法呢?可以用sys_write那么将直接把hello word拷贝到了page cache(注意:这里会产生一个状态。用户态与内核态的转换),不过可以用MMap来处理,通过这种映射关系,用户则可以像调用自己内存一样调用系统内存(更详细的请翻阅其他资料),当数据到达page cache的时候他不会先将hello word往下传,而是先把hello word返回到用户的内存,这是一个异步的,这个时候内核的pdflush会不断检测是否有脏页,判断是否要写回到磁盘中,然后进入内核的IO队列,接着调用驱动器将数据写入到磁盘


    select:当应用程序写文件指令发出的期间,select模式会每隔一定时间去询问、查看文件上是够写入成功,如果写入成功,通过轮循来实现,并且线性扫描所有的socket,这个期间不管,这个socket是否活动,这个期间将阻塞

    epoll:当应用程序写文件指令发出的期间,epoll会等待,直到数据返回。期间不会做多次询问与查看,而是通过fd 的 callback来实现,并且返回的不是直接的数据,而是返回的一个代表就绪符的数量,拿到这些值后epoll在去指定的数组中依次取得相应的文件描述符,这个中间使用了内存映射(mmap),所以只有活跃的soket才会触发


    个人理解,如果有不对的地方或者疑问的地方请拍砖

    展开全文
  • 比apache快十倍的开发工具! 刚看到nginx这个词,我很好奇它的读法(engine x),我的直译是“引擎x”,一般引“擎代”表了性能,而“x”大多出现是表示“xtras(额外的效果)”,那么整个词的意思就是类似“极致...
  • nginx为什么比Apache支持高并发???

    千次阅读 2017-12-21 23:24:26
    nginx为什么比Apache支持高并发???  最开始接触编程时,使用的是Apache服务器,后来随着网站用户访问量的增加,考虑高并发是必不可少的环节,越来越多的公司使用nginx服务器。我们公司最近也打算更换nginx...

    nginx为什么比Apache支持高并发???

            最开始接触编程时,使用的是Apache服务器,后来随着网站用户访问量的增加,考虑高并发是必不可少的环节,越来越多的公司使用nginx服务器。我们公司最近也打算更换nginx服务器。那么nginx和Apache有哪些异同点呢,nginx为什么比Apache支持高并发呢?

            首先,先看一下各自使用的IO模型。

            Apache使用的是select模型,该模型特点如下:

         1、每个连接对应一个描述。select模型受限于 FD_SETSIZE(即进程最大打开的描述符数),linux2.6.35为1024,实际上linux每个进程所能打开描数字的个数仅受限于内存大小,然而在设计select的系统调用时,却是参考FD_SETSIZE的值。可通过重新编译内核更改此值,但不能根治此问题,对于百万级的用户连接请求即便增加相应进程数,仍显得杯水车薪。
            2、select每次都会扫描一个文件描述符的集合,这个集合的大小是作为select第一个参数传入的值。但是每个进程所能打开文件描述符若是增加了,扫描的效率也将减小。
            3、内核到用户空间,采用内存复制方式传递信息。 

            nginx使用的是epoll模型,该模型特点如下:

    1无文件描述字大小限制仅与内存大小相关

           2epoll返回时已经明确的知道哪个socket fd发生了什么事件,不用像select那样再一个个比对。

           3内核到用户空间采用共享内存方式传递消息。

               其次,看一下各自的优势。

            Apache的优点:

            1、rewrite ,比nginx 的rewrite 强大;

            2、模块超多,基本想到的都可以找到;

            3、bug少 ,nginx的bug相对Apache较多;

            4、超稳定,最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程。

    nginx的优点:

    1、轻量级,同样起web 服务,比apache 占用更少的内存及资源;

            2、抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能;
            3、高度模块化的设计,编写模块相对简单;
            4、社区活跃,各种高性能模块发布迅速。
            最后,epoll相对select的优点总结如下:
            1、select的句柄数目受限,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE    1024  表示select最多同时监听1024个fd。而epoll没有,它的限制是最大的打开文件句柄数目。
            2、epoll的最大好处是不会随着FD的数目增长而降低效率,在selec中采用轮询处理,其中的数据结构类似一个数组的数据结构,而epoll是维护一个队列,直接看队列是不是空就可以了。epoll只会对"活跃"的socket进行操作---这是因为在内核实现中epoll是根据每个fd上面的callback函数实现的。那么,只有"活跃"的socket才会主动的去调用 callback函数(把这个句柄加入队列),其他idle状态句柄则不会,在这点上,epoll实现了一个"伪"AIO。但是如果绝大部分的I/O都是“活跃的”,每个I/O端口使用率很高的话,epoll效率不一定比select高(可能是要维护队列复杂)。
           3、使用mmap加速内核与用户空间的消息传递。无论是select,poll还是epoll都需要内核把FD消息通知给用户空间,如何避免不必要的内存拷贝就很重要,在这点上,epoll是通过内核于用户空间mmap同一块内存实现的。
           个人拙见,如有错误,欢迎指正~O(∩_∩)O
    
    
    .Nginx的工作原理:

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

     
      nginx的优势:

          采用单线程来异步非阻塞处理请求,不会为每个请求分配cpu和内存资源,节省了大量资源,同时也减少了大量的CPU的上下文切换。所以才使得Nginx支持更高的并发。
    展开全文
  • 任何一个任务都可以分解三个要素,即“谁”,“什么时间”,”干什么“。如果我们把这三个要素画在一个笛卡尔坐标系中,就显得很有意思了:我以单CPU多任务操作系统例,来看一个简单的Web服务是如何映射到上图的...

    任何一个任务都可以分解为三个要素,即“谁”“什么时间””干什么“。如果我们把这三个要素画在一个笛卡尔坐标系中,就显得很有意思了:

    这里写图片描述

    我以单CPU多任务操作系统为例,来看一个简单的Web服务是如何映射到上图的:

    这里写图片描述

    一般情况下都是按照上图处理的。每来到一个连接,便会新建一个进程或者线程单独服务那个连接,连接结束后,进程或者线程随即销毁。

      然而,鉴于进程/线程的创建会有比较可观的系统开销,所以说一般会预创建比较多的进程或者线程,然后为新建的连接分配一个即可,连接结束后进程或者线程便回到空闲资源池中了。

      显然,这种优化会大大降低进程,线程的创建,销毁的开销,我们知道这种开销主要集中于数据结构的分配与回收,内核基础设施的刷新等。再看上图,可以看得出,每一个进程就像一块板子一样插在Who,When,What构成的立方体中,这就好像热插拔刀片服务器一般,当然这里只是比喻,我想呈现的事情是,即便是刀片的插拔也是有昂贵开销的。

      除了刀片插拔的开销,还有另外一种开销,那就是切换的开销,这里就不具体展开了,一般人都知道进程,线程切换所要付出的操作系统级别的代价。

      特别是当同时在线的连接数据巨大的时候,比如10万量级,就意味着有10万量级的进程或者线程要在单一的系统中频繁切换…怎么办?


    按照能量守恒定律,只要CPU维持100%的运转,它单位时间内完成的工作量就是一定的,想最大化吞吐最好的办法就是只要让干一件事,而不是搞多个任务频繁切换。我们知道多任务分时调度只是一种假象,代价是切换开销引起的吞吐量降低,收益是高品质低时延的交互性。使用Linux的都知道,一般情况下,服务器的内核HZ都是100或者250,而桌面系统的内核HZ都是1000,这意味着对于服务器而言,吞吐相比交互的响应性更重要,理解了这个例子,就能理解我接下来要说的了。


    还记得我曾经大力推崇的nf-HiPAC,以及我自己设计的DxRPro++,iptables规则优化等故事里关于优化的根本原则吗?就是换一种切法。好吧,这次我们把Web服务器处理单条连接的整个处理流程切分成两个部分,而不再按照连接来切分,看看能不能避免创建多个进程或者线程。

      先上图再解释:

    这里写图片描述

    非常Perfect!

      整个系统就只有两个进程,一个进程处理所有的新建连接,另一个进程处理真正的HTTP逻辑,换了一种切分方法,意味着只需要两个进程就够了,就这样,切换开销完美避免。在这里,其实还可以说得更多。

      首先,连接管理进程依靠Linux内核中高效的epoll机制可以非常好的应对海量新建连接,毕竟该进程只是把新建连接pendding给后面的逻辑处理进程,所以处理是非常高效的,通过pendding可以把对CPU的时间要求转换为内存的空间要求,这正是换一种切法带来的直接收益。

      其次,如果你怀疑连接处理进程能否真正应对海量新建连接,那么你可以了解一下泊松分布的知识,新建连接分布是一个泊松分布,它并不是持续海量,你的系统只需要调优到其到达率的数学期望值稍高一点就足够了!当然,如果遇到了DDoS,那便可以另说,我有专门讨论DDoS的文章,本文不说这个。

      另外,我说一点,其实上面两个图正是体现了Apache和Nginx之间的区别。

      Nginx为什么比Apache在应对高并发是表现更好?其实就用因为其独立的异步的事件处理,当一个连接处理进入IO等待的时候进程并不阻塞,同一个进程就可以去处理别的连接,这就大大减小了系统进程的数量,从而净节省了系统开销。如果让Apache去应对泊松分布的连接到达,那就只能寄希望于内核了…当然,Apache也有优点,就是它的编程模型以及可扩展模块。

      经理喜欢Apache,极客喜欢Nginx。

      如果有时间,我会把上面关于“谁”“什么时间””干什么“的模型的玩法全部展示一遍,比如它的高度代表什么,它的宽度和厚度分别代表什么等等,另外如果是多个CPU,这个图又该怎么画…是不是在多CPU系统中,又要再加一个H呢?这样就成了“谁”“什么时间”在哪里”干什么“(Who,When,Where,What)了。

      周五上午走了7公里健步行,微信运动统计步数正常一万步左右吧,然而我通过摇手机的方式为我们团队平均成绩增加了近900步…第二天醒来手有点酸…这就是teamwork吧,唉。可能是因为上周《龙珠超》停播了一周,然后我就改看《古惑仔》了吧,前者都是单打独斗,后者就是teamwork了,也就学会了?嗯,也是,反正周五跟同事们一起喝完酒是比自己喝完酒爽很多的…

    ————–勘误与补遗————–
    王姐姐如是说:Nginx并不比Apache好,Apache适合做服务器,而Nginx只适合做代理。不过确实如此。

    展开全文
  • Nginx为什么比Apache Httpd高效:原理篇

    千次阅读 2016-12-15 10:56:56
    3.3.2 为什么epoll、kqueue、/dev/pollselect高级? 答案是,他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个 Socket来完成调度,不管哪个...

    、进程、线程?

    进程是具有一定独立功能的,在计算机中已经运行的程序的实体。在早期系统中(如linux 2.4以前),进程是基本运作单位,在支持线程的系统中(如windows,linux2.6)中,线程才是基本的运作单位,而进程只是线程的容器。程序 本身只是指令、数据及其组织形式的描述,进程才是程序(那些指令和数据)的真正运行实例。若干进程有可能与同一个程序相关系,且每个进程皆可以同步(循 序)或异步(平行)的方式独立运行。现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由时间共享(或称时分复用),以在一个处 理器上表现出同时(平行性)运行的感觉。同样的,使用多线程技术(多线程即每一个线程都代表一个进程内的一个独立执行上下文)的操作系统或计算机架构,同 样程序的平行线程,可在多 CPU 主机或网络上真正同时运行(在不同的CPU上)。

    二、常见Web服务方式

    2.1 三种工作模型比较:

    Web服务器要为用户提供服务,必须以某种方式,工作在某个套接字上。一般Web服务器在处理用户请求是,一般有如下三种方式可选择:多进程方式、多线程方式、异步方式。

    • 多进程方式:为每个请求启动一个进程来处理。由于在操作系统中,生成进程、销毁进程、进程间切换都很消耗CPU和内存,当负载高是,性能会明显降低。

    优点: 稳定性!由于采用独立进程处理独立请求,而进程之间是独立的,单个进程问题不会影响其他进程,因此稳定性最好。

    缺点: 资源占用!当请求过大时,需要大量的进程处理请求,进程生成、切换开销很大,而且进程间资源是独立的,造成内存重复利用。

    • 多线程方式:一个进程中用多个线程处理用户请求。由于线程开销明显小于进程,而且部分资源还可以共享,因此效率较高。

    优点:开销较小!线程间部分数据是共享的,且线程生成与线程间的切换所需资源开销比进程间切换小得多。

    缺点:稳定性!线程切换过快可能造成线程抖动,且线程过多会造成服务器不稳定。

    • 异步方式:使用非阻塞方式处理请求,是三种方式中开销最小的。但异步方式虽然效率高,但要求也高,因为多任务之间的调度如果出现问题,就可能出现整体故障,因此使用异步工作的,一般是一些功能相对简单,但却符合服务器任务调度、且代码中没有影响调度的错误代码存在的程序。

    优点:性能最好!一个进程或线程处理多个请求,不需要额外开销,性能最好,资源占用最低。

    缺点:稳定性!某个进程或线程出错,可能导致大量请求无法处理,甚至导致整个服务宕机。

    2.2 一个Web请求的处理过程:

    技术分享

    1. 客户发起情况到服务器网卡;
    2. 服务器网卡接受到请求后转交给内核处理;
    3. 内核根据请求对应的套接字,将请求交给工作在用户空间的Web服务器进程
    4. Web服务器进程根据用户请求,向内核进行系统调用,申请获取相应资源(如index.html)
    5. 内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘
    6. 内核调度磁盘,获取需要的资源
    7. 内核将资源存放在自己的缓冲区中,并通知Web服务器进程
    8. Web服务器进程通过系统调用取得资源,并将其复制到进程自己的缓冲区中
    9. Web服务器进程形成响应,通过系统调用再次发给内核以响应用户请求
    10. 内核将响应发送至网卡
    11. 网卡发送响应给用户

    通过这样的一个复杂过程,一次请求就完成了。

    简单来说就是:用户请求-->送达到用户空间-->系统调用-->内核空间-->内核到磁盘上读取网页资源->返回到用户空间->响应给用户。上述简单的说明了一下,客户端向Web服务请求过程,在这个过程中,有两个I/O过程,一个就是客户端请求的网络I/O,另一个就是Web服务器请求页面的磁盘I/O。 下面我们就来说说Linux的I/O模型。

    三、各种I/O模型详解

    通过上面的对连接的处理分析,我们知道工作在用户空间的web服务器进程是无法直接操作IO的,需要通过系统调用进行,其关系如下:

    技术分享

    即进程向内核进行系统调用申请IO,内核将资源从IO调度到内核的buffer中(wait阶段),内核还需将数据从内核buffer中复制(copy阶段)到web服务器进程所在的用户空间,才算完成一次IO调度。这几个阶段都是需要时间的。根据wait和copy阶段的处理等待的机制不同,可将I/O动作分为如下五种模式:

    • 阻塞I/O
    • 非阻塞I/O
    • I/O复用(select和poll)
    • 信号(事件)驱动I/O(SIGIO)
    • 异步I/O(aio)

      3.1 I/O模型简介

      这里有必要先解释一下阻塞、非阻塞,同步、异步、I/O的概念。

    3.1.1 阻塞和非阻塞:

    阻塞和非阻塞指的是执行一个操作是等操作结束再返回,还是马上返回。

    比如餐馆的服务员为用户点菜,当有用户点完菜后,服务员将菜单给后台厨师,此时有两种方式:

    • 第一种:就在出菜窗口等待,直到厨师炒完菜后将菜送到窗口,然后服务员再将菜送到用户手中;
    • 第二种:等一会再到窗口来问厨师,某个菜好了没?如果没有先处理其他事情,等会再去问一次;

    第一种就是阻塞方式,第二种则是非阻塞的。

    3.1.2 同步和异步:

    同步和异步又是另外一个概念,它是事件本身的一个属性。还拿前面点菜为例,服务员直接跟厨师打交道,菜出来没出来,服务员直接指导,但只有当厨师将 菜送到服务员手上,这个过程才算正常完成,这就是同步的事件。同样是点菜,有些餐馆有专门的传菜人员,当厨师炒好菜后,传菜员将菜送到传菜窗口,并通知服 务员,这就变成异步的了。其实异步还可以分为两种:带通知的和不带通知的。前面说的那种属于带通知的。有些传菜员干活可能主动性不是很够,不会主动通知 你,你就需要时不时的去关注一下状态。这种就是不带通知的异步。

    对于同步的事件,你只能以阻塞的方式去做。而对于异步的事件,阻塞和非阻塞都是可以的。非阻塞又有两种方式:主动查询和被动接收消息。被动不意味着 一定不好,在这里它恰恰是效率更高的,因为在主动查询里绝大部分的查询是在做无用功。对于带通知的异步事件,两者皆可。而对于不带通知的,则只能用主动查 询。

    3.1.3 全异步I/O

    回到I/O,不管是I还是O,对外设(磁盘)的访问都可以分成请求和执行两个阶段。请求就是看外设的状态信息(比如是否准备好了),执行才是真正的 I/O操作。在Linux 2.6之前,只有“请求”是异步事件,2.6之后才引入AIO(asynchronous I/O )把“执行”异步化。别看Linux/Unix是用来做服务器的,这点上比Windows落后了好多,IOCP(Windows上的AIO,效率极高)在Win2000上就有了。所以学linux的别老觉得Windows这里不好那里不好(Windows的多线程机制也由于linux)。

    3.1.4 I/O的五种模型

    根据以上分析,I/O可分为五种模型:

    技术分享

    • 阻塞I/O:所有过程全阻塞
    • 非阻塞I/O:如果没有数据buffer,则立即返回EWOULDBLOCK
    • I/O复用(select和poll):在wait和copy阶段分别阻塞
    • 信号驱动I/O(SIGIO):在wait阶段不阻塞,但copy阶段阻塞(信号驱动I/O,即通知)
    • 异步I/O(aio):完全五阻塞方式,当I/O完成是提供信号

    Linux上的前四种I/O模型的“执行”阶段都是同步的,只有最后一种才做到了真正的全异步。第一种阻塞式是最原始的方法,也是最累的办法。当然 累与不累要看针对谁。应用程序是和内核打交道的。对应用程序来说,这种方式是最累的,但对内核来说这种方式恰恰是最省事的。还拿点菜这事为例,你就是应用 程序,厨师就是内核,如果你去了一直等着,厨师就省事了(不用同时处理其他服务员的菜)。当然现在计算机的设计,包括操作系统,越来越为终端用户考虑了, 为了让用户满意,内核慢慢的承担起越来越多的工作,IO模型的演化也是如此。

    非阻塞I/O ,I/O复用,信号驱动式I/O其实都是非阻塞的,当然是针对“请求”这个阶段。非阻塞式是主动查询外设状态。I/O复用里的select,poll也是 主动查询,不同的是select和poll可以同时查询多个fd(文件句柄)的状态,另外select有fd个数的限制。epoll是基于回调函数的。信 号驱动式I/O则是基于信号消息的。这两个应该可以归到“被动接收消息”那一类中。最后就是伟大的AIO的出现,内核把什么事都干了,对上层应用实现了全 异步,性能最好,当然复杂度也最高。

    3.2 各I/O模型详细介绍【本部分摘自独孤成博客】:

    3.2.1 阻塞I/O

    说明:应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。 如果数据没有准备好,一直等待数据准备好了,从内核拷贝到用户空间,IO函数返回成功指示。这个不用多解释吧,阻塞套接字。下图是它调用过程的图示: (注,一般网络I/O都是阻塞I/O,客户端发出请求,Web服务器进程响应,在进程没有返回页面之前,这个请求会处于一直等待状态)

    技术分享

    3.2.2 非阻塞I/O

    我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断 的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间,所有一般Web服务器都 不使用这种I/O模型。具体过程如下图:

    技术分享

    3.2.3 I/O复用(select和poll)

    I/O复用模型会用到select或poll函数或epoll函数(Linux2.6以后的内核开始支持),这两个函数也会使进程阻塞,但是和阻塞 I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正 调用I/O操作函数。具体过程如下图:

    技术分享

    3.2.4 信号驱动I/O(SIGIO)

    首先,我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。具体过程如下图:

    技术分享

    3.2.5 异步I/O(aio)

    当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者的输入输出操作。具体过程如下图:

    技术分享

    3.2.6 I/O 模型总结(如下图)

    技术分享

    从上图中我们可以看出,可以看出,越往后,阻塞越少,理论上效率也是最优。其五种I/O模型中,前三种属于同步I/O,后两者属于异步I/O。

    同步I/O:

    阻塞I/O
    非阻塞I/O
    I/O复用(select和poll)

    异步I/O:

    信号驱动I/O(SIGIO) (半异步)
    异步I/O(aio) (真正的异步)

    异步 I/O 和 信号驱动I/O的区别:

    信号驱动 I/O 模式下,内核可以复制的时候通知给我们的应用程序发送SIGIO 消息。
    异步 I/O 模式下,内核在所有的操作都已经被内核操作结束之后才会通知我们的应用程序。

    3.3 Linux I/O模型的具体实现[转自孤城博客]

    3.3.1 主要实现方式有以下几种:

    • select
    • poll
    • epoll
    • kqueue
    • /dev/poll
    • iocp

    注,其中iocp是Windows实现的,select、poll、epoll是Linux实现的,kqueue是FreeBSD实现的,/dev /poll是SUN的Solaris实现的。select、poll对应第3种(I/O复用)模型,iocp对应第5种(异步I/O)模型,那么 epoll、kqueue、/dev/poll呢?其实也同select属于同一种模型,只是更高级一些,可以看作有了第4种(信号驱动I/O)模型的某 些特性,如callback机制。

    3.3.2 为什么epoll、kqueue、/dev/poll比select高级?

    答案是,他们无轮询。因为他们用callback取代了。想想看,当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个 Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成 相关操作,那就避免了轮询,这正是epoll、kqueue、/dev/poll做的。这样子说可能不好理解,那么我说一个现实中的例子,假设你在大学读 书,住的宿舍楼有很多间房间,你的朋友要来找你。select版宿管大妈就会带着你的朋友挨个房间去找,直到找到你为止。而epoll版宿管大妈会先记下 每位同学的房间号,你的朋友来时,只需告诉你的朋友你住在哪个房间即可,不用亲自带着你的朋友满大楼找人。如果来了10000个人,都要找自己住这栋楼的 同学时,select版和epoll版宿管大妈,谁的效率更高,不言自明。同理,在高并发服务器中,轮询I/O是最耗时间的操作之一,select、 epoll、/dev/poll的性能谁的性能更高,同样十分明了。

    3.3.3 Windows or *nix (IOCP or kqueue、epoll、/dev/poll)?

    诚然,Windows的IOCP非常出色,目前很少有支持asynchronous I/O的系统,但是由于其系统本身的局限性,大型服务器还是在UNIX下。而且正如上面所述,kqueue、epoll、/dev/poll 与 IOCP相比,就是多了一层从内核copy数据到应用层的阻塞,从而不能算作asynchronous I/O类。但是,这层小小的阻塞无足轻重,kqueue、epoll、/dev/poll 已经做得很优秀了。

    3.3.4 总结一些重点

    只有IOCP(windows实现)是asynchronous I/O,其他机制或多或少都会有一点阻塞。

    select(Linux实现)低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善

    epoll(Linux实现)、kqueue(FreeBSD实现)、/dev/poll(Solaris实现)是Reacor模式,IOCP是Proactor模式。

    Apache 2.2.9之前只支持select模型,2.2.9之后支持epoll模型

    Nginx 支持epoll模型

    Java nio包是select模型

    四、Apache Httpd的工作模式

    4.1 apache三种工作模式

    我们都知道Apache有三种工作模块,分别为prefork、worker、event。

    • prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
    • worker:多线程,一个进程可以生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求。
    • event:基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的。

    4.2 prefork的工作原理

    如果不用“--with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是 Apache1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子 进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。

    4.3 worker的工作原理

    相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而 系统资源的开销要小于基于进程的服务器。但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性,这种MPM的工作方 式将是Apache2.0的发展趋势。

    4.4 event 基于事件机制的特性

    一个进程响应多个用户请求,利用callback机制,让套接字复用,请求过来后进程并不处理请求,而是直接交由其他机制来处理,通过epoll机 制来通知请求是否完成;在这个过程中,进程本身一直处于空闲状态,可以一直接收用户请求。可以实现一个进程程响应多个用户请求。支持持海量并发连接数,消 耗更少的资源。

    五、如何提高Web服务器的并发连接处理能力

    有几个基本条件:

    • 基于线程,即一个进程生成多个线程,每个线程响应用户的每个请求。
    • 基于事件的模型,一个进程处理多个请求,并且通过epoll机制来通知用户请求完成。
    • 基于磁盘的AIO(异步I/O)
    • 支持mmap内存映射,mmap传统的web服务器,进行页面输入时,都是将磁盘的页面先输入到内核缓存中,再由内核缓存中复制一份到web服务 器上,mmap机制就是让内核缓存与磁盘进行映射,web服务器,直接复制页面内容即可。不需要先把磁盘的上的页面先输入到内核缓存去。

    刚好,Nginx 支持以上所有特性。所以Nginx官网上说,Nginx支持50000并发,是有依据的。

    六、Nginx优异之处

    6.1 简介

    传统上基于进程或线程模型架构的web服务通过每进程或每线程处理并发连接请求,这势必会在网络和I/O操作时产生阻塞,其另一个必然结果则是对内 存或CPU的利用率低下。生成一个新的进程/线程需要事先备好其运行时环境,这包括为其分配堆内存和栈内存,以及为其创建新的执行上下文等。这些操作都需 要占用CPU,而且过多的进程/线程还会带来线程抖动或频繁的上下文切换,系统性能也会由此进一步下降。另一种高性能web服务器/web服务器反向代 理:Nginx(Engine X),nginx的主要着眼点就是其高性能以及对物理计算资源的高密度利用,因此其采用了不同的架构模型。受启发于多种操作系统设计中基于“事件”的高级 处理机制,nginx采用了模块化、事件驱动、异步、单线程及非阻塞的架构,并大量采用了多路复用及事件通知机制。在nginx中,连接请求由为数不多的 几个仅包含一个线程的进程worker以高效的回环(run-loop)机制进行处理,而每个worker可以并行处理数千个的并发连接及请求。

    6.2 Nginx 工作原理

    Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、 cache loader和cache manager均应以非特权用户身份运行。

    主进程主要完成如下工作:

    • 读取并验正配置信息;
    • 创建、绑定及关闭套接字;
    • 启动、终止及维护worker进程的个数;
    • 无须中止服务而重新配置工作特性;
    • 控制非中断式程序升级,启用新的二进制程序并在需要时回滚至老版本;
    • 重新打开日志文件;
    • 编译嵌入式perl脚本;
    • worker进程主要完成的任务包括:
    • 接收、传入并处理来自客户端的连接;
    • 提供反向代理及过滤功能;
    • nginx任何能完成的其它任务;

    注:如果负载以CPU密集型应用为主,如SSL或压缩应用,则worker数应与CPU数相同;如果负载以IO密集型为主,如响应大量内容给客户端,则worker数应该为CPU个数的1.5或2倍。

    6.3 Nginx 架构

    Nginx的代码是由一个核心和一系列的模块组成, 核心主要用于提供Web Server的基本功能,以及Web和Mail反向代理的功能;还用于启用网络协议,创建必要的运行时环境以及确保不同的模块之间平滑地进行交互。不过, 大多跟协议相关的功能和某应用特有的功能都是由nginx的模块实现的。这些功能模块大致可以分为事件模块、阶段性处理器、输出过滤器、变量处理器、协 议、upstream和负载均衡几个类别,这些共同组成了nginx的http功能。事件模块主要用于提供OS独立的(不同操作系统的事件机制有所不同) 事件通知机制如kqueue或epoll等。协议模块则负责实现nginx通过http、tls/ssl、smtp、pop3以及imap与对应的客户端 建立会话。在Nginx内部,进程间的通信是通过模块的pipeline或chain实现的;换句话说,每一个功能或操作都由一个模块来实现。例如,压 缩、通过FastCGI或uwsgi协议与upstream服务器通信,以及与memcached建立会话等。

    6.4 Nginx 基础功能

    • 处理静态文件,索引文件以及自动索引;
    • 反向代理加速(无缓存),简单的负载均衡和容错;
    • FastCGI,简单的负载均衡和容错;
    • 模块化的结构。过滤器包括gzipping, byte ranges, chunked responses, 以及 SSI-filter 。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
    • SSL 和 TLS SNI 支持;

    6.5 Nginx IMAP/POP3 代理服务功能

    • 使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
    • 使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
    • 认证方法:
    • POP3: POP3 USER/PASS, APOP, AUTH LOGIN PLAIN CRAM-MD5;
    • IMAP: IMAP LOGIN;
    • SMTP: AUTH LOGIN PLAIN CRAM-MD5;
    • SSL 支持;
    • 在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持;

    6.6 Nginx 支持的操作系统

    • FreeBSD 3.x, 4.x, 5.x, 6.x i386; FreeBSD 5.x, 6.x amd64;
    • Linux 2.2, 2.4, 2.6 i386; Linux 2.6 amd64;
    • Solaris 8 i386; Solaris 9 i386 and sun4u; Solaris 10 i386;
    • MacOS X (10.4) PPC;
    • Windows 编译版本支持 windows 系列操作系统;

    6.7 Nginx 结构与扩展

    • 一个主进程和多个工作进程,工作进程运行于非特权用户;
    • kqueue (FreeBSD 4.1+), epoll (Linux 2.6+), rt signals (Linux 2.2.19+), /dev/poll (Solaris 7 11/99+), select, 以及 poll 支持;
    • kqueue支持的不同功能包括 EV_CLEAR, EV_DISABLE (临时禁止事件), NOTE_LOWAT, EV_EOF, 有效数据的数目,错误代码;
    • sendfile (FreeBSD 3.1+), sendfile (Linux 2.2+), sendfile64 (Linux 2.4.21+), 和 sendfilev (Solaris 8 7/01+) 支持;
    • 输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
    • 10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M 内存。
    • 最小化的数据拷贝操作;

    6.8 Nginx 其他HTTP功能

    • 基于IP 和名称的虚拟主机服务;
    • Memcached 的 GET 接口;
    • 支持 keep-alive 和管道连接;
    • 灵活简单的配置;
    • 重新配置和在线升级而无须中断客户的工作进程;
    • 可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
    • 4xx-5xx 错误代码重定向;
    • 基于 PCRE 的 rewrite 重写模块;
    • 基于客户端 IP 地址和 HTTP 基本认证的访问控制;
    • PUT, DELETE, 和 MKCOL 方法;
    • 支持 FLV (Flash 视频);
    • 带宽限制;

    6.9 为什么选择Nginx

      • 在高连接并发的情况下,Nginx是Apache服务器不错的替代品: Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一. 能够支持高达 50,000 个并发连接数的响应, 感谢Nginx为我们选择了 epoll and kqueue 作为开发模型。
      • Nginx作为负载均衡服务器: Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务, 也可以支持作为 HTTP代理 服务器对外进行服务. Nginx采用C进行编写, 不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
      • 作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器), Last.fm 描述了成功并且美妙的使用经验.
      • Nginx 是一个 [#installation 安装] 非常的简单 , 配置文件 非常简洁(还能够支持perl语法),Bugs 非常少的服务器: Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够 不间断服务的情况下进行软件版本的升级 
    展开全文
  • 主要介绍了为什么Nginx的性能要比Apache高很多,需要的朋友可以参考下
  • nginx比apache快的原因

    千次阅读 2017-10-11 22:24:01
    1:在高并发的情况下nginx比apache快,低并发体现不明显 2:的原因得益于nginx的epoll模型 apache是多线程或者多进程,在工作的时候,当来了一个http响应,一个进程接收(listen)–>识别处理—>返回请求,在此...
  • Nginx、Tomcat、Apache的对比

    千次阅读 2019-01-04 22:58:14
    Apache比Nginx早,早期的互联网环境访问量不大,所以Apache由于稳定、开源、跨平台等特点,发展成了第一大服务器 后来随着并发增加,俄罗斯人开发了Nginx,由于其开源、高性能等特点,Nginx迅速被广泛传播 Nginx...
  • nginxnginxapache详细性能对比

    千次阅读 2017-10-22 15:27:19
    nginx动态文件处理能力差?   这是我最困惑的地方,在google了nginx之后发现它的评价并没有想象中那么差劲,并且很多公司已经开始用nginx+php(fast-cgi)作为主流web服务器,于是我决定亲自试一试。   测试...
  • nginxapache两者的作用相同,都是常见webserver服务器,相互独立也可相符搭配,都是用于浏览器用户...nginx是后起之秀,2000年以后才有的,在web2.0年代性能远远超过apache,是时下比较流行的web server。 至于tomca
  • 端口转发:nginx做后端,Apache做前端

    千次阅读 2017-05-19 11:09:12
    nginxApache做端口转发,nginx做后端,Apache做前端
  • Nginx反向代理到apache

    千次阅读 2011-09-01 11:46:48
    单台服务器,目前只有一个ip,那就采用不同的端口号,apache监听80端口,基本上不需要改变什么,只需要把视频文件拷贝到nginx下面的文件下,然后开启反向代理功能,反向代理就是:此模块能代理请求到其它服务器
  • nginx+apache

    2012-07-19 22:05:25
    client+nginx+apache基于域名分发配置
  • Nginx vs Apache

    千次阅读 2014-11-03 15:33:45
    原文地址:...Nginx vs Apache What is the Nginx web and proxy server and how does it compare to Apache? Should you use one of these servers or both? Here we explore
  • Nginx做前端,Apache做后端的配置实例

    千次阅读 2014-05-15 22:36:06
    Nginx做前端,Apache做后端的配置实例,供大家学习参考。Nginx做前端处理静态文件,Apache做后端服务器。 Nginx做前端,Apache做后端的配置实例,供大家学习参考。 Nginx做前端处理静态文件,...
  • Nginx+Squid+Apache

    千次阅读 2010-05-21 11:13:00
    环境:OS: RHEL 5.4Nginx IP: 192.168.128.134Squid_1 IP: 192.168.128.135Squid_2 IP: 192.168.128.137Squid_2 IP: 192.168.128.139Apache IP: 192.168.128.136网站域名:pic.123.com软件版本:Nginx 0.8.15Squid 3.0....
  • 实验结构是 相同环境下 100线程 每个一百个查询 nginx + uwsgi 用了58901毫秒 apache + wsgi用了33307毫秒 怎么回事? 请牛人解答
  • 为什么我们使用Nginx而不是Apache

    千次阅读 2013-03-21 07:35:04
    鉴于扩张性和性能方面的原因,我们通常会建议他们改用Nginx和FPM。 Apache是非常强大的Web服务器,模块化结构,也是Web服务端的鼻祖。除了捆绑一些其他的工具外,Apache已经成为了世上最广泛部署的开源系统,直到...
  • Nginx比Apache高并发的原因

    千次阅读 2017-05-03 22:59:05
    nginx默认以多进程的方式工作,一个master进程和多个worker进程,master进程主要用来管理worker进程.多个worker进程同等竞争来自客户端的请求,一个worker进程可以处理多个请求,但不能处理其它worker进程的请求.每个...
  • Nginx+Apache负载均衡

    2017-08-25 16:53:54
    Nginx+Apache负载均衡
  • Nginx 反向代理Apache

    2015-10-20 22:29:00
    情景在centos服务器下,有www.a.com:8080,www.b.com:8080两个域名分别指向由Apache所建立的站点a和站点b...环境os:centos6.5 php 5.6 apache(httpd)2.2 nginx1.8步骤(安装好环境前提)1 apache虚拟主机配置打开apac
  • Nginx 与 Tomcat,Apache的区别

    千次阅读 2020-01-16 15:18:03
    一、定义: ApacheApache HTTP服务器是一个模块化的服务器,可以运行在几乎所有广泛使用的计算机平台上。...(Apche可以支持PHPcgiperl,但是要使用Java的话,你需要Tomcat在Apache后台支撑,将Java请求由Apa...
  • 简单谈谈apachenginx

    2021-01-11 04:14:03
     不断有人跟我说Nginx比Apache好、比Apache快之类。Nginx更主要是作为反向代理,而非Web服务器使用。我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对NginxApache的工作原理都略有了解,粗谈一下...
  • NginxApache反向代理配置生成器 ...该脚本的最终目标是将其挂接到ISPConfig(与Apache一起使用),因此即使将Apache配置主要的Web服务器,ISPConfig仍可以创建/重新创建Nginx配置文件。 如果有时间的
  • NginxApache区别

    万次阅读 2018-06-01 07:03:16
    Nginx VS Apache相同点:1、都是HTTP服务器软件2、功能上都采用模块化结构设计3、都支持...占用很多内存资源2、功能上,Apache所有模块支持动静态编译,Nginx模块都是静态编译的3、对Fcgi的支持:Apache支持的很...
  • nginxapache

    千次阅读 2014-09-02 10:59:01
    apache所占用的内存资源较多,而且处理较慢 apache的所有模块都...nginx则恰恰相反,nginx占用的内存较少,处理较 nginx的模块都是静态编译 nginx对Fcgi支持非常好 nginx支持epoll nginx的安装包大小仅几百K
  • ApacheNginx 说是当今最流行的两个 Web 服务器一点也不过,Apache 用户基数大,稳定,兼容性高(比如jsp/php/cgi/python等等),但与 Ngnix 相比,Apache过于臃肿以及对静态文件响应过于缓慢让很多使用者感到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,893
精华内容 63,557
关键字:

nginx为什么比apache快