Re: nginx VS apache: Количество одновременных TCP соединений

Igor Sysoev is at rambler-co.ru
Wed Aug 23 15:47:17 MSD 2006


On Wed, 23 Aug 2006, Lex Lyamin wrote:

> On 8/23/06, Igor Sysoev <is at rambler-co.ru> wrote:

> утверждение про  nodelay так-же верно.
>
>
> apache/srclib/apr/network_io/unix/sockopt.c
> ------------------------------------------------------------------
> static apr_status_t sononblock(int sd)
> {
> #ifndef BEOS
>    int fd_flags;
>
>    fd_flags = fcntl(sd, F_GETFL, 0);
> #if defined(O_NONBLOCK)
>    fd_flags |= O_NONBLOCK;
> #elif defined(O_NDELAY)
>    fd_flags |= O_NDELAY;
> #elif defined(FNDELAY)
>    fd_flags |= FNDELAY;
> #else
> #error Please teach APR how to make sockets non-blocking on your platform.
> #endif
>    if (fcntl(sd, F_SETFL, fd_flags) == -1) {
>        return errno;
>    }
> #else
>    int on = 1;
>    if (setsockopt(sd, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)) < 0)
>        return errno;
> #endif /* BEOS */
>    return APR_SUCCESS;
> }
> ----------------------------------------------------

Это не то. Это включение неблокирующегося режима сокета, а нужен TCP_NODELAY.
Включается в apr_socket_accept().

> Итого:  есть вполне хорошее и логичное обьяснение сложившейся ситуации.
> По тестам, время на открытие все той-же странички получается ~0.59s, что
> как минимум не хуже чем у апача, при гораздо более приятной
> масштабируемости.
>
> Игорь, а может быть имеет смысл по умолчанию         tcp_nodelay  on   ?

Да, наверное, нужно так делать, учитывая, что TCP_NODELAY всё равно
включается не по accept()у, как в Апаче и почти везде, кроме Zeus'а,
а только при переходе в keep-alive.


Игорь Сысоев
http://sysoev.ru





More information about the nginx-ru mailing list