zoukankan      html  css  js  c++  java
  • nginx

    并发数=进程数?

    进程数与并发数不存在很直接的关系(比如通过异步非阻塞io就可以实现单线程处理多请求)。这取决取server采用的工作方式。

    进程数越多,server效率越高?

    如果一个server采用一个进程负责一个request的方式,那么进程数就是并发数。那么显而易见的,就是会有很多进程在等待中。等什么?最多的应该是等待网络传输(比如等待客户端请求数据的到来,等待应用服务器的响应)。

    而nginx的异步非阻塞工作方式正是利用了这点等待时间。在需要等待的时候,这些进程就空闲出来待命(可以在本该等待的时候去做其他事,这是由异步非阻塞决定的,非阻塞决定了不会等待io的完成,异步决定了io任务完成后会有相应的通知,如果只是非阻塞的话,要想得知io是否完成,就需要不断主动询问),因此表现为少数几个进程就解决了大量的并发问题。

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

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

    由于webserver(apache、tomcat都属于应用服务器)的工作性质决定了每个request的大部份生命都是在网络io中(webserver属于网络io密集型应用,不算是计算密集型),实际上花费在server机器上的时间片不多。这是几个进程就解决高并发的秘密所在。

    综上,异步、非阻塞、使用epoll,和大量细节处的优化,决定了nginx的高并发性

    参考:https://www.zhihu.com/question/22062795

  • 相关阅读:
    多线程与高并发常见面试题(1)
    LoadRunner 多用户并发 登录,上传数据,登出的脚本教程
    windows cmd 链接远程mysql服务器
    Ubuntu 16.04添加阿里云源
    sqlite 数据库与mysql 数据库使用区别记录
    jdk源码之 hashmap 与hashtable 的区别
    通过构造器启动线程的实现方式及其缺点记录。
    eclipse 中过滤空包,目录树中不显示。
    javascript中正则实现读取当前url中指定参数值方法。
    Reactjs+Webpack+es2015 入门HelloWord(一)
  • 原文地址:https://www.cnblogs.com/holoyong/p/7572070.html
Copyright © 2011-2022 走看看