【转】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进程里面,先建立好需要listen的socket之后,然后再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服务运行中的程序升级、配置项修改等,使得动态可扩展性、动态定制性、动态进化性较容易实现。
【转】Nginx系列(三)--管理进程、多工作进程设计的更多相关文章
- Nginx之监控进程和工作进程
1. 函数调用分析 在开启 master 的情况下,多进程模型的下的入口函数为 ngx_master_process_cycle,如下: int mian() { ... if (ngx_proces ...
- Nginx系列三 内存池的设计
Nginx的高性能的是用非常多细节来保证,epoll下的多路io异步通知.阶段细分化的异步事件驱动,那么在内存管理这一块也是用了非常大心血.上一篇我们讲到了slab分配器,我们能够能够看到那是对共享内 ...
- Nginx学习笔记1-Nginx功能模块以及进程管理
1. 功能 1.1. 功能描述 使用缓存加速反向代理,简单负载均衡和容错: 使用缓存机制加速远程FastCGI服务器的访问: 模块化结构: 基本的HTTP功能: 邮 ...
- Nginx系列一:正向代理和反向代理、Nginx工作原理、Nginx常用命令和升级、搭建Nginx负载均衡
转自https://www.cnblogs.com/leeSmall/p/9351343.html 仅供个人学习 一.什么是正向代理.什么是反向代理 1. 正向代理,意思是一个位于客户端和原始服务器( ...
- nginx第三天
nginx架构分析 nginx模块化 nginx基于模块设计,每个模块是一个功能实现,分布式开发,团队协作 核心模块,标准http模块,可选http模块,邮件模块,第三方模块 编译后的源码目录 ob ...
- Nginx系列4之基础配置
preface 公司跑得大多数是LNMP平台,所以借此机会多多了解下Nginx.下面主要说说Nginx下面几点: 防盗链 日志切割 负载均衡 虚拟主机 location匹配解释 substatus状态 ...
- Swoole 理解manager进程和worker进程的启动顺序,以及演示如何停止或者重启服务端。
测试的代码主要功能:开启一个tcp服务器.然后设置了管理进程和工作进程start的回调进行更名.设置了pid_file保存了服务端启动的mast进程. <?php //创建Server对象,监听 ...
- Nginx系列(三)--管理进程、多工作进程设计
Nginx由一个master进程和多个worker进程组成,但master进程或者worker进程中并不会再创建线程. 一.master进程和worker进程的作用 master进程 不须要处理网络事 ...
- 【转】Nginx系列(四)--工作原理
原博文出于: http://blog.csdn.net/liutengteng130/article/details/46724081 感谢! 上篇文章介绍了Nginx框架的设计之管理进程以及 ...
随机推荐
- Zookeeper核心机制
(如果感觉有帮助,请帮忙点推荐,添加关注,谢谢!你的支持是我不断更新文章的动力.本博客会逐步推出一系列的关于大型网站架构.分布式应用.设计模式.架构模式等方面的系列文章) Zookeeper是Hado ...
- 详细讲解 关于Linux静态库和动态库的分析
基本概念 库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀. 例如:libhello.so libhello.a 为了在同一系统中使用不同版本的库,可以在库文件名后加上版本号为后缀,例如: ...
- IIS发布报错
IIS发布报错一般原因 ISAPI和CGI限制作为IIS与ASP.NET的连接桥梁
- sqlserver得到昨天的数据
SELECT * FROM test where DATEDIFF(d,witdate,getdate()) = 1 witdate表示的比较字段
- .propertie文件注释
在.properties文件中注释,前边加#就可以
- 类handler
/** The handler class is the interface for dynamically loadable storage engines. Do not add ifdefs a ...
- nginx反向代理的简单配置
有两台机器A和B. A上边是nginx,B上边是tomcat. 现在要通过A的反向代理功能,通过A的nginx访问到B的tomcat. 首先tomcat已经配置好,并且正确启动,可访问. ...
- Nginx - webbench压力测试
1. 下载,安装,进目录. 2. 执行:webbench -t 10 -c 1000 http://192.168.1.44/ (我开的nginx,默认端口80,直接处理了) 结果分析: Webben ...
- TCP协议的一些问题
1 连接握手三次 解释1:已失效的连接请求报文段 情况下如下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server.本 ...
- C++类的构造、拷贝构造、析构函数等
1: 一个空的class在C++编译器处理过后就不再为空,编译器会自动地为我们声明一些member function,如果你写 class A{}; 编译器处理后,就相当于: class A{ pub ...