Top Banner
Erlang в настоящем продакшне Максим Лапшин Эрливидео [email protected]
29

Максим Лапшин. Erlang production

Jul 27, 2015

Download

Software

Alina Dolgikh
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: Максим Лапшин. Erlang production

Erlang в настоящем продакшне

Максим Лапшин Эрливидео

[email protected]

Page 2: Максим Лапшин. Erlang production

Пишем про ФП, но пишем не на ФП?

Page 3: Максим Лапшин. Erlang production

• Бизнесу нужен продукт, а не софт

• Программистам интересно писать софт

• Нет опыта в продакшне, значит небезопасно делать продукт на таком софте

• Бизнес избегает ФП

• Без коммерческого применения нет опыта

• Замкнутый цикл

Page 4: Максим Лапшин. Erlang production

Опасения бизнеса в непредсказуемости

технологии

Page 5: Максим Лапшин. Erlang production

Эрланг годится для коммерческой разработки!

Page 6: Максим Лапшин. Erlang production

Эрливидео• Высоконагруженный видеостриминговый сервер

(10 ГБит/с без проблем)

• 5 лет разработки и успешной продажи ПО

• Беспроблемный найм людей

• Очень мало критичных багов (и те в C)

• Крайне быстрая разработка

• Без эрланга мы бы не справились!

Page 7: Максим Лапшин. Erlang production

Эрланг в продакшне

• Надежно

• Дешево

• Предсказуемо

• Имеет смысл использовать для коммерческого софта

Page 8: Максим Лапшин. Erlang production

Продакшн познается через год

• Софт дорастает до использования живыми пользователями

• Начинается поддержка старого кода

• Приходят новые программисты, перед которыми стыдно за исходники

• Пользователи создают нагрузку

Page 9: Максим Лапшин. Erlang production

Проблемы эксплуатации

• Работа со своим и чужим кодом

• Работа с багами на недевелоперских серверах

• Поведение под нагрузкой

Page 10: Максим Лапшин. Erlang production

Поддержка старого кода

• Через год даже свой код уже не вспомнить

• Автора кода не достать, он пошел на IPO

• Статической типизации в эрланге нет

Page 11: Максим Лапшин. Erlang production

Реалии старого кода

• Код 10-летней давности запускается и работает

• Очень сильная обратная совместимость между версиями VM

• Немутабельность сильно помогает отладке

• Не-OTP код — зло, OTP код — хорошо

Page 12: Максим Лапшин. Erlang production

Старый код в Эрливидео

• Есть куски кода, которым по 5 лет

• Иногда проводятся массовые рефакторинги

• Интеграционные тесты помогают, юнит-тесты нет

Page 13: Максим Лапшин. Erlang production

Борьба с багами• 95% падений рантайма — нехватка памяти

• Нехватка памяти почти всегда — нехватка контроля за пайплайном данных

• Остальное лечится чтением стектрейсов сверху вниз, потому что let it fail

• Если пишем хорошо, то ошибки изолируются по процессам

Page 14: Максим Лапшин. Erlang production

Алгоритмы багфикса• По нажатию кнопки «загрузить логи», система сама пакует всё

• Пользователи всегда вырезают самое интересное из логов, их логи мы не читаем

• Изучаем стектрейсы и периодический дамп самых прожорливых процессов

• Пытаемся восстановить ситуацию у себя. Если не можем, идем на сервер заказчика

Page 15: Максим Лапшин. Erlang production

Авральные работы на сервере

• recon, htop в помощь что бы понять, какой ресурс сожран

• to_erl дает больший контроль, чем другие варианты (remsh и ssh)

• erlang:processes() что бы найти самого обжору

• ищем причину утечки памяти и/или тормозов

• непроходимость в пайплайне данных -> утечка памяти

Page 16: Максим Лапшин. Erlang production

Интроспекция• supervisor:which_children/1 для обхода структуры

• sys:get_state/1 что бы добраться до нутра

• lager:pr/2 для изучения состояния

• lager:md/1 для тегирования логов

• самодельные хелперы: ems_debug:top(binary)

Page 17: Максим Лапшин. Erlang production

Само-мониторинг

• На сервера не набегаешься

• Система должна сама себя мониторить

• Поиск источника багов

• Поиск потенциальных тормозов (для highload)

Page 18: Максим Лапшин. Erlang production

Мониторинги• Потребление памяти (раз в 10 секунд)

• Мониторинг длин очередей

• Мониторинг размера ets таблиц

• Внутренние очереди

• Контроль за тем, что данные втекают не быстрее, чем вытекают

Page 19: Максим Лапшин. Erlang production

Capacity control• Что бы не лопнуть, надо уметь отказываться

• Поиск утечек памяти и багов показывает бутылочные горлышки

• Узкие места должны сообщать о собственной загрузке

• Без обратного контроля можно быстро, но недолго

Page 20: Максим Лапшин. Erlang production

Работа под нагрузкой• Эрланг — одна из нескольких multicore платформ

• Можно получить линейное ускорение по ядрам

• Интроспекция на живом продакшне под полной нагрузкой

• Как всё не затормозить?

Page 21: Максим Лапшин. Erlang production

Шаги на пути к Highload

• Развязывание узких мест: одно ядро не может, а 10 смогут

• Ускорение линейного кода

• Перенос данных в память

Page 22: Максим Лапшин. Erlang production

Развязывание узких мест• Singleton это узкое место, потому что одно ядро

• gen_server:call сам по себе не спасает

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

• Способы: пулы, шардирование, ets

• ETS — это очень быстро и эффективно

Page 23: Максим Лапшин. Erlang production

Примеры распараллеливания

• У одного открытого файла пул процессов, читающих с диска

• В comet сервере шардинг процессов мониторинга по hash(channel_id) % pool_size

• Подписка через ets типа bag: по ключу много значений сразу

Page 24: Максим Лапшин. Erlang production

Профилирование• Возможность профилировать отдельный процесс

• В эрланге оно всё так себе

• Анализ стектрейсов

• Тайминги в заголовках HTTP ответов

• Не особо много хитростей

Page 25: Максим Лапшин. Erlang production

ETS для памяти• In-memory database

• Великолепно масштабируется на 40-70 ядер

• Прекрасно годится для отдачи готовых данных

• Рекомендуется вместе с zerocopy протоколами

• Вторичные индексы руками

Page 26: Максим Лапшин. Erlang production

Примеры в Эрливидео

• Раздача live потоков: данные готовятся заранее, укладываются в ets таблицы. 20 Гбит/с без надрыва

• Стриминг файлов с диска: пляски с бубном и 10-15 Гбит/с можно

Page 27: Максим Лапшин. Erlang production

Архитектура стриминга с диска

• В линуксе синхронное чтение с диска, тред на запрос.

• Держим 50 или 1000 одновременных запросов к диску

• Процесс файла — арбитр между динамическим пулом процессов ридеров

• Ридеры идут в лимитированную очередь с таймаутом: N одновременных запросов и M в ожидании

• Мониторинг загрузки диска и времени чтения

• Спасибо POSIX API

Page 28: Максим Лапшин. Erlang production

Продакшн

• Писать код на Эрланге интересно

• Возможно устранять баги в бою

• Можно поддерживать старый код и жить с ним

• Можно делать крайне производительный код, притом очень быстро

Page 29: Максим Лапшин. Erlang production

Вопросы?Максим Лапшин [email protected]