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