Re: когда лучше использовать multi_accept on
Валентин Бартенев
vbart на nginx.com
Пт Июн 10 17:11:30 UTC 2016
On Friday 10 June 2016 18:52:35 Sargas wrote:
> Валентин, а скажите, пожалуйста почему будет много лишних вызовов accept()
> с EAGAIN если соединений мало?
Потому что в этом режиме, как я уже писал, nginx в цикле зовет accept() до
тех пор, пока не получит EAGAIN.
Таким образом на каждое событие на listen-сокете мы имеем минимум один вызов
accept() с EAGAIN.
Если рабочему процессу удастся принять 5 соединений, то это будет 5 успешных
accept()-ов и один неуспешный, а если всего одно, то пропорция 1 к 1.
> Это будет только на Linux или на FreeBSD так же?
На FreeBSD директива ни на что не влияет. Там kqueue сообщает о количестве
пришедших соединений в событии и ровно столько раз nginx позовет accept().
>
> На FreeBSD есть accept filter, соответственно если он включен в системе и в
> конфиге nginx, то система знает сколько соединений прошли фильтр и готовы
> для accept. Правильно ли я понимаю что рабочему процессу остается
> обработать известное кол-во соединений и не делать много лишних accept c
> EAGAIN в этом случае?
Accept filter тут не причем. Как я уже описал выше, kqueue сам по себе сообщает
сколько соединений пришло в сокет (независимо от того, используется ли accept
filter или нет), в то время, как epoll сообщает только о факте наличия новых
соединений, но не их количество.
Про accept filter Игорь писал очень давно:
http://sysoev.ru/freebsd/accept-filters.html
В Linux аналогичной цели (уменьшение числа переключений контекста) может служить
опция TCP_DEFER_ACCEPT.
--
Валентин Бартенев
Подробная информация о списке рассылки nginx-ru