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 设置多个站跨域
Mar 09 Servers
fastdfs+nginx集群搭建的实现
Mar 31 Servers
Nginx Rewrite使用场景及配置方法解析
Apr 01 Servers
Kubernetes部署实例并配置Deployment、网络映射、副本集
Apr 01 Servers
Nginx速查手册及常见问题
Apr 07 Servers
Nginx+Tomcat负载均衡多实例详解
Apr 11 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
docker compose 部署 golang 的 Athens 私有代理问题
Apr 28 Servers
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
Jun 01 Servers
CentOS7安装MySQL8的超级详细教程(无坑!)
Jun 10 Servers
Nginx如何获取自定义请求header头和URL参数详解
Jul 23 Servers
CentOS7 minimal 最小化安装网络设置过程
Dec 24 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
php计算十二星座的函数代码
2012/08/21 PHP
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
php中的动态调用实例分析
2015/01/07 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
HTTP状态代码以及定义(解释)
2007/02/02 Javascript
基于jQuery图片平滑连续滚动插件
2009/04/27 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
JS中令人发指的valueOf方法介绍
2013/02/22 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
JS+CSS实现大气清新的滑动菜单效果代码
2015/10/22 Javascript
浅谈JS中的三种字符串连接方式及其性能比较
2016/09/02 Javascript
浅谈javascript alert和confirm的美化
2016/12/15 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
vue父组件向子组件动态传值的两种方法
2017/11/11 Javascript
JS实现的数组去除重复数据算法小结
2017/11/17 Javascript
在vue中使用eslint,配合vscode的操作
2020/11/09 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python 的内置字符串方法小结
2016/03/15 Python
python基于ID3思想的决策树
2018/01/03 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
深入解析HTML5的IndexedDB索引数据库
2015/09/14 HTML / CSS
HTML5基于flash实现播放RTMP协议视频的示例代码
2020/12/04 HTML / CSS
英国综合网上购物商城:The Hut
2018/07/03 全球购物
英语教育专业自荐信
2014/05/29 职场文书
优秀大学生自荐信
2014/06/09 职场文书
财务会计专业自荐书
2014/06/30 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
信用卡工资证明范本
2014/10/17 职场文书
二十年同学聚会致辞
2015/07/28 职场文书
win10安装配置nginx的过程
2021/03/31 Servers