Nginx进程调度问题详解

Nginx采用的是固定数量的多进程模型,由一个主进程(MasterProcess)和数量与主机CPU核数相同的工作进程协同处理各种事件。这篇文章主要介绍了Nginx进程调度问题,需要的朋友可以参考下

Posted in Servers onSeptember 25, 2021

Nginx采用的是固定数量的多进程模型,由一个主进程(MasterProcess)和数量与主机CPU核数相同的工作进程协同处理各种事件。

Nginx采用的是固定数量的多进程模型,由一个主进程(MasterProcess)和数量与主机CPU核数相同的工作进程协同处理各种事件。

主管理进程负责工作进程的配置加载、启停等操作,工作进程负责处理具体请求。进程间的资源都是独立的,每个工作进程处理多个连接,每个连接由一个工作进程全权处理,不需要进行进程切换,也就不会产生由进程切换引起的资源消耗问题。默认配置下,工作进程的数量与主机CPU核数相同,充分利用CPU和进程的亲缘性(affinity)将工作进程与CPU绑定,从而最大限度地发挥多核CPU的处理能力。

Nginx主进程负责监听外部控制信号,通过频道机制将相关信号操作传递给工作进程,多个工作进程间通过共享内存来共享数据和信息。

Nginx进程调度问题详解

Tips:进程亲缘性(affinity),使进程或线程在指定的CPU(核)上运行。

Nginx的工作进程有如下几种调度方式:

  • 无调度模式:所有工作进程都会在连接事件被触发时争相与客户端建立连接,建立连接成功则开始处理客户端请求。无调度模式下所有进程都会争抢资源,但最终只有一个进程可以与客户端建立连接,对于系统而言这将在瞬间产生大量的资源消耗,这就是所谓的惊群现象。
  • 互斥锁模式:每个工作进程都会周期性地争抢互斥锁,一旦某个工作进程抢到互斥锁,就表示其拥有接收HTTP建立连接事件的处理权,并将当前进程的socket监听注入事件引擎(如epoll)中,接收外部的连接事件。其他工作进程只能继续处理已经建立连接的读写事件,并周期性地轮询查看互斥锁的状态,只有互斥锁被释放后工作进程才可以抢占互斥锁,获取HTTP建立连接事件的处理权。当工作进程最大连接数的1/8与该进程可用连接(free_connection)的差大于或等于1时,则放弃本轮争抢互斥锁的机会,不再接收新的连接请求,只处理已建立连接的读写事件。互斥锁模式有效地避免了惊群现象,对于大量HTTP的短连接,该机制有效避免了因工作进程争抢事件处理权而产生的资源消耗。但对于大量启用长连接方式的HTTP连接,互斥锁模式会将压力集中在少数工作进程上,进而因工作进程负载不均而导致QPS下降。
  • 套接字分片:套接字分片是由内核提供的一种分配机制,该机制允许每个工作进程都有一组相同的监听套接字。当有外部连接请求时,由内核决定哪个工作进程的套接字监听可以接收连接。这有效避免了惊群现象的发生,相比互斥锁机制提高了多核系统的性能。该功能需要在配置listen指令时启用reuseport参数。

Tips:Nginx 1.11.3以后的版本中互斥锁模式默认是关闭的。套接字分片模式则因为由Linux内核提供进程的调度机制,所以性能最好。

到此这篇关于Nginx进程调度问题的文章就介绍到这了,更多相关Nginx进程调度内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx配置proxy_pass中url末尾带/与不带/的区别详解
Mar 31 Servers
教你快速开启Apache SkyWalking的自监控
Apr 25 Servers
nginx中封禁ip和允许内网ip访问的实现示例
Mar 17 Servers
nginx常用配置conf的示例代码详解
Mar 21 Servers
CKAD认证中部署k8s并配置Calico插件
Mar 31 Servers
docker 制作mysql镜像并自动安装
May 20 Servers
linux目录管理方法介绍
Jun 01 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
Jun 25 Servers
windows系统安装配置nginx环境
Jun 28 Servers
Linux在两个服务器直接传文件的操作方法
Aug 05 Servers
Windows server 2016服务器基本设置
Aug 14 Servers
解决使用了nginx获取IP地址都是127.0.0.1 的问题
Sep 25 #Servers
关于nginx 实现jira反向代理的问题
Windows下用Nginx配置https服务器及反向代理的问题
Sep 25 #Servers
nginx安装以及配置的详细过程记录
Sep 15 #Servers
Nginx缓存设置案例详解
Sep 15 #Servers
图文详解Nginx版本平滑升级方案
Sep 15 #Servers
Nginx配置文件详解以及优化建议指南
Sep 15 #Servers
You might like
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
php中关于长度计算容易混淆的问题分析
2016/05/27 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
javascript 写类方式之四
2009/07/05 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
jquery ajax,ashx,json的用法总结
2014/02/12 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
javascript超过容器后显示省略号效果的方法(兼容一行或者多行)
2016/07/14 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
详解jQuery插件开发方式
2016/11/22 Javascript
Vue.js基础学习之class与样式绑定
2017/03/20 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
Python3基础之输入和输出实例分析
2014/08/18 Python
解决csv.writer写入文件有多余的空行问题
2018/07/06 Python
Python实现对文件进行单词划分并去重排序操作示例
2018/07/10 Python
Python numpy.array()生成相同元素数组的示例
2018/11/12 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
详解Python3中ceil()函数用法
2019/02/19 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
Django中的cookie和session
2019/08/27 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python异常继承关系和自定义异常实现代码实例
2020/02/20 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
2020/06/08 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
canvas学习笔记之2d画布基础的实现
2019/02/21 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
美国女鞋品牌:naturalizer(娜然)
2016/08/01 全球购物
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
阿迪达斯法国官方网站:adidas法国
2018/03/20 全球购物
优秀工作者事迹材料
2014/12/26 职场文书
Nginx使用Lua模块实现WAF的原理解析
2021/09/04 Servers