Nginx源码阅读笔记-Master Woker进程模型

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:Nginx采用的模型是master-worker模型,即:将里面核心的流程和函数抽取出来,如下图所示:

master进程

Nginx采用的模型是master-worker模型,即:

  • 由master进程负责创建worker进程,以及监控worker进程的情况,如需要更新配置的情况下发消息给worker进程重新加载配置等。
  • master进程负责具体网络事件。

将里面核心的流程和函数抽取出来,如下图所示:

Nginx源码阅读笔记-Master Woker进程模型

  • master进程的主循环在函数ngx_master_process_cycle中,主要负责:
    • 调用ngx_start_worker_processes函数创建worker子进程。
    • 监控各种信号量的变化做处理,比如需要停止进程、重新加载配置等。
  • master进程最终会调用函数ngx_spawn_process函数来创建出worker子进程:
    • 使用共享内存创建出用于master-worker进程之间通信的channel。
    • fork出子进程之后,进入worker进程的主函数ngx_worker_process_cycle。

以下列举出几个相关的信号量:

信号 对应全局变量 处理
QUIT ngx_quit 优雅关闭整个Nginx服务
TERM或者INT ngx_terminate 强制关闭Nginx服务
USR1 ngx_reopen 重新打开文件
WINCH ngx_noaccept 所有worker进程不再接受新的连接,相当于给子进程发送QUIT信号
USR2 ngx_change_binary 平滑升级到新的Nginx二进制文件
HUP ng_reconfigure 重新加载配置文件
CHLD ngx_reap 需要监控所有子进程

worker进程

worker进程的函数入口在ngx_worker_process_cycle中,其主要做的工作分为两部分:

  • 调用ngx_process_events_and_timers处理IO事件以及定时器事件。
  • 判断ngx_terminate、ngx_quit、ngx_reopen这几个变量是否被置位来做相应的处理。

下面主要谈网络IO事件的处理,即ngx_process_events_and_timers函数。

先来介绍几个与接收连接相关的全局变量:

  • ngx_use_accept_mutex:由配置项accept_mutex配置,表示是否需要使用accept锁,只有抢到该锁的worker才允许接收新的连接。
  • ngx_accept_mutex_delay:由配置项accept_mutex_delay配置,在开启accept_mutex的情况下,一个worker进程在抢不到accept锁的情况下,最长多少时间才重新接收新的连接。
  • ngx_accept_disabled:值为ngx_cycle->connection_n / 8 - ngx_cycle->free_connection_n,可以看到当链接数量到nginx.conf中配置的worker_connections的7/8以上时,这个变量ngx_accept_disabled为正数,此时不会接收新的连接,直到该值小于等于0为止。
  • ngx_accept_mutex_held:表示是否抢到了accept锁,只有抢到的才能接收新连接。

具体来看看ngx_process_events_and_timers函数中与接收连接相关的逻辑,伪代码如下:

如果开启了accept_mutex配置:
  如果当前ngx_accept_disabled大于0,表示不能接收新的连接,直接返回。
  否则尝试获取accept mutex。
  如果获取accept mutex锁成功:
    将调用事件轮询函数的标志位加上NGX_POST_EVENTS标志
  如果获取失败:
    调用事件轮询函数的事件参数不得超过ngx_accept_mutex_delay值。

  调用ngx_process_events函数处理轮询事件

  调用ngx_event_process_posted(cycle, &ngx_posted_accept_events)函数处理accept事件

  如果前面拿到了accept mutex锁,则释放这个锁,好让其他worker也有机会接收新的连接

  调用ngx_event_expire_timers处理定时器事件

  调用ngx_event_process_posted(cycle, &ngx_posted_events);函数处理除了accept事件以外的其他post事件

在ngx_process_events处理函数中,当传入的flags有NGX_POST_EVENTS标志时,意味着并不马上在这个函数中调用事件的回调函数进行处理,而是放在一个队列中,回头在后面的ngx_event_process_posted函数中再进行处理。

而这里的队列分为两类:

  • ngx_posted_accept_events用于存放接收新连接事件。
  • ngx_posted_events用于存放除了accept之外的其他事件。

这样的做法,是为了将接收新连接的事件优先级放在其他IO事件以及定时器事件之前。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

无懈可击的Web设计

无懈可击的Web设计

西德霍姆 / 刘建宁 / 清华大学出版社 / 2009-4 / 59.90元

一个网站,无论视觉上多么美观,内容多么丰富,如果不能面向最广泛的用户群,那它就不算是真正成功的网站。《无懈可击的Web设计:利用XHTML和CSS提高网站的灵活性与适应性》是Web标准设计领域的公认专家Dan Cederholm的倾力之作,向您描述了基于Web标准的设计策略,以适应各种各样的用户浏览方式。书中每一章的开头都给出了一个基于传统HTML技术的实例,然后对它进行重构,指出它的局限性,并利......一起来看看 《无懈可击的Web设计》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器