2013-03-26 21 views
5

tôi thấy 'accept_mutex' được 'bật' như mặc định trong Nginx như sau:Tại sao 'accept_mutex' 'trên' làm mặc định trong Nginx?

http://wiki.nginx.org/EventsModule

Sau đó, không chấp nhận kết nối yêu cầu mutex? Tại sao?

+0

Có. Nó sử dụng mutex để serialize các kết nối mới. Bạn có thể tìm thấy một số thông tin tại đây: http://nginx.org/en/docs/ngx_core_module.html#accept_mutex. Tuy nhiên, tôi muốn biết nhiều hơn thế. –

+1

FYI: 'accept_mutex' bây giờ mặc định là' off 'khỏi Nginx 1.11.3 (https://nginx.org/en/CHANGES) – Sicco

Trả lời

3

Hãy tưởng tượng một số quy trình nghe trên một cổng và đợi trong epoll. Nếu không chấp nhận mutex, mọi tiến trình sẽ thức dậy, nhưng chỉ có một quy trình mới có thể chấp nhận kết nối. Những người khác quá trình waked lên không hiệu quả. Nó cũng được biết đến http://en.wikipedia.org/wiki/Thundering_herd_problem

Nhưng nó không phải là kết thúc của câu chuyện.

Thường hoặc luôn luôn thất bại chấp nhận sẽ cho kết quả trong bối cảnh chuyển đổi: http://en.wikipedia.org/wiki/Lock_convoy

xét nghiệm của tôi cho thấy 5-10% hiệu suất bị mất mà không chấp nhận mutex.

Cập nhật: "chấp nhận mutex" không chỉ là ẩn ngữ bị khóa xung quanh chấp nhận. Đây là tên công nghệ được sử dụng để sắp xếp từng bước nghe trên cổng máy chủ giữa các công nhân. Chỉ có một nhân viên đang lắng nghe cổng đã cho trong một thời điểm.

+2

Nếu chấp nhận mutex on hiệu quả hơn, tại sao lại có tùy chọn tắt? Khi nào nó sẽ hữu ích? –

+0

Như tôi biết có rất ít vấn đề với việc chấp nhận mutex và các mô-đun/cấu hình khác. Đôi khi, việc đặt accept_mutes off có thể hữu ích. –

+0

Bật 'accept_mutex off;' có thể giảm độ trễ xuống hàng chục mili giây nếu số lượng qps là >> 10k – SaveTheRbtz

4

Kể từ phiên bản chính của nginx 1.11.3 (phát hành 2016-07-26), accept_mutex now defaults to off. Điều này một phần vì cờ EPOLLEXCLUSIVE mới cung cấp các lợi ích của accept_mutex mà không phải trả thêm phí.