nginx 惊群问题

问题的背景:
在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会带来著名的“惊群”问题,子进程数量越多越明显,这会造成系统性能的下降。
如何解决惊群问题-post事件处理机制

很多操作系统的最新版本的内核已经在事件驱动机制中解决了惊群问题,但Nginx作为可移植性极高的web服务器,还是在自身的应用层面上较好的解决了这一问题。
Nginx规定了同一时刻只有唯一一个worker子进程监听web端口,这一就不会发生惊群了,此时新连接事件只能唤醒唯一的正在监听端口的worker子进程。

如何限制在某一时刻是有一个子进程监听web端口呢?在打开accept_mutex锁的情况下,只有调用ngx_trylock_accept_mutex方法后,当前的worker进程才会去试着监听web端口。

我的问题:
假定当前所有的woker进程处于休眠状态,当连接事件发生的时候 ,是不是所有的wokrer进程都会 尝试获取锁,如果获取成功就会 处理连接事件。 那么这种情况下 不也 回导致 连接事件发生时,唤醒所有的wokrer进程 去竞争获取锁吗?

惊群 问题 就是解决 如下问题的

clipboard.png

而 使用锁的解决方案中 如何避免多个worker进程 被唤醒竞争锁??

阅读 2.4k
2 个回答

我想worker信息会进入一个类似池的环境中,由上层调度到底那个成为下一个唤起来监听web端口的进程,这样因为是直接有序安排,就不会存在争抢的问题啦。

只有一个 worker 在监听 web 端口, 那么链接发生时, 只有这一个 worker 会被唤醒.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题