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

回到顶部