zoukankan      html  css  js  c++  java
  • nginx处理高并发请求强于apache

    ginx 不同于 Apache2 的一点就是,Nginx 采用单线程,非阻塞,异步 IO 的工作模型。

    Apache2 对于每一个请求,都会创建一个新进程或线程,会浪费很多内存和 CPU 时间,而 Nginx 使用操作系统提供的IO多路复用技术(epoll), 在一个线程中处理所有的请求。当一个 IO 操作开始的时候,Nginx 不会等待操作完成就会去处理下一个请求,等到某个 IO 操作完成后,Nginx 再回过头去处理这次 IO 的后续工作。

    下面解释,很详细,http://www.zhihu.com/question/22062795

    进程数与并发数不存在很直接的关系。这取决取server采用的工作方式。

    如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输。其缺点题主应该也感觉到了,此处不述。

    而nginx 的异步非阻塞工作方式正是利用了这点等待的时间。在需要等待的时候,这些进程就空闲出来待命了。因此表现为少数几个进程就解决了大量的并发问题。

    nginx是如何利用的呢,简单来说:同样的4个进程,如果采用一个进程负责一个request的方式,那么,同时进来4个request之后,每个进程就负责其中一个,直至会话关闭。期间,如果有第5个request进来了。就无法及时反应了,因为4个进程都没干完活呢,因此,一般有个调度进程,每当新进来了一个request,就新开个进程来处理。

    nginx不这样,每进来一个request,会有一个worker进程去处理。但不是全程的处理,处理到什么程度呢?处理到可能发生阻塞的地方,比如向上游(后端)服务器转发request,并等待请求返回。那么,这个处理的worker不会这么傻等着,他会在发送完请求后,注册一个事件:“如果upstream返回了,告诉我一声,我再接着干”。于是他就休息去了。此时,如果再有request 进来,他就可以很快再按这种方式处理。而一旦上游服务器返回了,就会触发这个事件,worker才会来接手,这个request才会接着往下走。

    由于web server的工作性质决定了每个request的大部份生命都是在网络传输中,实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。即@skoo所说的

    webserver刚好属于网络io密集型应用,不算是计算密集型。

    而@叔度所说的

    异步,非阻塞,使用epoll,和大量细节处的优化。

    也正是nginx之所以然的技术基石。


    作者:金由
    链接:http://www.zhihu.com/question/22062795/answer/20197329
    来源:知乎
  • 相关阅读:
    XGBoost原理解析
    变分贝叶斯学习(variational bayesian learning)及重参数技巧(reparameterization trick)
    Tensorflow Probability Distributions 简介
    树形dp--hdu 1520 anniversary party
    线段树II--区间修改
    leetcode---different ways to add parentheses
    线段树
    实现最大堆
    编写支持对齐分配的malloc和free函数
    指针和引用的区别,指针和数组的区别
  • 原文地址:https://www.cnblogs.com/usa007lhy/p/5352437.html
Copyright © 2011-2022 走看看