我发现'accept_mutex'在Nginx中默认为'on',如下所示:
那么接受连接是否需要互斥锁?为什么?
从 nginx 主线版本 1.11.3(2016-07-26 发布)开始,accept_mutex
现在默认为off
. 这部分是因为新标志提供了没有额外开销EPOLLEXCLUSIVE
的好处。accept_mutex
想象一些进程在一个端口上监听并在 epoll 中等待。如果没有接受互斥锁,所有进程都会唤醒,但只有一个能够接受连接。其他进程唤醒了非生产性。这是众所周知的http://en.wikipedia.org/wiki/Thundering_herd_problem
但这不是故事的结局。
通常或总是不成功的接受会导致上下文切换: http ://en.wikipedia.org/wiki/Lock_convoy
我的测试显示,如果没有接受互斥锁,性能会损失 5-10%。
更新:“接受互斥锁”不仅仅是围绕接受锁定的互斥锁。它是用于在工作人员之间序列化侦听服务器端口的技术的名称。某一时刻只有一名工作人员正在监听给定的端口。
检查
接受序列化 - 多个套接字
接受序列化 - 单套接字
本 Apache 文档的部分内容。https://httpd.apache.org/docs/2.4/misc/perf-tuning.html。(与我发布的其他 2 个文档相比,此文档最重要)
这非常鼓舞人心,我还阅读了
http://nginx.org/en/docs/ngx_core_module.html#accept_mutex解释以及https://www.nginx.com/blog/performance-tuning-tips-tricks/ (带有accept_mutex的搜索页面)。
看完这些,我想 Nginx 在这方面与 Apache 非常相似。