为什么Nginx默认使用“accept_mutex”?

我发现'accept_mutex'在Nginx中默认为'on',如下所示:

http://wiki.nginx.org/EventsModule

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

想象一下一些进程在一个端口上监听并等待epoll。 如果不接受互斥锁,所有进程都会唤醒,但只有一个将能够接受连接。 其他的一些过程也被唤醒了。 这是众所周知的http://en.wikipedia.org/wiki/Thundering_herd_problem

但这不是故事的结尾。

通常或总是不成功的接受将导致上下文切换: http : //en.wikipedia.org/wiki/Lock_convoy

我的测试显示,如果不接受互斥量,性能会下降5-10%。

更新:“接受互斥”不仅仅是锁定在接受的mutext。 这是用来序列化在工作人员之间监听服务器端口的技术的名称。 只有一名工作人员正在某一时刻监听给定的港口。

从nginx主线版本1.11.3(2016-07-26发布)开始, accept_mutex现在默认为off 。 这部分是因为新的EPOLLEXCLUSIVE标志提供了accept_mutex的好处而没有额外的开销。