2013-03-26 43 views
5

我發現 'accept_mutex' 是 '上' 作爲默認的Nginx如下:爲什麼Nginx默認使用'accept_mutex'''?

http://wiki.nginx.org/EventsModule

然後不接受連接需要互斥?爲什麼?

+0

是的。它使用互斥來序列化新的連接。你可以在這裏找到一些信息:http://nginx.org/en/docs/ngx_core_module.html#accept_mutex。不過,我想知道更多。 – 2013-03-26 15:38:36

+1

僅供參考:'accept_mutex'現在默認爲'off',因爲Nginx 1.11.3(https://nginx.org/en/CHANGES) – Sicco 2016-09-13 23:05:16

回答

3

想象一下一些進程在一個端口上偵聽並在epoll中等待。 如果不接受互斥鎖,所有進程都會喚醒,但只有一個將能夠接受連接。其他一些進程被喚醒並沒有成效。 這是衆所周知的http://en.wikipedia.org/wiki/Thundering_herd_problem

但它不是故事的結尾。

經常或總是不成功接受將導致上下文切換: http://en.wikipedia.org/wiki/Lock_convoy

我的測試表明5-10%的性能丟失,並且沒有接受互斥。

更新:「接受互斥體」不僅僅是圍繞接受鎖定的互斥體。 這是用於序列化在工作人員之間監聽服務器端口的技術名稱。 只有一名員工正在某個時刻監聽給定的端口。

+2

如果接受互斥鎖更有效率,爲什麼還有關閉選項?它何時有用? – 2013-03-28 01:49:32

+0

據我所知,接受互斥鎖和其他模塊/配置很少遇到問題。有時候設置accept_mutes可能會有所幫助。 – 2013-03-28 05:40:25

+0

關閉'accept_mutex';'如果qps的數量是>> 10k,則可以將延遲降低數十毫秒 – SaveTheRbtz 2014-10-10 23:46:26

4

截至nginx主線版本1.11.3(2016-07-26發佈),accept_mutex now defaults to off。這部分是因爲新的EPOLLEXCLUSIVE標誌提供accept_mutex的好處而沒有額外的開銷。