Re: Увеличивается RPS и CPS при недоступности бэкэнда

Maxim Dounin mdounin на mdounin.ru
Ср Авг 24 12:37:53 UTC 2016


Hello!

On Wed, Aug 24, 2016 at 02:39:45AM +0300, Иван wrote:

> Здравствуйте!
> 
> У нас цепочка проксей для стриминга видео (плейлисты - m3u8+чанки - ts): эджи 
> от пользователей проксируют на ориджины,ориджины на источники видео (source).
> 
> Почему-то при выпадании (connection timeout) одного из source взлетает rps и 
> cps на соотвествующие ориджины. При высокой нагрузке настолько, что все вообще 
> встает колом.
> 
> nginx 1.10.1 под debian 8 из репов на nginx.org.
> 
> Конфигурация upstream на эджах:
> upstream o-place {
>         server ip4_1:443 fail_timeout=60 max_fails=3 weight=3;
>         server ip6_1:443 fail_timeout=60 max_fails=3 weight=3;
>         server ip4_2:443 fail_timeout=60 max_fails=3 weight=1;
>         server ip6_2:443 fail_timeout=60 max_fails=3 weight=1;
>         server ip4_3:443 fail_timeout=60 max_fails=3 backup;
>         server ip6_3:443 fail_timeout=60 max_fails=3 backup;
>         keepalive 500;
> }
> Каждый ориджин тут задублирован по ИП4 и ИП6 (ip4_1 и ip6_1 - это один и тот 
> же сервер, так же как и ip?_2, так же как и ip?_3), так как иногда между 
> серверами отваливается по отдельности либо IP6, либо IP4.
> 
> У ориджинов в апстримах по одному source:
> upstream source_place {
>         server ip4:443;
>                 keepalive 200;
> }
> 
> На эджах
> proxy_next_upstream error timeout invalid_header http_500 http_502 http_504;

А что конкретно вас удивляет?  Ваша конфигурация именно это и 
предполгает, e.g.:

- выпал source для ресурса, при обращении к соответствующему 
  ресурсу origin не может достучаться до source-сервера и 
  возвращает 502 (или 504, если случился таймаут);

- edge-сервер видит 502 и идёт к следующему серверу в блоке 
  upstream;

- картина повторяется, пока не будут опрошены все сервера по 
  списку, т.е. суммарное количество запросов к origin-серверам для 
  конфигурации выше - вырастет в 4 раза.

Если это не то, что хочется получить - пересмотрите конфигурацию.  
В частности, я бы рекомендовал:

- Проредить proxy_next_upstream.  Если сервера, фактически, 
  одинаковые, то ходить на все при получении 502/504 - имеет очень 
  мало смысла.

- Посмотреть внимательно на proxy_next_upstream_tries (и 
  proxy_next_upstream_timeout), 
  http://nginx.org/r/proxy_next_upstream_tries/ru.  По 
  умолчанию nginx пытается обойти все доступные сервера, однако в 
  сложных конфигурациях это редко является оптимальным поведением.  
  Директива proxy_next_upstream_tries повзволяет сделать 
  ограниченное количество попыток, не отключая proxy_next_upstream 
  совсем.

-- 
Maxim Dounin
http://nginx.org/



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