Re: Fwd: Nginx при обновлении большого числа пакетов APT

Evgeny Sinelnikov sin на altlinux.ru
Пт Июл 29 09:01:54 UTC 2011


Здравствуйте,

29 июля 2011 г. 11:34 пользователь Igor Sysoev <igor на sysoev.ru> написал:
> On Fri, Jul 29, 2011 at 06:53:32AM +0400, Evgeny Sinelnikov wrote:
>> Здравствуйте, Игорь,
>>
>> сегодня я написал письмо по поводу исправления nginx при использовании
>> сервера для обновлений в ALT Linux. Написал и подумал, что стоило бы и
>> вам отправить копию этого сообщения. Постфактум пересылаю уже
>> отправленное сообщение, надеюсь мои соображения смогут найти отражение
>> при доработках сервера nginx.
>
> Спасибо.

И вам, спасибо... Мне тут коллеги подсказали, что стоило бы сразу
писать в рассылку:
 http://mailman.nginx.org/mailman/listinfo/nginx-ru
Делаю копию в nginx-ru@

> Lingering close не связан с SO_LINGER, про него можно почитать
> здесь (во второй ссылке много всего, нужно искать lingering close):
> http://sysoev.ru/web/upload.html
> http://httpd.apache.org/docs/1.3/misc/perf-tuning.html
>
> Тут похоже на проблему с pipelined.
> Скорее всего, в следующей версии будет исправлено.

Это было бы замечательно. Хотя, на счёт того, что "Lingering close не
связан с SO_LINGER" мне не совсем понятно. Ведь как раз во второй
ссылке есть такое: "There are two ways of accomplishing this. One is
the socket option SO_LINGER. But as fate would have it, this has never
been implemented properly in most TCP/IP stacks."

Кроме того, я на тесте проверил, что это именно проблема слишком
раннего закрытия. Мне пришлось убрать lingering_close, поскольку когда
заканчивается keep alive time соединение сразу закрывается, а значение
lingering_timeout игнорируется. В большинстве случаев (не всегда) у
меня это приводит к тому, что клиентская сторона фиксирует обрыв
соединения со стороны сервера.

Для вот этого момента:
Get:99 http://download.etersoft.ru i586/classic xorg-dri-savage
4:7.10.3-alt2 [829kB]
Get:100 http://download.etersoft.ru i586/classic xorg-dri-mga
4:7.10.3-alt2 [835kB]
Err http://download.etersoft.ru i586/classic xorg-dri-mga 4:7.10.3-alt2
 Error reading from server - read (104 Connection reset by peer)

