Top Banner
Оптимизация сервера потокового видеовещания Дмитрий Шатров
42

Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Dec 14, 2014

Download

Documents

Ontico

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Оптимизация сервера

потокового видеовещания

Дмитрий Шатров

Page 2: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Мой Мир@Mail.Ru

трансляции

видеочат

http://momentvideo.org

Page 3: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Трансляции@mail.ru

Page 4: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

В поисковой выдаче

Page 5: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Сервис трансляций

Page 6: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Сервис трансляций

Page 7: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Потоковое видео

Трансляции

Конференции

Видеочат

...и не только

Page 8: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Организация сервиса

Центральный сервер

Мультикаст

P2P

Page 9: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Центральный сервер

сервер

Page 10: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Мультикаст

сервер

Page 11: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

P2P

сервер

Page 12: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Центральный сервер

Основа видеосервиса

сервер

Page 13: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Сервер видеочата

2 тыс. одновременно подключенных клиентов

Два видеопотока ~250 Кбит/сек на клиента

Горизонтальное масштабирование

3 независимых сервера, ~350 Мбит/сек на сервер, загрузка CPU не больше 25%

Page 14: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Сервер трансляций

5 тыс. одновременно подключенных клиентов

Один видеопоток 200-500 Кбит/сек на клиента

Кластер из трёх раздающих серверов и одного арбитра

Очень неравномерная нагрузка на серверы

Page 15: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Характер нагрузки

Нагрузка быстро скачет с одного сервера на другой.

Трансляций с кол-вом зрителей >100 обычно не больше 10 штук.

Нужно разносить популярные трансляции по нескольким серверам.

Page 16: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Шторм подключений

Рестарт сервера — реконнект всех клиентов.

Moment отлично справляется с толпой клиентов, пришедших одновременно.

Реконнект работает хорошо, на это можно рассчитывать при перебалансировке.

Page 17: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

1 ∞

Page 18: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Видеосервер

Бизнес-логика

отдельные сообщения

RTMP

видеопоток

Page 19: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

API

Клиент подключился

Клиент отключился

Запрос на просмотр

Запрос на вещание

RPC

Page 20: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Протокол RTMP

Нужен для взаимодействия с Flash

2 уровня: chunk stream и message stream

поддержка RPC

RTMPT — RTMP поверх HTTP

Переусложнён, спецификация неточна

Page 21: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Реализация RTMP

~1,5 месяца работы одного разработчика

изучение протоколареализацияотладкаоптимизация

+ RTMPT

Page 22: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Принцип работы

event-машина на неблокирующихся сокетах

Page 23: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Получение данных

Page 24: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Отправка данных

Page 25: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Оптимизация

Стараемся максимально эффективно использовать примитивы, предлагаемые ядром.

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

Хотим ускориться в несколько раз.

Page 26: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Немедленная отправка

При отправке сообщение либо уходит целиком,либо мы заключаем, что клиент медленный и начинаем отбрасывать сообщения.

В результате writev работает только в рамках одного сообщения.

Page 27: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Отложенная отправка

За одну операцию чтения в приёмный буфер может быть считано сразу несколько сообщений.

Откладываем отправку данных до конца итерации цикла обработки сообщений.

Отправляем все считанные за итерацию данные одним writev.

Page 28: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

В конце итерации

Page 29: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

mwritev

Простой модуль ядра: /dev/mwritev

Принимает массив наборов параметров для вызовов writev

Вызывает vfs_writev для каждого набора параметров

Возвращает массив результатов

Page 30: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

mwritev

-15% нагрузки на CPU

Это немного. Значит, контекстные переключения относительно недороги.

Дальнейшая оптимизация снижает эффект от использования mwritev.

Page 31: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Группировка сообщений

Равномерный видеопоток => интервалы между сообщениями препятствуют группировке.

Тестовый модуль Moment — mod_test. Генерирует поток сообщений.

rtmptool — имитирует N одновременных подключений.

Page 32: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Группировка сообщений

burst = 3 => производительность x 2.5

Группировать сообщения очень выгодно.

Page 33: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Группировка сообщений

Задерживаем помещение клиента в очередь отложенной отправки, если в очереди только аудио и видео сообщения, и с момента последней отправки прошло меньше M миллисекунд.

Т.е. буферизуем поток на сервере, вводим искуственную задержку.

Page 34: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Эффект от группировки

Видео ~560 Кбит/секPentium 4, 2.8 ГГц (low-end сервер)

задержка 0 мс — 1400 клиентов

задержка 100 мс — 3500 клиентов

задержка 500 мс — 5000 клиентов

Page 35: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Эксперимент

Добиваемся 100%-й загрузки CPU и продолжаем увеличивать кол-во подключений.

Видимого ухудшения качества видео при просмотре не происходит. Немного растёт задержка (но не превышает 1 сек).

Первые пропуски видео/звука — на 6000 клиентов.

Page 36: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

?CPU — 100%

Page 37: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Саморазгон сервера

CPU 100% => следующая итерация цикла обработки сообщений начнётся позже.

На следующей итерации будет доступно больше данных от источника видео.

В конце итерации мы отправим больше данных. Т.е размер отправляемой за раз порции данных вырастет.

Page 38: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Саморазгон сервераЧем больше размер блока данных при отправке, тем выше производительность сервера.

Получаем эквивалент динамического увеличения задержки при отправке в зависимости от нагрузки на сервер.

Порог в 6000 клиентов согласуется с эффектом от явной буферизации.

Page 39: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Многопоточность

В Moment:

Отдельная блокировка на каждый крупныйобъект (мьютекс)

Подсчёт ссылок

- 25% производительности даже с однимпотоком

Page 40: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Многопоточность

Сложно писать

Сложно отлаживать

Сервер медленнее

Но есть свои плюсы

Page 41: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Итог

Архитектура «боевого» видеосервера.

3 тыс. клиентов с одного ядра на low-end системе (500 Кбит/сек на клиента).

До 6 тыс. клиентов на пике при умеренном увеличении задержки.

Page 42: Оптимизация сервера потокового видеовещания (Дмитрий Шатров)

Реализованы все описанные оптимизации.

Умеет всё, что нужно для таких сервисов, как трансляции, видеочат и им подобные.

Захват видео с камер, видеонаблюдение, запись.

Открытый код. API для плагинов.

http://momentvideo.org