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+Tomcat实现负载均衡、动静分离的原理解析
Mar 31 Servers
Nginx tp3.2.3 404问题解决方案
Mar 31 Servers
Nginx设置日志打印post请求参数的方法
Mar 31 Servers
解析在浏览器地址栏输入一个URL后发生了什么
Jun 21 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
nginx内存池源码解析
Nov 20 Servers
Shell脚本一键安装Nginx服务自定义Nginx版本
Mar 20 Servers
Win10 Anaconda安装python-pcl
Apr 29 Servers
排查Tomcat进程假死的问题
May 06 Servers
nginx 配置指令之location使用详解
May 25 Servers
教你nginx跳转配置的四种方式
Jul 07 Servers
Nginx代理Redis哨兵主从配置的实现
Jul 15 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
用PHP伪造referer突破网盘禁止外连的代码
2008/06/15 PHP
php socket方式提交的post详解
2008/07/19 PHP
php取整函数ceil,floo,round的用法及介绍
2013/08/31 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
农历与西历对照
2006/09/06 Javascript
用javascript实现给图片加链接
2007/08/15 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
基于jQuery的星级评分插件
2011/08/12 Javascript
如何在JavaScript中实现私有属性的写类方式(二)
2013/12/04 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
2014/02/08 Javascript
防止登录页面出现在frame中js代码
2014/07/22 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
JavaScript中Form表单技术汇总(推荐)
2016/06/26 Javascript
基于javascript实现的快速排序
2016/12/02 Javascript
VsCode与Node.js知识点详解
2019/09/05 Javascript
echarts柱状图背景重叠组合而非并列的实现代码
2020/12/10 Javascript
python dict 相同key 合并value的实例
2019/01/21 Python
Python3.5常见内置方法参数用法实例详解
2019/04/29 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
40个你可能不知道的Python技巧附代码
2020/01/29 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
2020/03/09 Python
python和c语言哪个更适合初学者
2020/06/22 Python
如何在pycharm中安装第三方包
2020/10/27 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
Europcar葡萄牙:葡萄牙汽车和货车租赁
2017/10/13 全球购物
Zipadee-Zip襁褓过渡毯:Sleeping Baby
2018/12/30 全球购物
英国和国际包裹递送:ParcelCompare
2019/08/26 全球购物
Delphi CS笔试题
2014/01/04 面试题
决定成败的关键——创业计划书
2014/01/24 职场文书
交通事故调解协议书
2014/04/16 职场文书
清正廉洁演讲稿
2014/05/22 职场文书
销售员态度差检讨书
2014/10/26 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书