Отладка выглядит следующим образом
....
2011/07/28 20:47:11 [debug] 26411#0: *5 sendfile: @806978 22183
2011/07/28 20:47:11 [debug] 26411#0: *5 sendfile: 22183, @806978 22183:22183
2011/07/28 20:47:11 [debug] 26411#0: *5 http write filter 00000000
2011/07/28 20:47:11 [debug] 26411#0: *5 http copy filter: 0
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-savage-7.10.3-alt2.i586.rpm?"
2011/07/28 20:47:11 [debug] 26411#0: *5 http writer output filter: 0,
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-savage-7.10.3-alt2.
i586.rpm?"
2011/07/28 20:47:11 [debug] 26411#0: *5 http writer done:
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-savage-7.10.3-alt2.i586.rpm?"
2011/07/28 20:47:11 [debug] 26411#0: *5 http finalize request: 0,
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-savage-7.10.3-alt2.i586
.rpm?" a:1, c:1
2011/07/28 20:47:11 [debug] 26411#0: *5 event timer del: 12: 1906665834
2011/07/28 20:47:11 [debug] 26411#0: *5 set http keepalive handler
2011/07/28 20:47:11 [debug] 26411#0: *5 http close request
2011/07/28 20:47:11 [debug] 26411#0: *5 http log handler
2011/07/28 20:47:11 [debug] 26411#0: *5 run cleanup: 081D7658
2011/07/28 20:47:11 [debug] 26411#0: *5 file cleanup: fd:17
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 081D7060, unused: 1932
2011/07/28 20:47:11 [debug] 26411#0: *5 event timer add: 12: 75000:1906680901
2011/07/28 20:47:11 [debug] 26411#0: *5 pipelined request
2011/07/28 20:47:11 [debug] 26411#0: *5 post event 081BD108
2011/07/28 20:47:11 [debug] 26411#0: *5 delete posted event 081BD108
2011/07/28 20:47:11 [debug] 26411#0: *5 event timer del: 12: 1906680901
2011/07/28 20:47:11 [debug] 26411#0: *5 generic phase: 0
2011/07/28 20:47:11 [debug] 26411#0: *5 rewrite phase: 1
.....
.....
.....
2011/07/28 20:47:11 [debug] 26411#0: *5 sendfile: @833137 1607
2011/07/28 20:47:11 [debug] 26411#0: *5 sendfile: 1607, @833137 1607:1607
2011/07/28 20:47:11 [debug] 26411#0: *5 http write filter 00000000
2011/07/28 20:47:11 [debug] 26411#0: *5 http copy filter: 0
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-mga-7.10.3-alt2.i586.rpm?"
2011/07/28 20:47:11 [debug] 26411#0: *5 http writer output filter: 0,
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-mga-7.10.3-alt2.i58
6.rpm?"
2011/07/28 20:47:11 [debug] 26411#0: *5 http writer done:
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-mga-7.10.3-alt2.i586.rpm?"
2011/07/28 20:47:11 [debug] 26411#0: *5 http finalize request: 0,
"/pub/ALTLinux/p6/branch/i586/RPMS.classic/xorg-dri-mga-7.10.3-alt2.i586.rp
m?" a:1, c:1
2011/07/28 20:47:11 [debug] 26411#0: *5 event timer del: 12: 1906665901
2011/07/28 20:47:11 [debug] 26411#0: *5 http request count:1 blk:0
2011/07/28 20:47:11 [debug] 26411#0: *5 http close request
2011/07/28 20:47:11 [debug] 26411#0: *5 http log handler
2011/07/28 20:47:11 [debug] 26411#0: *5 run cleanup: 081D7654
2011/07/28 20:47:11 [debug] 26411#0: *5 file cleanup: fd:17
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 081D7060, unused: 1940
2011/07/28 20:47:11 [debug] 26411#0: *5 close http connection: 12
2011/07/28 20:47:11 [debug] 26411#0: *5 reusable connection: 0
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 08154C18
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 08154430
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 081D8078
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 0810DCB0, unused: 16
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 08156E50, unused: 32
2011/07/28 20:47:11 [debug] 26411#0: *5 free: 08154B00, unused: 84
2011/07/28 20:47:11 [debug] 26412#0: *6 event timer del: 11: 1906665976
2011/07/28 20:47:11 [debug] 26412#0: *6 generic phase: 0
2011/07/28 20:47:11 [debug] 26412#0: *6 rewrite phase: 1
....

Более полный лог прилагаю.


