Slide 0
профилированиеЭрливидео
Макс Лапшин
[email protected]
Slide 1
Эрливидео
Потоковое видео
Разные протоколы: MPEG-TS, RTMP, …
Высокая эффективность
Slide 2
Разные нагрузки
Тысячи пар: один источник, один клиент
Один источник, тысячи клиентов
Slide 3
Видео
Один поток: 50 кадров/сек, 500 КБит/с
2000 клиентов — 100 000 кадров/сек.
Суммарно 1 ГБит/с
Slide 4
RTMP
У каждого клиента своё
Каждому клиенту своя копия потока
Данные общие, заголовки разные
Slide 5
RTMP
Скорости не хватает — клиент залипает
Ошибка в тайстемпе — клиент залипает
Клиент залипает — надо что-то делать
Slide 6
Рост эрливидео
Начались проблемы на 800 клиентах
Неверная архитектура
Пришлось профилировать
Slide 7
Профилирование
Девелопмент одно — продакшн другое
Разные версии клиентов
Разные скорости каналов
Разные задержки на каналах
Slide 8
Профилирование
Профилирование на продакшне
Не отключая пользователей
Без деградации системы
Slide 9
Инструменты
Valgrind и профилировщики тормозят систему
gdb вносит искажения в код
Slide 10
Инструменты
Erlang предлагает другие подходы к профилированию
Slide 11
Erlang
Данные и потоки выполнения объединены, как процессы ОС
Обмен асинхронными сообщениями
Message box у каждого процесса
Slide 12
Erlang
Все данные немутабельные
Процесс — рекурсивная функция, вызывающая себя с новым значением
Slide 13
Erlang
Один процесс под каждого клиента
Один процесс под каждый «объект»
Вызовы методов строго последовательны
Slide 14
Lowload
Процесс-«поток» шлет сообщения процессам-«клиентам»
Клиенты упаковывают RTMP сами
в системе FPS*N сообщений
Slide 15
Тормоза
Начинаются «лаги» и «залипание»
Куда смотреть? Что мерять?
Slide 16
Мониторинг
Меряем очереди сообщений
erlang:process_info(Pid,message_queue_len)
Slide 17
Мониторинг
Меряем загрузку CPU
etop:start()
мониторим общую память процессов
Slide 18
Узкие места
В узких местах накапливаются сообщения
Растет CPU, потребляемый процессом
Накапливается память
Slide 19
Узкие места
Процессу не хватает одного ядра
Недообрабатывает сообщения
Накапливается память
Встают в ожидании клиентские процессы
Slide 20
Как боролись?
Уменьшили количество сообщений
Прямая запись в сокет
Распараллелили запись в сокеты по ядрам
Slide 21
Результат
Во много раз увеличили количество одновременных клиентов
Slide 22
Рекомендации
Планировать количество проходящих сообщений
Уменьшать работу внутри вызываемого процесса
Раскладывать работу по процессам — расползутся по ядрам
Slide 23
Выводы
Профилировка приложений на erlang возможен без деградации качества обслуживания
Методы поиска проблем несложны и эффективны
Slide 24
Вопросы?
Макс Лапшин
[email protected]