Мой modern Perl (весенняя встреча Piter United)

41
У меня тоже есть свой modern Perl Нет ни одного пути не сделать это Александр Чистяков, главный инженер Git in Sky, 2014

description

Мой доклад про разработку на Perl и эксплуатацию разработанного с Piter United Q2 2014

Transcript of Мой modern Perl (весенняя встреча Piter United)

Page 1: Мой modern Perl (весенняя встреча Piter United)

У меня тоже естьсвой modern Perl

Нет ни одного пути не сделать это

Александр Чистяков, главный инженер Git in Sky,

2014

Page 2: Мой modern Perl (весенняя встреча Piter United)

Сверим часы

§ > 2014-й§ > Perl

У меня тоже есть свой modern Perl. 2014

Page 3: Мой modern Perl (весенняя встреча Piter United)

Пожалуйста, не расходитесь!

§ Предыдущий слайд не полностьюотражает мой опыт

§ Да, Perl сломан, и его нельзя починить(см. http://goo.gl/O7OS1X )

§ Однажды мы проехали 2600 километровна минивэне с вырванной стойкой - “сломан”не означает “не может передвигаться”

§ Кстати, мой ноутбук сломан :(

У меня тоже есть свой modern Perl. 2014

Page 4: Мой modern Perl (весенняя встреча Piter United)

В чем плюсы Perl

§ Perl-разработчика не удивишь ездой свырванной стойкой (впрочем, большинствоязыков на “P” такие)

§ Perl-разработчика легко найти — они всепоименно занесены в Красную книгу

§ У некоторых заказчиков сформированазащитно-подсознательная травматическаясвязь с Perl

У меня тоже есть свой modern Perl. 2014

Page 5: Мой modern Perl (весенняя встреча Piter United)

Прекратите смеяться, вы не в цирке!

§ Как во все это ввязался я:§ Деньги§ Челлендж§ Если не я, то кто?§ Если я не умею эксплуатировать

продукты на Perl, что я тогда вообще умею?

У меня тоже есть свой modern Perl. 2014

Page 6: Мой modern Perl (весенняя встреча Piter United)

Куда именно я ввязался

§ Setup.ru:§ Конструктор сайтов§ Моя роль — инженер по эксплуатации

§ AdCamp:

§ Мобильная рекламная сеть§ Моя роль — релиз-инженер, разработчик

У меня тоже есть свой modern Perl. 2014

Page 7: Мой modern Perl (весенняя встреча Piter United)

В дальнейшем роли перемешались

§ Мое глубокое убеждение:§ Невозможно эффективно эксплуатировать

проект, не принимая участия в его

разработке§ И наоборот

У меня тоже есть свой modern Perl. 2014

Page 8: Мой modern Perl (весенняя встреча Piter United)

Традиционно приписываемые Perl проблемы

§ Perl сложно читать и понимать§ Perl «глючит и тормозит»§ ^ Леха, мы помним!§ Perl сдох§ (В качестве фокус-группы были использованы

участники элитного(tm) чата)

У меня тоже есть свой modern Perl. 2014

Page 9: Мой modern Perl (весенняя встреча Piter United)

Начну со второго проекта

§ Мобильная рекламная сеть§ Оказывается, показ рекламы — достаточно сложная задача:

§ Запутанные бизнес-правила§ Интеграция с контрагентами, которые сами не знают,

чего хотят§ Необходимость релизиться часто и быстро§ Highload, что бы это ни значило

У меня тоже есть свой modern Perl. 2014

Page 10: Мой modern Perl (весенняя встреча Piter United)

Взгляд разработчика, мнимые проблемы

§ Perl легко читать, если его писала не обезьяна§ К несчастью, многие Perl-программисты считают своим

долгом использовать какие-нибудь свои коронные вещи, понятные только им

§ К счастью, modern Perl это не мертвый верблюд,

а живые лоси, мыши и другие обитатели леса!

У меня тоже есть свой modern Perl. 2014

Page 11: Мой modern Perl (весенняя встреча Piter United)

Modern Perl

§ Moose и производные:§ Всё то, что было в нормальных

ОО языках еще 10+ лет назад, и

чего нет в ядре языка до сих пор§ Миксины («роли»), method modifiers,

проперти, и т.п.

У меня тоже есть свой modern Perl. 2014

Page 12: Мой modern Perl (весенняя встреча Piter United)

Проблемы становятся локальнее

§ Лично я быстро теряю контекст в ОО системах

на “скриптовых” (динамически типизированных)

языках (хочу, чтобы все было в одном файле)§ ^ Потому что пишу в ViM§ Кроме того, я помню, что объект в Perl — это просто

blessed hash, и все время нарушаю инкапсуляцию

У меня тоже есть свой modern Perl. 2014

Page 13: Мой modern Perl (весенняя встреча Piter United)

Новые вызовы для 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

Page 14: Мой modern Perl (весенняя встреча Piter United)

AnyEvent

§ Позволяет погрузиться в callback hell

совершенно незаметным для разработчика

образом§ Код отлично пишется и читается§ Разработчик ничего не подозревает

до выхода своего шедевра в продакшн

У меня тоже есть свой modern Perl. 2014

Page 15: Мой modern Perl (весенняя встреча Piter United)

Взгляд эксплуатационщика

§ Выход в продакшн:§ Сервисы втыкают§ Все бегают и орут§ Никто не знает, что происходит

§ Спокойно, сейчас всё будет!

§ Нужно просто сделать профайлинг!

У меня тоже есть свой modern Perl. 2014

Page 16: Мой modern Perl (весенняя встреча Piter United)

Как сделать профайлинг

§ Старый добрый PMP:§ http://poormansprofiler.org/§ По сути, старый добрый gdb + обертка на

shell§ (Почти) универсальный

cэмплирующий профайлер

У меня тоже есть свой modern Perl. 2014

Page 17: Мой modern Perl (весенняя встреча Piter United)

Чего же мы ждем?

§ Собрали сэмплы, проанализировали§ Виновник найден, вот он:§ Perl_runops_standard§ Здесь приложение проводит больше

всего времени§ Этот вызов просто выполняет все

перловые опкоды ;(

У меня тоже есть свой modern Perl. 2014

Page 18: Мой modern Perl (весенняя встреча Piter United)

Переходим к плану Б, он ведь есть?

§ Даже в такой старой экосистеме, как Java/JVM,

есть сэмплирующий профайлер§ Неужели в modern Perl его нет?§ СЮРПРИИИЗ!§ Мы соберем свой собственный, используя

схему из журнала “Радио”

У меня тоже есть свой modern Perl. 2014

Page 19: Мой modern Perl (весенняя встреча Piter United)

Профайлер своими руками

§ Нам понадобятся:§ Активные датчики§ Агрегатор§ Коллектор/хранилище§ Что-то, что рисует графики§ Дэшборд

У меня тоже есть свой modern Perl. 2014

Page 20: Мой modern Perl (весенняя встреча Piter United)

StatsD/Graphite

§ Ничего изобретать не придется:§ StatsD — простой протокол обмена телеметрической

информацией§ Клиенты и серверы на любом языке, в том числе на Perl

и C (кстати, он сейчас сломан, я засабмитил патч)§ Graphite — RRD-like хранилище + инфраструктура для

рисования графиков

У меня тоже есть свой modern Perl. 2014

Page 21: Мой modern Perl (весенняя встреча Piter United)

Дэшборд

§ Раньше я всегда использовал GDash (он хорошо скриптуется)§ Потом мне показали Grafana (спасибо, Андрюха!)§ Grafana вообще не скриптуется, но отлично конфигурируется

вручную прямо через веб§ Оказалось, что типичный шаблон работы с графиками в

сложном проекте предполагает довольно частые переконфигурирования — скриптовать долго

У меня тоже есть свой modern Perl. 2014

Page 22: Мой modern Perl (весенняя встреча Piter United)

Промежуточный итог

§ В код относительно небольшой кровью внедрены таймеры

§ Теперь на продакшн есть красивые графики зависимости времени исполнения запроса от времени

§ Виновный найден и призван к порядку

У меня тоже есть свой modern Perl. 2014

Page 23: Мой modern Perl (весенняя встреча Piter United)

Не очень-то призрачная угроза

§ Сложная бизнес-логика порождает ошибки*§ *коллеги-программисты, конечно же, а вовсе

не логика, но чем сложнее логика, тем больше ошибок

§ Шокирующее открытие: логи никто не читает!§ Лог-коллектор? Серьезно?

У меня тоже есть свой modern Perl. 2014

Page 24: Мой modern Perl (весенняя встреча Piter United)

Давайте подумаем

§ Мы правда хотим из приложения писать плохо структурированную информацию в файл, потом разбивать этот файл на строки, пересылать их для анализа куда-то (где их, возможно, не примут из-за C10K+ problem), разбирать их там централизованно и там же искать корреляции?

§ youaredoingitwrong.jpg

У меня тоже есть свой modern Perl. 2014

Page 25: Мой modern Perl (весенняя встреча Piter United)

Как же быть?

§ Ошибки надо классифицировать по месту их появления

§ Хорошая классификация ошибок — залог правильной интепретации результата

§ Например:§ rotator.total.errors.log_fatal_calls.rotator11-test-11081§ сервис-тип_ошибки-сервер-порт

У меня тоже есть свой modern Perl. 2014

Page 26: Мой modern Perl (весенняя встреча Piter United)

Ура, счастье!

У меня тоже есть свой modern Perl. 2014

Page 27: Мой modern Perl (весенняя встреча Piter United)

Callback hell strikes back

§ Odd number of hash elements in <some unknown module> at <some unknown string>

§ Сначала у этих загадочных надписей даже не было стектрейса! (а это похуже, чем вырванная вилка)

§ На предложение включить стектрейс коллеги-разработчики сказал, что Carp::Always течет!

§ (Забегая вперед — стектрейс не поможет)

У меня тоже есть свой modern Perl. 2014

Page 28: Мой modern Perl (весенняя встреча Piter United)

Нам срочно нужен хороший memory profiler!

§ Требования:§ Работать в production окружении§ Ладно, хотя бы в 1/10 production окружения§ Кстати, про 1/10 production окружения:§ Отогнать 10% трафика со staging на production путем

зеркалирования было отличной идеей

У меня тоже есть свой modern Perl. 2014

Page 29: Мой modern Perl (весенняя встреча Piter United)

And we need to go deeper

§ Извините, я все время отвлекаюсь§ Как отзеркалировать 10% трафика с продакшна в

стейджинг?§ emproxy и аналоги — стильно, модно, молодежно!§ Старый добрый nginx!§ Wait...what?

У меня тоже есть свой modern Perl. 2014

Page 30: Мой modern Perl (весенняя встреча Piter United)

Как это делается в nginx

§ Способ придуман коллегой @yavorovich_da, инженером по эксплуатации AdCamp

§ В nginx заводится отдельный апстрим, на который направляется 10% трафика

§ Этот апстрим всегда отвечает 503 с минимальным таймаутом, при этом проксируя запрос на staging

§ Боевой прокси, получая 503, идет к боевому сервису

У меня тоже есть свой modern Perl. 2014

Page 31: Мой modern Perl (весенняя встреча Piter United)

Окей, теперь у нас есть тестовая площадка

§ Вернемся к memory profiler§ Где же он, где?§ Подозреваю, что в случае Perl — там же, где и

сэмплирующий профайлер, а значит, ответ мы уже знаем

§ Ответ — StatsD

У меня тоже есть свой modern Perl. 2014

Page 32: Мой modern Perl (весенняя встреча Piter United)

Самолет своими руками

§ Нам понадобятся:§ perlbrew (по-вашему это будет RVM)§ Исходники Perl§ statsd-c-client (мой патч, кстати, принят)§ Небольшие изменения в аллокаторе Perl

У меня тоже есть свой modern Perl. 2014

Page 33: Мой modern Perl (весенняя встреча Piter United)

Итого

§ http://goo.gl/FJqAhG§ Не многопоточное§ Места расстановки датчиков подобраны

экспериментально методом “работает-не трогай”

§ Но оно работает!

У меня тоже есть свой modern Perl. 2014

Page 34: Мой modern Perl (весенняя встреча Piter United)

Краса и гордость

У меня тоже есть свой modern Perl. 2014

Page 35: Мой modern Perl (весенняя встреча Piter United)

Некоторые случайные факты

§ StatsD-сервис придется устаовить на той же машине, совершенно незачем гонять 10-20 тысяч событий в секунду по сети

§ Реализация стектрейсов, используемая в AnyEvent, никуда не течет (в комментариях к ней как раз ругают Carp::Always)

§ Управление памятью в Perl — оно какое-то эээ...

У меня тоже есть свой modern Perl. 2014

Page 36: Мой modern Perl (весенняя встреча Piter United)

Окей, включили стектрейсы

§ Вы помните, про callback hell, да?§ У нас в системе появляются неучтенные ошибки,

которые валятся в логи, который никто не читает§ Стектрейс при этом не говорит ни о чем§ Предупрежден — значит вооружен§ Выход: кастомный appender для Log4Perl, который

репортит счетчик строчек в StatsD

У меня тоже есть свой modern Perl. 2014

Page 37: Мой modern Perl (весенняя встреча Piter United)

Кажется, деплоймент под контролем

§ Кстати, а как в Perl следить за сервисами?§ В Perl есть ubic§ Это такой bluepill (почти), но на Perl§ Что сделает ubic, если сервис умер?§ Через заданное время периодический

процесс форкнет еще один процесс, который стартует всех мертвецов (WTF?)

У меня тоже есть свой modern Perl. 2014

Page 38: Мой modern Perl (весенняя встреча Piter United)

Синхронная модель vs асинхронная модель

§ У меня есть опыт переписывания сервиса отдачи файлов с синхронной модели на асинхронную

§ Лейтенси ВОЗРОСЛА (не верьте тем, кто говорит что асинхронная модель БЫСТРЕЕ)

§ Зато существенно упало потребление памяти§ И я стал контролировать все стадии процесса

(попробуйте в mod_perl вернуть из хэндлера неожиданный результат — будет смешно)

У меня тоже есть свой modern Perl. 2014

Page 39: Мой modern Perl (весенняя встреча Piter United)

Выводы:

§ Мой modern Perl — это не только модули с CPAN и модные фреймворки

§ Но еще и молоток, при помощи которого можно заставить работать

§ Любое достаточно крупное животное

У меня тоже есть свой modern Perl. 2014

Page 40: Мой modern Perl (весенняя встреча Piter United)

Традиционный слайд

§ DevOps-40: Уберите детей от экранов!

У меня тоже есть свой modern Perl. 2014

Page 41: Мой modern Perl (весенняя встреча Piter United)

С вами был Александр Чистяков,главный инженер Git in Sky

[email protected]://gitinsky.com

http://meetup.com/DevOps-40

Пожалуйста, ваши вопросы.

Спасибо за внимание!

http://devconf.ru/offers/ - ПРОГОЛОСУЙТЕ, ПОЖАЛУЙСТА,ЗА МОИ ЗАЯВКИ!