美文网首页nginx解析
master->worker 分而治之

master->worker 分而治之

作者: 布兰特 | 来源:发表于2021-03-26 19:11 被阅读0次

分而治之不算一种模式,而是一种思想。它可以将一个大任务拆解为若干个小任务并行执行,提高系统吞吐量。主要讲两个场景,Master-Worker模式,该模式核心思想是系统由两类进行协助工作:Master进程,Worker进程。
Master负责接收与分配任务,Worker负责处理任务。当各个Worker处理完成后,将结果返回给Master进行归纳与总结
如下图


Snipaste_2021-03-26_19-00-42.png

那么nginx 的master->worker模式怎么实现的呢?

nginx在启动后,在unix系统中会以daemon的方式在后台运行,后台进程包含一个master进程和多个worker进程。所以,nginx是以多进程的方式来工作的,当然nginx也是支持多线程的方式的,只是我们主流的方式还是多进程的方式,也是nginx的默认方式。

注:我们也可以手动地关掉后台模式,让nginx在前台运行,并且通过配置让nginx取消master进程,从而可以使nginx以单进程方式运行。很显然,生产环境下我们肯定不会这么做,所以关闭后台模式,一般是用来调试用的

master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。

worker进程则处理基本的网络事件。多个worker进程之间是对等的,他们同等竞争来自客户端的请求,各进程互相之间是独立的。一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。worker进程的个数是可以设置的,一般我们会设置与机器cpu核数一致。

如下图:


1827547-20200114211054517-867325732.png

worker进程处理请求
我们前面有提到,worker进程之间是平等的,每个进程,处理请求的机会也是一样的。当我们提供80端口的http服务时,一个连接请求过来,每个进程都有可能处理这个连接,怎么做到的呢?首先,每个worker进程都是从master进程fork过来,在master进程里面,先建立好需要listen的socket(listenfd)之后,然后再fork出多个worker进程。所有worker进程的listenfd会在新连接到来时变得可读,为保证只有一个进程处理该连接,所有worker进程在注册listenfd读事件前抢accept_mutex,抢到互斥锁的那个进程注册listenfd读事件,在读事件里调用accept接受该连接。当一个worker进程在accept这个连接之后,就开始读取请求,解析请求,处理请求,产生数据后,再返回给客户端,最后才断开连接,这样一个完整的请求就是这样的了。我们可以看到,一个请求,完全由worker进程来处理,而且只在一个worker进程中处理。

nginx采用这种进程模型有什么好处
当然,好处肯定会很多了。首先,对于每个worker进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断,master进程则很快启动新的worker进程。当然,worker进程的异常退出,肯定是程序有bug了,异常退出,会导致当前worker上的所有请求失败,不过不会影响到所有请求,所以降低了风险。当然,好处还有很多,大家可以慢慢体会。

相关文章

  • master->worker 分而治之

    分而治之不算一种模式,而是一种思想。它可以将一个大任务拆解为若干个小任务并行执行,提高系统吞吐量。主要讲两个场景,...

  • Hadoop2 无法访问8088端口web页面

    I setup a hadoop cluster with two nodes hadoop01(master- ...

  • 分而治之

    凡治众如治寡,分数是也。 解决规模庞大的问题的有效方法之一,就是将其分解为若干规模更小的子问题,再通过递归机制分别...

  • 分而治之

    如果你不能解决全部问题,那么就应该选择你能解决的那部分。 看起来再简单不过的道理,我们却常常重蹈覆辙,总忍不住去纠...

  • 算法之快速排序、分而治之

    分而治之 快速排序——一种常用的优雅的排序算法。快速排序使用分而治之的策略。 分而治之 (divide and c...

  • celery 源码笔记(三) worker

    worker启动worker的启动是由celery.bin.worker.worker类中调用WorkContro...

  • Nginx核心worker_processes、worker_c

    一、worker_processes、worker_connections设置多少合适? worker_proce...

  • 分而治之算法

    一.原理: 1. 分治算法的基本思想就是:将一个规模为N的问题分解为K个规模较小的子问题(K <= N),这些子问...

  • 递归 分而治之

    简化问题 https://leetcode-cn.com/problems/binary-tree-inorder...

  • 分而治之思想

    当一个问题的规模很大时,直接求解往往比较困难。对于这类问题,很大一部分是可以采取分而治之的思想来处理的。 分治法是...

网友评论

    本文标题:master->worker 分而治之

    本文链接:https://www.haomeiwen.com/subject/eylshltx.html