>> ---------- Пересланное сообщение ----------
>> От кого: Evgeny Sinelnikov <sin на etersoft.ru>
>> Дата: 29 июля 2011 г. 6:36
>> Тема: Nginx при обновлении большого числа пакетов APT
>> Кому: Рассылка разработчиков Etersoft <devel на lists.etersoft.ru>
>> Копия: Денис Смирнов <mithraen на altlinux.ru>, Anton Farygin
>> <rider на altlinux.com>, "Dmitry V. Levin" <ldv на altlinux.org>,
>> mike на altlinux.org
>>
>>
>> Здравствуйте,
>>
>> хочу сообщить, что вчера мы, в очередной раз, столкнулись с проблемой
>> обновления большого числа пакетов аптом, при подключенном
>> http-репозитории, когда на севере установлен nginx. Суть проблемы в
>> том, что при загрузке пакетов, скачивание некоторых пакетов
>> периодически отваливается...
>>
>> Get:99 http://download.etersoft.ru i586/classic xorg-dri-savage
>> 4:7.10.3-alt2 [829kB]
>> Get:100 http://download.etersoft.ru i586/classic xorg-dri-mga
>> 4:7.10.3-alt2 [835kB]
>> Err http://download.etersoft.ru i586/classic xorg-dri-mga 4:7.10.3-alt2
>>  Error reading from server - read (104 Connection reset by peer)
>> Get:101 http://download.etersoft.ru i586/classic xorg-dri-nouveau
>> 4:7.10.3-alt2 [1273kB]
>> Get:102 http://download.etersoft.ru i586/classic xorg-drv-nouveau
>> 2:0.0.16-alt4 [77.4kB]
>> ...
>> Get:199 http://download.etersoft.ru i586/classic thunderbird
>> 3.1.9-alt1.20110409 [9581kB]
>> Get:200 http://download.etersoft.ru noarch/classic firefox-yandexbar
>> 5.2.3-alt1 [1693kB]
>> Err http://download.etersoft.ru noarch/classic firefox-yandexbar
>> 5.2.3-alt1
>>  Error reading from server - read (104 Connection reset by peer)
>> Get:201 http://download.etersoft.ru i586/classic xulrunner-2.0
>> 2.0.1.0-alt1 [1268kB]
>> Get:202 http://download.etersoft.ru i586/classic firefox-4.0 4.0.1-alt1 [1228kB]
>> ...
>> Get:299 http://download.etersoft.ru i586/classic libpulseaudio
>> 0.9.22-alt3 [431kB]
>> Get:300 http://download.etersoft.ru i586/classic libSDL 1.2.14-alt6
>> [169kB]
>> Err http://download.etersoft.ru i586/classic libSDL 1.2.14-alt6
>>  Error reading from server - read (104 Connection reset by peer)
>> Get:301 http://download.etersoft.ru i586/classic libjasper
>> 1.900.1-alt2.qa2 [124kB]
>> Get:302 http://download.etersoft.ru i586/classic libopenraw-gnome
>> 0.0.8-alt2 [4799B]
>> ...
>>
>> Просмотрев код nginx и поотлаживая его, на воспроизводимом примере
>> (примерно каждый 100 пакет, как видно выше, стабильно отваливался), я
>> нашёл точку, в которой возникает беда. Беда возникает при отключении
>> соединения. В keep_alive режиме соединение на сервере закрывалось не
>> сразу, а после некоторого числа итераций. Собственно проблема с
>> закрытием возникает из-за использования в nginx SO_LINGER, небольшое
>> описание этого режима я нашёл здесь:
>>  http://kalinin.ru/programming/network/29_10_00.shtml
>>
>> В итоге я сделал такой патч:
>> diff --git a/nginx/src/http/ngx_http_request.c
>> b/nginx/src/http/ngx_http_request.c
>> index 2cef4fa..e2973c8 100644 (file)
>> --- a/nginx/src/http/ngx_http_request.c
>> +++ b/nginx/src/http/ngx_http_request.c
>> @@ -2146,7 +2146,7 @@ ngx_http_finalize_connection(ngx_http_request_t *r)
>>         ngx_http_set_keepalive(r);
>>         return;
>>
>> -    } else if (r->lingering_close && clcf->lingering_timeout > 0) {
>> +    } else if (clcf->lingering_timeout > 0) {
>>         ngx_http_set_lingering_close(r);
>>         return;
>>     }
>>
>> Изменение доступно здесь:
>> http://git.altlinux.org/people/sin/packages/nginx.git
>> http://git.etersoft.ru/people/sin/packages/nginx.git
>>
>> Суть патча в том, чтобы не использовать принудительное отключение
>> соединения при использовании опции lingering_timeout. Мне, при нашей
>> скорости обмена, оказалось достаточно lingering_timeout равного 1.
>> Исходного поведения можно добиться выставив lingering_timeout в 0.
>>
>>
>> --
>> Sin (Sinelnikov Evgeny)
>>
>>
>>
>> --
>> Sin (Sinelnikov Evgeny)
>
> --
> Игорь Сысоев
> http://sysoev.ru
>



-- 
Sin (Sinelnikov Evgeny)
Etersoft
----------- следущая часть -----------
A non-text attachment was scrubbed...
Name: ftp-error.apt.short.log.bz2
Type: application/x-bzip2
Size: 3072 bytes
Desc: отсутствует
URL: <http://mailman.nginx.org/pipermail/nginx-ru/attachments/20110729/9f100b73/attachment.bin>


Подробная информация о списке рассылки nginx-ru