nginx-0.7.54

Igor Sysoev is at rambler-co.ru
Sat May 2 21:18:51 MSD 2009


On Sat, May 02, 2009 at 06:50:25PM +0200, Chris Wan wrote:

> Igor Sysoev wrote:
> > On Sat, May 02, 2009 at 04:57:36PM +0200, Chris Wan wrote:
> > 
> >> 
> >> I run 0.7.54 nginx/windows, but I found the nginx don't work at all when 
> >> I set "worker_processes  4".
> >> 
> >> command "telnet 127.0.0.1 80" is ok, but IE can't open 
> >> "http://127.0.0.1", it wait untill time expired.  and  no error in 
> >> error.log.
> > 
> > Try
> > 
> > events {
> >    accept_mutex  off;
> > }
> > 
> > In my tests only one process receives select() notifcaitons about new
> > connections.
> thx, It work.
> 
> I want to know more information about this directives.
> 
> nginx wiki:
> accept_mutex
> Syntax: accept_mutex [ on | off ]
> Default: on
> nginx uses accept mutex to serialize accept() syscalls.
> 
> 
> I notice you used to say:
> Workers try to hold accept_mutex which
> allows only one worker to get new connections notification and to call
> accept(). You can switch accept_mutex off, then all scheduling will be
> done by OS scheduler via accept() call. "
> 
> but apache said:
> /* On some architectures it's safe to do unserialized accept()s in the 
> single
>  * Listen case.  But it's never safe to do it in the case where there's
>  * multiple Listen statements.  Define SINGLE_LISTEN_UNSERIALIZED_ACCEPT
>  * when it's safe in the single Listen case.
>  */

If Listen is single Apache workers just call blocking accept().
If Listen are several worker can not just call blocking accept() on one
listening socket. It calls select() for all listening sockets instead,
and then calls accept() for returned socket.

nginx workers always use select/kqueue/epoll/etc. before accept(). 

OS may wake all processes waiting on accept() and select(), this is called
http://en.wikipedia.org/wiki/Thundering_herd_problem
This is a problem if you have a lot of workers as in Apache (hundreds
and more), but this insensible if you have just several workers as nginx
usually has. Therefore turning accept_mutex off is as scheduling incoming
connection by OS via select/kqueue/epoll/etc (but not accept().


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list