Linux 上的 Nginx 是如何解决惊群问题的?
最近再看 Nginx
多进程的惊群问题,在这篇文章nginx惊群问题中看到这段话?
什么是nginx惊群问题?
了解惊群问题首先要了解下nginx进程部署架构:nginx进程主要是一个主进程(master)和多个工作进程(worker)。master进程并不处理网络请求,主要负责初始化和调度工作进程,如加载配置、启动工作进程 ,升级等,worker进程用来处理网络请求,并且一个连接的多个阶段处理都在同一个worker中进行。既然是多个worker同时等待同一个socket事件,当这个事件发生时,所有worker同时唤醒,但最终只能有一个进程能建立成功,其他进程都会失败,造成了资源的浪费。
nginx解决惊群到方法
简单总结就是同一时刻保证只有一个worker在监听。那么这个是如何做到呢?其实也很简单,增加一个ngx_use_accept_mutex锁,各个worker在监听socket事要先拿到这个锁,而同一时刻保证只有一个worker拿到。
很多操作系统已经在epoll阶段解决了这个问题,为什么nginx还要做?
1、跨平台,有些不支持
2、实现各个worker负载均衡
为了使各个worker上的连接达到负载均衡,定义了全局变量ngx_accept_disabled,其为值为连接总数的1/8-剩余连接数,即初始化时为负值,拿ngx_use_accept_mutex锁的时候,会判断该值是否为正,如果为正就建立连接而是将值减1,也就是说在worker上连接数目达到规格的7/8时才开始负载均衡。
???? 感觉这篇文章漏洞百出!!!
比如这段话:“很多操作系统已经在epoll阶段解决了这个问题”,epoll 就是 Linux 特有的 API,哪来的 “很多操作系统已经在epoll阶段”,并且 epoll 是单进程下的 IO 多路复用机制,和多进程惊群没有任何关系!!!
所以,我想问的是,现代 Linux
下,Nginx
是如何解决惊群问题的?
我看到一些文章说是全局的锁,这个锁是什么锁?算是一种 IPC
吗?毕竟多个进程可以共享这个锁变量!
现代 Linux 就是内核版本大于 5.0
回答:
知乎的这篇文章写的不错,讲的很清楚:Liunx与Nginx中的惊群效应
以上是 Linux 上的 Nginx 是如何解决惊群问题的? 的全部内容, 来源链接: utcz.com/p/944251.html