Почему стрим начинает тормозить?

Приветствую, встала задача разработать сервер для онлайн вещания (стрим), погуглив нашел решение nginx-rtmp-module, он работает стабильно, проблем с ним не возникает, проблема в другом.
И так есть HLS стрим через OBS и сервер, где все это работает и раздается, вот nginx config.
Возникает проблема при большом количестве подключенных к стриму, если в ситуации, когда стрим смотрит пару десяток пользователей, .ts файлы отдаются примерно за 200-300мс, а в случае если к серверу подключается 500-1000 пользователей, то уже отдача растягивается от 5 секунд до 20 секунд

Я подумал, что проблема в нехватке ширины канала, каждый файл .ts весит около 2мб, вообщем создал кучу серверов вот с таким конфигом nginx:
nginx.conf
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=pagecache:50m inactive=50m max_size=1G;

default:
proxy_cache_valid 200 301 302 304 5m;
  proxy_cache_key "$request_uri";
  proxy_hide_header "Set-Cookie";
  proxy_ignore_headers "Cache-Control" "Expires";
  proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504;
  proxy_cache	pagecache;

location ~ \.ts$ {
    proxy_pass              http://сервер-стрима;
		proxy_set_header        Host             $host;
		proxy_set_header        X-Real-IP        $remote_addr;
    proxy_buffering on;

    add_header X-Cache-Status $upstream_cache_status;
    add_header X-Cache-Key $request_uri;
  }

А на клиенте уже рандомно обращаемся к одному из кеш серверу
в такой ситуации увеличивается способность стрима работать с большим количеством пользователей, но и это работает до определенного количества пользователей, например 5 тыс пользователей

Дальше еще возникает проблема с отдачей плейлиста .m3u8 файла, так как в него вносятся новые .ts файлы он должен отдаваться непосредственно из стрим сервера, то его нельзя кешировать и при большом количество пользователей его отдача с 40мс увеличиваетсч до нескольких секунд.

Прошу помочь с созданием правильной структуры серверов и кэширования, сервера поднимаю в vscale.io

Хочу заметить, что идеально работает если использовать cloudflare и настроить page rules на полное кеширование .ts файлов (cache-level: cache everything), но через некоторое время cloudflare отключает от зоны, так как видимо не разрешает на бесплатном тарифе или вообще кеширование .ts файлов, если это решается с помощью cloudflare, это было бы удобнее, другая фирма поднимает похожий стрим и они используют cloudflare, но почему то у нас не работает.

До этого использовал aws cloudfront, работает не стабильно и стоит очень дорого, стрим может идти 2 часа и выгоднее просто временно поднять кучу серверов из бэкапа на каком нибудь облачном сервисе и заплатить очень малые деньги

Вообщем подскажите пожалуйста, как решить проблему с зависанием стрима, с помощью nginx или cloudflare
  • Вопрос задан
  • 773 просмотра
Пригласить эксперта
Ответы на вопрос 1
@rogat1y
Дальше еще возникает проблема с отдачей плейлиста .m3u8 файла, так как в него вносятся новые .ts файлы он должен отдаваться непосредственно из стрим сервера, то его нельзя кешировать

m3u8 кешировать можно.
Мастер плейлист можно закешировать, например, на минуту - количество вариантов(качеств) не меняется часто.
Плейлист с ts(чанклист) можно закешировать на длинну чанка - если чанки 10 секунд, то спокойно кешируй их на 10 секунд.

Можно перед nginx с ртмп модулем поставить кеширующий фронт(с включенным cache_lock), кеш на рамдиск, чанки кешировать, время кеширования зависит от размера чанклиста.

Почему параметр hls_fragment выбран 2 и 3 секунды?
Советую сделать 5.

Как реализовано вот это?
А на клиенте уже рандомно обращаемся к одному из кеш серверу


В целом вполне рабочая схема для http стриминга это:
пакетайзер(с твоём случае nginx-rtmp)
2 сервера origin-shield - для отказоустойчивости и защитить пакетайзер от большого количества запросов
N серверов edge
Мы у себя с одного эжда 10гигабит раздаём(дальше канала не хватает)...
Максимум получалось что выжать с них - 40гигабит, но это только внутри своей сети, наружу таких каналов нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы