• 【转】Nginx系列(三)--管理进程、多工作进程设计


    原博文出于:http://blog.csdn.net/liutengteng130/article/details/46700999  感谢!

      Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程。

    一、master进程和worker进程的作用

     

    master进程

            不需要处理网络事件,不负责业务的执行,只会通过管理worker等子进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

             master是通过fork系统调用子进程来实现和子进程的通信。

    worker进程

           用来处理master进程fork过来的请求

            worker进程是通过处理信号来实现和master通信的

    ====================================================================================

     

     

    二、信号的处理过程

    Master进程接收到信号是怎样进行处理的?

              master进程接收到信号后,会先重新加载配置文件,然后再启动新的进程,并向所有老的进程发送信号,告诉他们可以光荣退休了。新的进程在启动后,就开始接受新的请求,而老的进程在收到来自master信号后,就不再接收新的请求,并且在当前进程中的所有未处理完的请求处理完成后再退出。

     

    Worker进程接收到信号是怎样进行处理的?

            首先,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来的,在master进程里面,先建立好需要listensocket之后,然后再fork出多个worker进程,这样每个worker进程都可以去接受这个socket。一般来说,当一个连接进来后,所有在accept这个socket上面的进程都会收到通知,而只有一个进程可以接受这个连接,其他的则accept失败,这就是所谓的惊群现象。

            那么为了解决这个问题,Nginx提供了一个accept_mutex(可选项,默认打开)。这是一个加在accept上的一把共享所。有了这把锁之后,同一时刻,就会只有一个进程在accept连接,这样就不会有惊群问题了。

            当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接。一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

    ====================================================================================

     

     

     

    三、这样设计的优点

    1、利用多核系统的并发处理能力

             现在操作系统都是多核CPU,如果一直是只有一个进程在工作,那么浪费资源,如果是worker进程间地位不平等势必造成进程瓶颈问题,Nginx为了避免这个问题,设计worker间进程平等。另外,worker数与cpu核数一致,则会达到CPU资源的充分利用,如果worker数多于cpu核数,势必造成资源的竞争;若小于cpu核数,势必造成资源浪费。提高网络性能,降低请求时延。

    2、负载均衡

           多个worker之间通过进程通信来实现负载均衡。即当一个请求到来时,更容易分配到负载较轻的worker进程中处理。这将降低请求的时延,并在一定程度上提高网络性能

    3、管理进程负责监控工作进程的状态,并负责管理其行为

            这样做的好处是:

             a.管理进程不会占用多少系统资源

             b.管理进程负责监控工作进程状态,如果某个工作进程死掉,管理进程负责创建出新的工作进程,避免系统性能下降。提高了系统的可靠性。

             c.管理进程支持Nginx服务运行中的程序升级、配置项修改等,使得动态可扩展性、动态定制性、动态进化性较容易实现。

  • 相关阅读:
    跨域是什么
    【剑指offer】05-替换空格
    【剑指offer】04-二维数组中的查找
    【剑指offer】03-变态跳台阶
    【剑指offer】02-青蛙跳台阶
    【剑指offer】01-斐波那契数列
    python面向对象-类和实例
    LibreOffice字体问题解决;从window复制到Ubuntu
    Far manager界面混乱问题解决
    Ubuntu-18.04.2-几个启动错误解决办法
  • 原文地址:https://www.cnblogs.com/zlslch/p/6033537.html
Copyright © 2020-2023  润新知