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