为什么是';接受互斥'';在';作为Nginx中的默认值?

为什么是';接受互斥'';在';作为Nginx中的默认值?,nginx,mutex,Nginx,Mutex,我发现Nginx中默认的“accept_mutex”为“on”,如下所示: 那么接受连接需要互斥吗?为什么?想象一些进程在一个端口上侦听,然后在epoll中等待。 如果没有接受互斥,所有进程都将唤醒,但只有一个进程能够接受连接。另一些进程则毫无成效。 这是众所周知的 但这并不是故事的结局 经常或总是不成功的接受将导致上下文切换: 我的测试表明,如果不接受互斥,性能会损失5-10% 更新:“accept mutex”不仅仅是围绕accept锁定的mutext。 它是用于序列化工作进程之间服务器

我发现Nginx中默认的“accept_mutex”为“on”,如下所示:


那么接受连接需要互斥吗?为什么?

想象一些进程在一个端口上侦听,然后在epoll中等待。 如果没有接受互斥,所有进程都将唤醒,但只有一个进程能够接受连接。另一些进程则毫无成效。 这是众所周知的

但这并不是故事的结局

经常或总是不成功的接受将导致上下文切换:

我的测试表明,如果不接受互斥,性能会损失5-10%

更新:“accept mutex”不仅仅是围绕accept锁定的mutext。 它是用于序列化工作进程之间服务器端口侦听的技术的名称。
一瞬间只有一个工作进程正在侦听给定的端口。

自nginx主线版本1.11.3(2016-07-26发布)起。这部分是因为新的
epolleexclusive
标志提供了
accept\u mutex
的好处,而不需要额外的开销。

检查

  • 接受序列化-多个套接字

  • 接受序列化-单套接字

本Apache文档的各个部分。(与我发布的其他2个文档相比,此文档最为重要)

这非常鼓舞人心,我也读了

解释以及(使用接受互斥体搜索页面)


读完所有这些之后,我想Nginx在这方面与Apache非常相似。

是的。它使用互斥来序列化新连接。您可以在此处找到一些信息:。但是,我想知道更多。仅供参考:
accept_mutex
现在默认为
off
,因为Nginx 1.11.3()@chunama在我的回答中查看了文档。如果accept mutex on更有效,为什么会有off选项?什么时候有用?据我所知,accept mutex和其他模块/配置很少出现问题。有时关闭accept_mutex可能会有所帮助。关闭
accept_mutex>10k,则代码>可以将延迟减少数十毫秒