13. Сервер видеочата
2 тыс. одновременно подключенных клиентов
Два видеопотока ~250 Кбит/сек на клиента
Горизонтальное масштабирование
3 независимых сервера, ~350 Мбит/сек на
сервер, загрузка CPU не больше 25%
14. Сервер трансляций
5 тыс. одновременно подключенных клиентов
Один видеопоток 200-500 Кбит/сек на клиента
Кластер из трёх раздающих серверов и одного
арбитра
Очень неравномерная нагрузка на серверы
15. Характер нагрузки
Нагрузка быстро скачет с одного сервера на
другой.
Трансляций с кол-вом зрителей >100 обычно
не больше 10 штук.
Нужно разносить популярные трансляции по
нескольким серверам.
16. Шторм подключений
Рестарт сервера — реконнект всех клиентов.
Moment отлично справляется с толпой
клиентов, пришедших одновременно.
Реконнект работает хорошо, на это можно
рассчитывать при перебалансировке.
20. Протокол RTMP
Нужен для взаимодействия с Flash
2 уровня: chunk stream и message stream
поддержка RPC
RTMPT — RTMP поверх HTTP
Переусложнён, спецификация неточна
21. Реализация RTMP
~1,5 месяца работы одного разработчика
изучение протокола
реализация
отладка
оптимизация
+ RTMPT
26. Немедленная отправка
При отправке сообщение либо уходит целиком,
либо мы заключаем, что клиент медленный и
начинаем отбрасывать сообщения.
В результате writev работает только в рамках
одного сообщения.
27. Отложенная отправка
За одну операцию чтения в приёмный буфер
может быть считано сразу несколько
сообщений.
Откладываем отправку данных до конца
итерации цикла обработки сообщений.
Отправляем все считанные за итерацию
данные одним writev.
29. mwritev
Простой модуль ядра: /dev/mwritev
Принимает массив наборов параметров для
вызовов writev
Вызывает vfs_writev для каждого набора
параметров
Возвращает массив результатов
30. mwritev
-15% нагрузки на CPU
Это немного. Значит, контекстные
переключения относительно недороги.
Дальнейшая оптимизация снижает эффект от
использования mwritev.
31. Группировка сообщений
Равномерный видеопоток => интервалы между
сообщениями препятствуют группировке.
Тестовый модуль Moment — mod_test.
Генерирует поток сообщений.
rtmptool — имитирует N одновременных
подключений.
33. Группировка сообщений
Задерживаем помещение клиента в очередь
отложенной отправки, если в очереди только
аудио и видео сообщения, и с момента
последней отправки прошло меньше M
миллисекунд.
Т.е. буферизуем поток на сервере, вводим
искуственную задержку.
35. Эксперимент
Добиваемся 100%-й загрузки CPU и
продолжаем увеличивать кол-во подключений.
Видимого ухудшения качества видео при
просмотре не происходит. Немного растёт
задержка (но не превышает 1 сек).
Первые пропуски видео/звука — на 6000
клиентов.
37. Саморазгон сервера
CPU 100% => следующая итерация цикла
обработки сообщений начнётся позже.
На следующей итерации будет доступно
больше данных от источника видео.
В конце итерации мы отправим больше
данных. Т.е размер отправляемой за раз
порции данных вырастет.
38. Саморазгон сервера
Чем больше размер блока данных при
отправке, тем выше производительность
сервера.
Получаем эквивалент динамического
увеличения задержки при отправке в
зависимости от нагрузки на сервер.
Порог в 6000 клиентов согласуется с
эффектом от явной буферизации.
39. Многопоточность
В Moment:
Отдельная блокировка на каждый крупный
объект (мьютекс)
Подсчёт ссылок
- 25% производительности даже с одним
потоком
41. Итог
Архитектура «боевого» видеосервера.
3 тыс. клиентов с одного ядра на low-end
системе (500 Кбит/сек на клиента).
До 6 тыс. клиентов на пике при умеренном
увеличении задержки.
42. http://momentvideo.org
Реализованы все описанные оптимизации.
Умеет всё, что нужно для таких сервисов, как
трансляции, видеочат и им подобные.
Захват видео с камер, видеонаблюдение, запись.
Открытый код. API для плагинов.