ошибка в nginx ?
Igor Sysoev
is at rambler-co.ru
Fri Jul 11 09:22:54 MSD 2008
On Fri, Jul 11, 2008 at 02:02:24AM +0300, Gena Makhomed wrote:
> On Tuesday, July 8, 2008 at 20:13:44, Igor Sysoev wrote:
>
> >> вот в этом сообщении Andrei Nigmatulin говорит об ошибке в nginx:
> >> http://groups.google.com/group/highload-php-ru/msg/a5a2883173f56f5d
>
> >> но в changelog`е не нашел никаких упоминаний на эту тему.
> >> эта ошибка в nginx сейчас так и осталась не исправленной?
>
> IS> На данный момент, судя по
> IS> http://www.ruby-forum.com/topic/132314
> IS> я вижу только ошибку в ядре.
>
> почему это именно ошибка в ядре? в POSIX стандарте на функцию connect
> http://www.opengroup.org/onlinepubs/000095399/functions/connect.html
>
> не написано что делать в случае переполнения backlog`а.
> есть только вот такое описание возвращаемых кодов ошибок:
>
> ========================================================================================
>
> ERRORS
>
> The connect() function shall fail if:
>
> [ECONNREFUSED]
> The target address was not listening for connections or refused the connection request.
>
> ========================================================================================
>
> [ECONNREFUSED] - это "refused request", когда ситуация persistent fail
> на стороне сервера - "target address was not listening for connections",
> или что-то не так с клиентским запросом - "or refused the connection request"
>
> а переполнение backlog - это ситуация temporary fail
> на стороне сервера, и поэтому возвращается [EAGAIN]?
ECONNREFUSED - это, в случае TCP, получение пакета RST на стадии connect.
Локальная сторона не знает, временно это или нет. Кстати, ситуация
"target address was not listening for connections" может быть временной:
сервер падает и через пару секунд его перезапускают.
> [EINPROGRESS] в этом случае отправлять не выходит,
> потому что тогда - "the connection request
> shall not be aborted, and the connection
> shall be established asynchronously".
>
> IS> В чём причина EAGAIN
>
> насколько удалось понять из исходников ядра Linux,
> http://lxr.linux.no/linux/net/unix/af_unix.c#L1070
>
> Linux всегда (2.2.6 - 2.6.25.10) возвращает EAGAIN
> при неблокирующем коннекте и переполнении backlog.
>
> IS> и что делать при его получении - непонятно.
>
> http://www.issociate.de/board/post/456462/non-blocking_connect_and_EAGAIN.html
>
> From: Vladimir Shebordaev
>
> The comment in the net/unix/af_unix.c prologue states as to AF_UNIX
> connect(), for performance and (very) old BSD compatibility
> reasons the current behavior is intentional and not to be fixed
> until checked against POSIX requirements. I also think proper
> change would break some (very important) existing applications
> since the relevant code - the one that aborts non-blocking
> connection with EAGAIN - lives there since 2.2.6 at least.
>
> [...]
>
> дальше том в сообщении он детально рассматривает
> как работает код функции unix_stream_connect()
Так что делать-то при получении EAGAIN ? Единственное, что можно делать:
ждать секунду и повторять попытку до истечения ..._connect_timeout.
Пока в следующей версии EAGAIN будет сразу писаться в лог.
--
Игорь Сысоев
http://sysoev.ru
More information about the nginx-ru
mailing list