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

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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/ - ПРОГОЛОСУЙТЕ, ПОЖАЛУЙСТА,ЗА МОИ ЗАЯВКИ!