2013-03-26 10 views
5

Ho trovato 'accept_mutex' è 'on' in modo predefinito in Nginx come segue:Perché 'accept_mutex' 'on' come predefinito in Nginx?

http://wiki.nginx.org/EventsModule

fa allora accettare la connessione richiede mutex? Perché?

+0

Sì. Usa mutex per serializzare nuove connessioni. Puoi trovare alcune informazioni qui: http://nginx.org/en/docs/ngx_core_module.html#accept_mutex. Tuttavia, mi piacerebbe sapere di più. –

+1

FYI: 'accept_mutex' ora predefinito su' off'sulla Nginx 1.11.3 (https://nginx.org/en/CHANGES) – Sicco

risposta

3

Immaginate che alcuni processi ascoltino su una porta e attendono in epoll. Senza accettare mutex tutti i processi si sveglieranno, ma solo uno sarà in grado di accettare la connessione. Gli altri processi si svegliavano improduttivi. È noto http://en.wikipedia.org/wiki/Thundering_herd_problem

Ma non è la fine della storia.

Spesso o sempre senza successo accettare si tradurrà in cambio di contesto: http://en.wikipedia.org/wiki/Lock_convoy

miei test mostrano il 5-10% delle prestazioni perduto senza accettare mutex.

Aggiornamento: "accept mutex" non è solo il mutext locked around accept. È il nome della tecnologia utilizzata per serializzare l'ascolto sulla porta del server tra i lavoratori. Solo un operatore sta ascoltando per data porta in un momento.

+2

Se accettare il mutex on è più efficiente, perché c'è un'opzione per off? Quando sarà utile? –

+0

Come so che c'erano raramente problemi con accettare mutex e altri moduli/configurazioni. A volte può essere utile impostare accept_mutes off. –

+0

Disattivare 'accept_mutex off;' può ridurre la latenza di decine di millisecondi se il numero di qps è >> 10k – SaveTheRbtz

4

A partire da nginx mainline versione 1.11.3 (rilasciato 2016-07-26), accept_mutex now defaults to off. Ciò è in parte dovuto al fatto che il nuovo flag EPOLLEXCLUSIVE offre i vantaggi di accept_mutex senza l'overhead aggiuntivo.

Problemi correlati