freebsd+nginx+php-fpm

Gena Makhomed gmm at csdoc.com
Fri Jun 19 15:13:26 MSD 2009


On Thursday, June 18, 2009 at 23:16:44, Andrei Nigmatulin wrote:

>> AN> Тогда оставьте в покое listening queue. Отправлять запрос
>> AN> на резервный backend надо через fastcgi_connect_timeout.

вот этой Вашей рекомендации я не понимаю. вместо тюнинга размера
listening queue вы предлагаете полагаться на tcp retransmissions
и ждать пока frontend устанет долбить перегруженный backend новыми запросами,
что будет только мешать этому backend`у нормально обрабатывать старые запросы.

fastcgi_connect_timeout - это ~ 60 секунд, и вряд-ли клиент дождется
даже первого перехода между backend`ами, не говоря уже об остальных.

переходы между backend`ами по 502-й ошибке будут происходить практически
мгновенно и здесь действительно появляется шанс обработать запрос клиента
на каком-то менее загруженном или резервном backend`е, если изначально
запрос клиента попал на перегруженный обработкой запросов backend.

>> в случае переполнения listening queue, т.е. когда backend понимает,
>> что он уже не в состоянии обработать новые запросы - frontend
>> практически мгновенно получает 502 ошибку от этого backend`а.

>> в предлагаемом Вами варианте - frontend тупо ждет 60 секунд,
>> и только через 60 сек он начинает соображать, что этот backend
>> уже будет не в состоянии обработать этот конкретный новый запрос.

>> честно, - не понимаю, чем предлагаемый Вами вариант лучше.
>> обычно время, которое затрачивается на обработку запросов
>> клиентов стараются уменьшать, а не искуственно увеличивать.

AN> Я подразумеваю, что у нас имеется обычный web сайт, один фронтенд
AN> и несколько backends. Я подразумеваю, что все backends равномерно
AN> загружены запросами и резервных нет. Ну вот не вижу смысла держать
AN> резервные простаивающие backends, правда.

резервные (backup) backend`ы могут быть полезны для сглаживания особенно
больших всплесков, с которыми активные backend`ы уже не могут справиться.

когда всплесков нет - они могут выполнять другие, менее приоритетные задачи.

один из возможных вариантов обработки 502 ошибки - это proxy_cache_use_stale,
рано или поздно аналогичная функциональность появится и в ngx_http_fastcgi_module.

AN> В случае всплесков мне нужно пытаться обслужить клиента до последнего и мне
AN> бесполезна возможность моментально узнать что backend загружен под завязку.

Вы видели хотя бы одного клиента который будет сидеть перед монитором и ждать
ответ от сервера например, 60 секунд ? обычное больше 5-15 секунд не ждут.

AN> Скорее всего, это значит, что остальные backends в похожем состоянии,
AN> и  запросу все равно суждено висеть пока не он обработается или клиент
AN> не устанет ждать. Это все что я могу сделать.
AN> Как мне тут может помочь 502 ошибка ?

502 ошибка может помочь увидеть, что существующие backend`ы
уже не справляются с возрозшей нагрузкой из нормальных клиентов,
и нужно увеличивать их скорость обработки запросов, или же - что сайт
находится под DDoS-атакой и надо лучше фильтровать ботов от пользователей.

есть два подхода - "make it good" и "make it looks good".

например, когда в Python возникает какая-то исключительная ситуация,
он не пытается делать вид, что все хорошо, а выбрасывает exception.

>> когда listening queue у работающего backend`а
>> уже переполнена - новые запросы этим backend`oм
>> обрабатывались бы слишком долго - клиенты столько
>> времени ждать ответа не станут. поэтому - сразу 502.

>> и у frontend`а появляется шанс решить эту проблему.

AN> Как мне на практике использовать этот шанс ?
AN> Как для вышеописанной ситуации мне может помочь 502 ошибка ?

например, добавить backup`ных backend`ов для обработки всплесков.
если действительно, "в случае всплесков нужно обслужить клиента".

...

>> AN> не будет никакого resource wasting.

>> будет в предлагаемом Вами варианте - вместо тюнинга backlog`а
>> надеяться на retransmission из Transmission Control Protocol.

AN> Я не говорю что backlog выставлять не нужно.

