nginx-0.7.54

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


On Sat, May 02, 2009 at 09:18:51PM +0400, Igor Sysoev wrote:

> 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().

Also, unless I am mistaken Apache2/Windows uses IOCP at least on NT.


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





More information about the nginx mailing list