2013-03-26 13 views
5

znalazłem 'accept_mutex' jest 'o' jako domyślny w Nginx następująco:Dlaczego funkcja "accept_mutex" jest włączona domyślnie w Nginx?

http://wiki.nginx.org/EventsModule

Wtedy nie akceptując połączenia wymagają mutex? Czemu?

+0

Tak. Używa mutex do serializowania nowych połączeń. Możesz znaleźć informacje tutaj: http://nginx.org/en/docs/ngx_core_module.html#accept_mutex. Chciałbym jednak dowiedzieć się czegoś więcej. –

+1

FYI: 'accept_mutex' teraz domyślnie wyłącza' od 'Nginx 1.11.3 (https://nginx.org/en/CHANGES) – Sicco

Odpowiedz

3

Wyobraź sobie, że niektóre procesy nasłuchują na jednym porcie i czekają w epolu. Bez akceptowania mutex wszystkie procesy zostaną wybudzone, ale tylko jeden będzie mógł zaakceptować połączenie. Inni proces obudzili nieproduktywne. Jest dobrze znany

Ale to nie koniec historii.

często lub zawsze niepowodzeniem zaakceptować spowoduje przełączania kontekstu: http://en.wikipedia.org/wiki/Lock_convoy

Moje testy pokazują 5-10% wydajności utraconej bez zaakceptować mutex.

Aktualizacja: "zaakceptuj muteks" to nie tylko mutext zablokowany w pobliżu accept. Jest to nazwa technologii służącej do szeregowania nasłuchu na porcie serwera między pracownikami. Tylko jeden pracownik nasłuchuje na dany port w jednej chwili.

+2

Jeśli akceptacja mutex jest bardziej wydajna, dlaczego istnieje opcja wyłączenia? Kiedy to będzie przydatne? –

+0

Jak mi wiadomo, bardzo rzadko pojawiały się problemy z akceptacją muteksa i innych modułów/konfiguracji. Czasami pomocne może być ustawienie opcji accept_mutes. –

+0

Włączenie 'accept_mutex off;' może zmniejszyć opóźnienie o dziesiątki milisekund, jeśli liczba qps wynosi >> 10k – SaveTheRbtz

4

Od wersji mainline nginx 1.11.3 (wydany 2016-07-26), accept_mutex now defaults to off. Jest to częściowo spowodowane tym, że nowa flaga EPOLLEXCLUSIVE zapewnia korzyści z accept_mutex bez dodatkowego obciążenia.

Powiązane problemy