Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: freebsd+nginx+php-fpm
- To: nginx-ru@xxxxxxxxx
- Subject: Re: freebsd+nginx+php-fpm
- From: Andrei Nigmatulin <andrei.nigmatulin@xxxxxxxxx>
- Date: Fri, 19 Jun 2009 00:16:44 +0400
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:subject:date :user-agent:references:in-reply-to:mime-version:content-type :content-transfer-encoding:content-disposition:message-id; bh=cvGM//4DGWcr+GfUSkqYMkXTe45Xb7Z+AVnuKzTGwuk=; b=W6lq+JvNJ7LMI8S7FiDn3zV2AH+s76QO+sqs28nFkGtWV4dRYq9z1SApCpSH2UMnhM y1J1q8j6xinax96ypZ+Zk54y2zeo+s70nFkv8JQwcgvbL3EIj3E8LRiXCrPwAdrhdSjV AMLtCH3DyQcV2QzljrpmqeAtGomiyEkF1kL/w=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:subject:date:user-agent:references:in-reply-to:mime-version :content-type:content-transfer-encoding:content-disposition :message-id; b=JpvuXHnede6blt6s8cPOI/+vVuWfnjQlxzMEVCgpcA6HQR7k08yD34R9xJgUuvLmJb RvWUDIirw2hhv/o8syWVwrSrPh7foINg6/tIeru2KAmGglgfiz+UbLC+EWQ2KWTatXjC dUPpgDfqUdQwf4EHzVXJRMlDzrIb6DrxcKE2o=
- In-reply-to: <176280830.20090618221356@xxxxxxxxx>
- References: <4A3A268C.3050207@xxxxxxx> <200906182139.22881.andrei.nigmatulin@xxxxxxxxx> <176280830.20090618221356@xxxxxxxxx>
On Thursday 18 June 2009 23:13, Gena Makhomed wrote:
> AN> Тогда оставьте в покое listening queue. Отправлять запрос
> AN> на резервный backend надо через fastcgi_connect_timeout.
>
> в случае переполнения listening queue, т.е. когда backend понимает,
> что он уже не в состоянии обработать новые запросы - frontend
> практически мгновенно получает 502 ошибку от этого backend`а.
>
> в предлагаемом Вами варианте - frontend тупо ждет 60 секунд,
> и только через 60 сек он начинает соображать, что этот backend
> уже будет не в состоянии обработать этот конкретный новый запрос.
>
> честно, - не понимаю, чем предлагаемый Вами вариант лучше.
> обычно время, которое затрачивается на обработку запросов
> клиентов стараются уменьшать, а не искуственно увеличивать.
Я подразумеваю, что у нас имеется обычный web сайт, один фронтенд и несколько
backends. Я подразумеваю, что все backends равномерно загружены запросами и
резервных нет. Ну вот не вижу смысла держать резервные простаивающие
backends, правда.
В случае всплесков мне нужно пытаться обслужить клиента до последнего и мне
бесполезна возможность моментально узнать что backend загружен под завязку.
Скорее всего, это значит, что остальные backends в похожем состоянии, и
запросу все равно суждено висеть пока не он обработается или клиент не
устанет ждать. Это все что я могу сделать. Как мне тут может помочь 502
ошибка ?
> AN> Иначе непонятен смысл - вы не беспокоитесь за судьбу
> AN> уже зависших в listening queue соединений,
>
> они не зависли, они стоят в очереди на обработку.
> backend работает, но он уже перегружен запросами.
> и те запросы, что стоят в очереди он обработает
> за допустимый период времени. тут все нормально.
>
> AN> но беспокоитесь за те, которые его переполнят.
>
> когда listening queue у работающего backend`а
> уже переполнена - новые запросы этим backend`oм
> обрабатывались бы слишком долго - клиенты столько
> времени ждать ответа не станут. поэтому - сразу 502.
>
> и у frontend`а появляется шанс решить эту проблему.
Как мне на практике использовать этот шанс ? Как для вышеописанной ситуации
мне может помочь 502 ошибка ?
> >> AN> А вы видели хоть одного администратора, который знает как правильно
> >> AN> расчитать размер listening queue, исключая подбор значений
> >> экмпериментально ?
> >>
> >> разве это так сложно? len( listening queue ) == wait_time /
> >> response_time wait_time - сколько времени средний клиент захочет ждать
> >> ответ от сервера response_time - среднее время обработки одного запроса
> >> backend`ом сервера
> >>
> >> например, в случае wait_time == 20 sec, response_time == 0.020 sec
> >> размер listening queue для этого backend`а будет равен 1024.
> >> для гарантии можно этот параметр увеличить в полтора-два раза.
> >>
> >> но при len( listening queue ) == 10000, response_time == 0.020 sec
> >> и при заполнении listening queue - запросы будут проводить в ней
> >> по 200 секунд. и *каждый* клиент будет ~ 200 секунд ждать ответ.
>
> AN> И где тут учитываются всплески ?
>
> в размере listening queue. исходя из параметров производительности
> backend`а (сколько времени он тратит в среднем на обработку запроса)
> и исходя из QoS показателя, сколько времени сервер может заниматься
> обработкой одного клиентского запроса.
>
> AN> Обслуживать поток запросов с постоянной плотностью просто и скучно.
> AN> Да и на практике такое редко встретишь.
>
> плотность переменная. в результате размер listening queue
> также становится переменным от 0 до len( listening queue ).
>
> время обработки запросов клиентов - также изменяется от 0
> до wait_time. если backend понимает, что новый запрос он
> скорее всего не успеет обработать за wait_time секунд -
> тогда он сразу же возвращает frontend`у 502-ю ошибку.
>
> когда новые запросы поступают быстрее, чем backend успевает
> их обрабатывать - тогда они становятся в listening queue,
> и количество запросов в listening queue увеличивается.
> (это - работа во время всплеска)
>
> когда backend обрабатывает запросы быстрее,
> чем появляются новые - тогда количество запросов
> в listening queue постепенно уменьшается.
> (это - работа после всплеска)
>
> >> >> AN> тогда как tcp поддерживает retransmission и соответственно,
> >> >> AN> более устойчив к всплескам (кратковременному, непериодическому
> >> >> AN> увеличению) кол-ва запросов.
> >> >>
> >> >> feature "Retransmission of lost packets" работает
> >> >> уже после того, как было установлено соединение.
> >>
> >> AN> По крайней мере в случае linux сервера это не так.
> >> AN> Клиентский syn просто игнорируется, если listening queue полный.
> >>
> >> $subj. а в случае linux это будет "wasting of resources" сервера,
> >> потому что вместо ответа "да" или "нет" frontend будет получать
> >> от backend`а нечеткий ответ "может быть", и будет повторять попытки.
>
> AN> Значит, listening queue на бекенде можно тюнить,
> AN> а кол-во соединений в nginx нельзя ?
>
> все можно. но эффективнее использовать
> встроенную в ядро фичу - listening queue.
>
> если запрос попал в backlog(*) - скорее всего он будет обработан.
> если не попал - точно не будет и frontend сразу получит 502 ответ.
>
> (*) socket backlog и socket listening queue - это одно и то же.
>
> AN> Посчитайте по формулам и установите сколько надо,
> AN> не будет никакого resource wasting.
>
> будет в предлагаемом Вами варианте - вместо тюнинга backlog`а
> надеяться на retransmission из Transmission Control Protocol.
Я не говорю что backlog выставлять не нужно. Я говорю, что сколько вы не
выставляйте, все равно есть ненулевая вероятность, что в единицу времени
может прийти запросов больше, чем расчитывалось при выставлении backlog. Это
теория массового обслуживания, ничего личного.
> >> фактически это будет еще одна, достаточно неэффективная,
> >> listening queue, реализованная внутри frontend`а сервера.
> >> неэффективная из-за постоянных повторных попыток подключения.
>
> AN> Ну поскольку вы предлагаете в качестве альтернативы
> AN> все избыточные запросы отправлять на второй backend
>
> я прежде всего предлагаю не изобретать велосипед с квадратными колесами, -
> я предлагаю использовать backlog по его прямому назначению, для сглаживания
> "всплесков (кратковременному, непериодическому увеличению) кол-ва
> запросов".
А я предлагаю делать безглючные сайты, когда я не знаю что делать с 502
ошибкой на фронтенде. Если человек видит внизу броузера "Waiting for
reply...", а не рефрешит страницу error_page 502, где красиво написано о том
что сервер недоступен, то общее количество поступающих запросов громадным
образом снижается, и авария постепенно сходит на нет. Так показывает опыт. По
мне, клиент, долбящий frontend гораздо страшнее, чем frontend, ожидающий
медленный backend. Это - экономия ресурсов, а не wasting.
> см. также исходное сообщение треда
> http://www.lexa.ru/nginx-ru/msg25660.html
>
> также как и "Retransmission of lost packets" из TCP протокола
> я предлагаю использовать по его прямому назначению для повторной
> пересылки потерявшихся в пути пакетов. и только лишь для этого.
Предлагайте. Вполне допускаю, что ваш подход тоже может быть полезен для
определенных задач.
> AN> то непонятно, чем пассивная очередь ожидающих установления
> AN> соединений может быть хуже чем такое же количество активных
> AN> соединений до второго backend.
>
> не понял вопрос.
>
> может быть сначала полностью рассмотрим вариант
> когда есть только один backend и только один frontend ?
--
Andrei Nigmatulin
GPG PUB KEY 6449830D
Now I lay me down to sleep(3)
Pray the OS my core to keep
If I die before I wake
Pray the Disk my core to take
|