"Тогда оставьте в покое listening queue" - это Ваши слова?

AN> Я говорю, что сколько вы не выставляйте, все равно есть ненулевая
AN> вероятность, что в единицу времени может прийти запросов больше,
AN> чем расчитывалось при выставлении backlog.

если размер backlog`а backend`а выставлен адекватно - это означает
что поток запросов больше чем мощность этого backend`а, и эту ситуацию
уже нельзя будет назвать словом "кратковременный всплеск", потому *все*
кратковременные всплески *сглаживаются* с помощью backlog`а backend`а.

>> >> фактически это будет еще одна, достаточно неэффективная,
>> >> listening queue, реализованная внутри frontend`а сервера.
>> >> неэффективная из-за постоянных повторных попыток подключения.

>> AN> Ну поскольку вы предлагаете в качестве альтернативы
>> AN> все избыточные запросы отправлять на второй backend

>> я прежде всего предлагаю не изобретать велосипед с квадратными колесами, -
>> я предлагаю использовать backlog по его прямому назначению, для сглаживания
>> "всплесков (кратковременному, непериодическому увеличению) кол-ва запросов".

AN> А я предлагаю делать безглючные сайты,

подход "make it looks good" или все-таки "make it good" ?

AN> когда я не знаю что делать с 502 ошибкой на фронтенде.

можно придумать что-то интереснее чем полное зависание и ноль реакции.

AN> Если человек видит внизу броузера "Waiting for reply...",
AN> а не рефрешит страницу error_page 502, где красиво написано о том
AN> что сервер недоступен, то общее количество поступающих запросов громадным
AN> образом снижается, и авария постепенно сходит на нет. Так показывает опыт.

так "авария" или "всплеск" ? мы тут вроде бы обсуждали обработку
кратковременных и непериодических всплесков количества запросов.

сглаживанием *всплесков* занимается именно backlog, если его размер
настроен администратором адекватно двум ранее названным параметрам.

насколько я понимаю, frontend`ы проще масштабировать чем backend`ы,
потому что они могут выдержать гораздо большее количество запросов,
да и выдача статики, которая уже лежит в кеше должна быть практически
мгновенной, по сравнению с обработкой тяжелых запросов backend`ами.

по крайней мере, Google не стесняется признаваться пользователям,
что у них проблемы с backend`ами, несколько раз видел на Gmail
их сообщение о 502-й ошибке. и почему-то у меня совсем не было
желания в тот момент сидеть и постоянно рефрешить эту страницу.

тем более, что рефреш страницы www.example.com/502.html
всегда будет возвращать только эту статическую страницу

AN> По мне, клиент, долбящий frontend гораздо страшнее, чем frontend,
AN> ожидающий медленный backend. Это - экономия ресурсов, а не wasting.

и Вы предлагаете сделать frontend долбящий громадным количеством
запросов и так уже перегруженные обработкой запросов backend`ы ?

если у вас что-то постоянно рефрешит страницы - это боты,
а не пользователи. и такая ситуация называется "DDoS-атака",
это совсем не "кратковременный всплеск нормальных запросов".

причина проблемы тогда в том, что не совсем качественно
отфильтровываются DDoS-боты от нормальных пользователей,
и тюнить размер listening queue в этом случае нет смысла,
как и долбить frontend`ом и так уже перегруженные backend`ы.

доводить сервер до состояния, когда все пользователи видят
пустой екран и сообщение браузера "Waiting for reply..."
в статусной строке - это трудно назвать словом "solution".

поможет наверное только Cisco Guard DDoS Mitigation Appliances
или аналогичные програмно-аппаратные решения для защиты от DDoS.

======================================================================

On Thursday, June 18, 2009 at 15:41:37, Andrei Nigmatulin wrote:

AN> при переполнении listening queue в случае unix sockets
AN> клиент будет получать ошибку 502, тогда как tcp поддерживает
AN> retransmission и соответственно, более устойчив к всплескам
AN> (кратковременному, непериодическому увеличению) кол-ва запросов.

======================================================================

скорее всего под словосочетанием "кратковременный всплеск" Вы здесь
подразумеваете фразу "DDoS-атака" или "авария на части backend`ов".

-- 
Best regards,
 Gena






More information about the nginx-ru mailing list