30 мая состоялся большой съезд всех питерских айтишных митапов (регулярно встречающихся групп по той или иной IT теме). Наш ГИ (Главный Инженер) представлял там митап DevOps-40, который родился с участием нашей компании. Презентация была посвящена языку Perl и нашим двум крупным клиентам, которые используют приложения на нем в production…
Report
Share
Report
Share
1 of 41
Download to read offline
More Related Content
Perl, и с чем его едят. Доклад нашего Главного Инженера (ГИ) Александра Чистякова
1. У меня тоже есть
свой modern Perl
Нет ни одного пути не сделать это
Александр Чистяков,
главный инженер Git in Sky,
2014
2. Сверим часы
§ > 2014-й
§ > Perl
У меня тоже есть свой modern Perl. 2014
3. Пожалуйста, не расходитесь!
§ Предыдущий слайд не полностью
отражает мой опыт
§ Да, Perl сломан, и его нельзя починить
(см. http://goo.gl/O7OS1X )
§ Однажды мы проехали 2600 километров
на минивэне с вырванной стойкой - “сломан”
не означает “не может передвигаться”
§ Кстати, мой ноутбук сломан :(
У меня тоже есть свой modern Perl. 2014
4. В чем плюсы Perl
§ Perl-разработчика не удивишь ездой с
вырванной стойкой (впрочем, большинство
языков на “P” такие)
§ Perl-разработчика легко найти — они все
поименно занесены в Красную книгу
§ У некоторых заказчиков сформирована
защитно-подсознательная травматическая
связь с Perl
У меня тоже есть свой modern Perl. 2014
5. Прекратите смеяться, вы не в цирке!
§ Как во все это ввязался я:
§ Деньги
§ Челлендж
§ Если не я, то кто?
§ Если я не умею эксплуатировать
продукты на Perl, что я тогда вообще умею?
У меня тоже есть свой modern Perl. 2014
6. Куда именно я ввязался
§ Setup.ru:
§ Конструктор сайтов
§ Моя роль — инженер по эксплуатации
§ AdCamp:
§ Мобильная рекламная сеть
§ Моя роль — релиз-инженер, разработчик
У меня тоже есть свой modern Perl. 2014
7. В дальнейшем роли перемешались
§ Мое глубокое убеждение:
§ Невозможно эффективно эксплуатировать
проект, не принимая участия в его
разработке
§ И наоборот
У меня тоже есть свой modern Perl. 2014
8. Традиционно приписываемые Perl проблемы
§ Perl сложно читать и понимать
§ Perl «глючит и тормозит»
§ ^ Леха, мы помним!
§ Perl сдох
§ (В качестве фокус-группы были использованы
участники элитного(tm) чата)
У меня тоже есть свой modern Perl. 2014
9. Начну со второго проекта
§ Мобильная рекламная сеть
§ Оказывается, показ рекламы — достаточно сложная задача:
§ Запутанные бизнес-правила
§ Интеграция с контрагентами, которые сами не знают,
чего хотят
§ Необходимость релизиться часто и быстро
§ Highload, что бы это ни значило
У меня тоже есть свой modern Perl. 2014
10. Взгляд разработчика, мнимые проблемы
§ Perl легко читать, если его писала не обезьяна
§ К несчастью, многие Perl-программисты считают своим
долгом использовать какие-нибудь свои коронные вещи,
понятные только им
§ К счастью, modern Perl это не мертвый верблюд,
а живые лоси, мыши и другие обитатели леса!
У меня тоже есть свой modern Perl. 2014
11. Modern Perl
§ Moose и производные:
§ Всё то, что было в нормальных
ОО языках еще 10+ лет назад, и
чего нет в ядре языка до сих пор
§ Миксины («роли»), method modifiers,
проперти, и т.п.
У меня тоже есть свой modern Perl. 2014
12. Проблемы становятся локальнее
§ Лично я быстро теряю контекст в ОО системах
на “скриптовых” (динамически типизированных)
языках (хочу, чтобы все было в одном файле)
§ ^ Потому что пишу в ViM
§ Кроме того, я помню, что объект в Perl — это просто
blessed hash, и все время нарушаю инкапсуляцию
У меня тоже есть свой modern Perl. 2014
13. Новые вызовы для modern Perl-разработчика
§ Highload -> C10K problem
§ Кроме того, seasoned Perl developer'ам нравится решать
сложные, как им кажется, задачи
§ Под сложными задачами они понимают погружение в
callback hell (Brooks is rolling in his grave and he is not even
dead yet!)
§ К счастью, есть AnyEvent
У меня тоже есть свой modern Perl. 2014
14. AnyEvent
§ Позволяет погрузиться в callback hell
совершенно незаметным для разработчика
образом
§ Код отлично пишется и читается
§ Разработчик ничего не подозревает
до выхода своего шедевра в продакшн
У меня тоже есть свой modern Perl. 2014
15. Взгляд эксплуатационщика
§ Выход в продакшн:
§ Сервисы втыкают
§ Все бегают и орут
§ Никто не знает, что происходит
§ Спокойно, сейчас всё будет!
§ Нужно просто сделать профайлинг!
У меня тоже есть свой modern Perl. 2014
16. Как сделать профайлинг
§ Старый добрый PMP:
§ http://poormansprofiler.org/
§ По сути, старый добрый gdb + обертка на
shell
§ (Почти) универсальный
cэмплирующий профайлер
У меня тоже есть свой modern Perl. 2014
17. Чего же мы ждем?
§ Собрали сэмплы, проанализировали
§ Виновник найден, вот он:
§ Perl_runops_standard
§ Здесь приложение проводит больше
всего времени
§ Этот вызов просто выполняет все
перловые опкоды ;(
У меня тоже есть свой modern Perl. 2014
18. Переходим к плану Б, он ведь есть?
§ Даже в такой старой экосистеме, как Java/JVM,
есть сэмплирующий профайлер
§ Неужели в modern Perl его нет?
§ СЮРПРИИИЗ!
§ Мы соберем свой собственный, используя
схему из журнала “Радио”
У меня тоже есть свой modern Perl. 2014
19. Профайлер своими руками
§ Нам понадобятся:
§ Активные датчики
§ Агрегатор
§ Коллектор/хранилище
§ Что-то, что рисует графики
§ Дэшборд
У меня тоже есть свой modern Perl. 2014
20. StatsD/Graphite
§ Ничего изобретать не придется:
§ StatsD — простой протокол обмена телеметрической
информацией
§ Клиенты и серверы на любом языке, в том числе на Perl
и C (кстати, он сейчас сломан, я засабмитил патч)
§ Graphite — RRD-like хранилище + инфраструктура для
рисования графиков
У меня тоже есть свой modern Perl. 2014
21. Дэшборд
§ Раньше я всегда использовал GDash (он хорошо скриптуется)
§ Потом мне показали Grafana (спасибо, Андрюха!)
§ Grafana вообще не скриптуется, но отлично конфигурируется
вручную прямо через веб
§ Оказалось, что типичный шаблон работы с графиками в
сложном проекте предполагает довольно частые
переконфигурирования — скриптовать долго
У меня тоже есть свой modern Perl. 2014
22. Промежуточный итог
§ В код относительно небольшой кровью
внедрены таймеры
§ Теперь на продакшн есть красивые
графики зависимости времени
исполнения запроса от времени
§ Виновный найден и призван к порядку
У меня тоже есть свой modern Perl. 2014
23. Не очень-то призрачная угроза
§ Сложная бизнес-логика порождает ошибки*
§ *коллеги-программисты, конечно же, а вовсе
не логика, но чем сложнее логика, тем
больше ошибок
§ Шокирующее открытие: логи никто не читает!
§ Лог-коллектор? Серьезно?
У меня тоже есть свой modern Perl. 2014
24. Давайте подумаем
§ Мы правда хотим из приложения писать плохо
структурированную информацию в файл,
потом разбивать этот файл на строки,
пересылать их для анализа куда-то (где их,
возможно, не примут из-за C10K+ problem),
разбирать их там централизованно и там
же искать корреляции?
§ youaredoingitwrong.jpg
У меня тоже есть свой modern Perl. 2014
25. Как же быть?
§ Ошибки надо классифицировать по месту их
появления
§ Хорошая классификация ошибок — залог
правильной интепретации результата
§ Например:
§ rotator.total.errors.log_fatal_calls.rotator11-test-11081
§ сервис-тип_ошибки-сервер-порт
У меня тоже есть свой modern Perl. 2014
27. Callback hell strikes back
§ Odd number of hash elements in <some unknown
module> at <some unknown string>
§ Сначала у этих загадочных надписей даже не было
стектрейса! (а это похуже, чем вырванная вилка)
§ На предложение включить стектрейс коллеги-
разработчики сказал, что Carp::Always течет!
§ (Забегая вперед — стектрейс не поможет)
У меня тоже есть свой modern Perl. 2014
28. Нам срочно нужен хороший memory profiler!
§ Требования:
§ Работать в production окружении
§ Ладно, хотя бы в 1/10 production окружения
§ Кстати, про 1/10 production окружения:
§ Отогнать 10% трафика со staging на production путем
зеркалирования было отличной идеей
У меня тоже есть свой modern Perl. 2014
29. And we need to go deeper
§ Извините, я все время отвлекаюсь
§ Как отзеркалировать 10% трафика с продакшна в
стейджинг?
§ emproxy и аналоги — стильно, модно, молодежно!
§ Старый добрый nginx!
§ Wait...what?
У меня тоже есть свой modern Perl. 2014
30. Как это делается в nginx
§ Способ придуман коллегой @yavorovich_da,
инженером по эксплуатации AdCamp
§ В nginx заводится отдельный апстрим, на который
направляется 10% трафика
§ Этот апстрим всегда отвечает 503 с минимальным
таймаутом, при этом проксируя запрос на staging
§ Боевой прокси, получая 503, идет к боевому сервису
У меня тоже есть свой modern Perl. 2014
31. Окей, теперь у нас есть тестовая площадка
§ Вернемся к memory profiler
§ Где же он, где?
§ Подозреваю, что в случае Perl — там же, где и
сэмплирующий профайлер, а значит, ответ мы
уже знаем
§ Ответ — StatsD
У меня тоже есть свой modern Perl. 2014
32. Самолет своими руками
§ Нам понадобятся:
§ perlbrew (по-вашему это будет RVM)
§ Исходники Perl
§ statsd-c-client (мой патч, кстати, принят)
§ Небольшие изменения в аллокаторе Perl
У меня тоже есть свой modern Perl. 2014
33. Итого
§ http://goo.gl/FJqAhG
§ Не многопоточное
§ Места расстановки датчиков подобраны
экспериментально методом
“работает-не трогай”
§ Но оно работает!
У меня тоже есть свой modern Perl. 2014
35. Некоторые случайные факты
§ StatsD-сервис придется устаовить на той же машине,
совершенно незачем гонять 10-20 тысяч событий
в секунду по сети
§ Реализация стектрейсов, используемая в AnyEvent,
никуда не течет (в комментариях к ней как раз
ругают Carp::Always)
§ Управление памятью в Perl — оно какое-то эээ...
У меня тоже есть свой modern Perl. 2014
36. Окей, включили стектрейсы
§ Вы помните, про callback hell, да?
§ У нас в системе появляются неучтенные ошибки,
которые валятся в логи, который никто не читает
§ Стектрейс при этом не говорит ни о чем
§ Предупрежден — значит вооружен
§ Выход: кастомный appender для Log4Perl, который
репортит счетчик строчек в StatsD
У меня тоже есть свой modern Perl. 2014
37. Кажется, деплоймент под контролем
§ Кстати, а как в Perl следить за сервисами?
§ В Perl есть ubic
§ Это такой bluepill (почти), но на Perl
§ Что сделает ubic, если сервис умер?
§ Через заданное время периодический
процесс форкнет еще один процесс, который
стартует всех мертвецов (WTF?)
У меня тоже есть свой modern Perl. 2014
38. Синхронная модель vs асинхронная модель
§ У меня есть опыт переписывания сервиса отдачи
файлов с синхронной модели на асинхронную
§ Лейтенси ВОЗРОСЛА (не верьте тем, кто говорит
что асинхронная модель БЫСТРЕЕ)
§ Зато существенно упало потребление памяти
§ И я стал контролировать все стадии процесса
(попробуйте в mod_perl вернуть из хэндлера
неожиданный результат — будет смешно)
У меня тоже есть свой modern Perl. 2014
39. Выводы:
§ Мой modern Perl — это не только модули с
CPAN и модные фреймворки
§ Но еще и молоток, при помощи которого
можно заставить работать
§ Любое достаточно крупное животное
У меня тоже есть свой modern Perl. 2014
41. С вами был Александр Чистяков,
главный инженер Git in Sky
alex@gitinsky.com
http://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за внимание!
http://devconf.ru/offers/ - ПРОГОЛОСУЙТЕ, ПОЖАЛУЙСТА,
ЗА МОИ ЗАЯВКИ!