Мой modern Perl (весенняя встреча Piter United)
-
Upload
alex-chistyakov -
Category
Technology
-
view
1.561 -
download
0
description
Transcript of Мой modern Perl (весенняя встреча Piter United)
У меня тоже естьсвой modern Perl
Нет ни одного пути не сделать это
Александр Чистяков, главный инженер Git in Sky,
2014
Сверим часы
§ > 2014-й§ > Perl
У меня тоже есть свой modern Perl. 2014
Пожалуйста, не расходитесь!
§ Предыдущий слайд не полностьюотражает мой опыт
§ Да, Perl сломан, и его нельзя починить(см. http://goo.gl/O7OS1X )
§ Однажды мы проехали 2600 километровна минивэне с вырванной стойкой - “сломан”не означает “не может передвигаться”
§ Кстати, мой ноутбук сломан :(
У меня тоже есть свой modern Perl. 2014
В чем плюсы Perl
§ Perl-разработчика не удивишь ездой свырванной стойкой (впрочем, большинствоязыков на “P” такие)
§ Perl-разработчика легко найти — они всепоименно занесены в Красную книгу
§ У некоторых заказчиков сформированазащитно-подсознательная травматическаясвязь с Perl
У меня тоже есть свой modern Perl. 2014
Прекратите смеяться, вы не в цирке!
§ Как во все это ввязался я:§ Деньги§ Челлендж§ Если не я, то кто?§ Если я не умею эксплуатировать
продукты на Perl, что я тогда вообще умею?
У меня тоже есть свой modern Perl. 2014
Куда именно я ввязался
§ Setup.ru:§ Конструктор сайтов§ Моя роль — инженер по эксплуатации
§ AdCamp:
§ Мобильная рекламная сеть§ Моя роль — релиз-инженер, разработчик
У меня тоже есть свой modern Perl. 2014
В дальнейшем роли перемешались
§ Мое глубокое убеждение:§ Невозможно эффективно эксплуатировать
проект, не принимая участия в его
разработке§ И наоборот
У меня тоже есть свой modern Perl. 2014
Традиционно приписываемые Perl проблемы
§ Perl сложно читать и понимать§ Perl «глючит и тормозит»§ ^ Леха, мы помним!§ Perl сдох§ (В качестве фокус-группы были использованы
участники элитного(tm) чата)
У меня тоже есть свой modern Perl. 2014
Начну со второго проекта
§ Мобильная рекламная сеть§ Оказывается, показ рекламы — достаточно сложная задача:
§ Запутанные бизнес-правила§ Интеграция с контрагентами, которые сами не знают,
чего хотят§ Необходимость релизиться часто и быстро§ Highload, что бы это ни значило
У меня тоже есть свой modern Perl. 2014
Взгляд разработчика, мнимые проблемы
§ Perl легко читать, если его писала не обезьяна§ К несчастью, многие Perl-программисты считают своим
долгом использовать какие-нибудь свои коронные вещи, понятные только им
§ К счастью, modern Perl это не мертвый верблюд,
а живые лоси, мыши и другие обитатели леса!
У меня тоже есть свой modern Perl. 2014
Modern Perl
§ Moose и производные:§ Всё то, что было в нормальных
ОО языках еще 10+ лет назад, и
чего нет в ядре языка до сих пор§ Миксины («роли»), method modifiers,
проперти, и т.п.
У меня тоже есть свой modern Perl. 2014
Проблемы становятся локальнее
§ Лично я быстро теряю контекст в ОО системах
на “скриптовых” (динамически типизированных)
языках (хочу, чтобы все было в одном файле)§ ^ Потому что пишу в ViM§ Кроме того, я помню, что объект в Perl — это просто
blessed hash, и все время нарушаю инкапсуляцию
У меня тоже есть свой modern Perl. 2014
Новые вызовы для 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
AnyEvent
§ Позволяет погрузиться в callback hell
совершенно незаметным для разработчика
образом§ Код отлично пишется и читается§ Разработчик ничего не подозревает
до выхода своего шедевра в продакшн
У меня тоже есть свой modern Perl. 2014
Взгляд эксплуатационщика
§ Выход в продакшн:§ Сервисы втыкают§ Все бегают и орут§ Никто не знает, что происходит
§ Спокойно, сейчас всё будет!
§ Нужно просто сделать профайлинг!
У меня тоже есть свой modern Perl. 2014
Как сделать профайлинг
§ Старый добрый PMP:§ http://poormansprofiler.org/§ По сути, старый добрый gdb + обертка на
shell§ (Почти) универсальный
cэмплирующий профайлер
У меня тоже есть свой modern Perl. 2014
Чего же мы ждем?
§ Собрали сэмплы, проанализировали§ Виновник найден, вот он:§ Perl_runops_standard§ Здесь приложение проводит больше
всего времени§ Этот вызов просто выполняет все
перловые опкоды ;(
У меня тоже есть свой modern Perl. 2014
Переходим к плану Б, он ведь есть?
§ Даже в такой старой экосистеме, как Java/JVM,
есть сэмплирующий профайлер§ Неужели в modern Perl его нет?§ СЮРПРИИИЗ!§ Мы соберем свой собственный, используя
схему из журнала “Радио”
У меня тоже есть свой modern Perl. 2014
Профайлер своими руками
§ Нам понадобятся:§ Активные датчики§ Агрегатор§ Коллектор/хранилище§ Что-то, что рисует графики§ Дэшборд
У меня тоже есть свой modern Perl. 2014
StatsD/Graphite
§ Ничего изобретать не придется:§ StatsD — простой протокол обмена телеметрической
информацией§ Клиенты и серверы на любом языке, в том числе на Perl
и C (кстати, он сейчас сломан, я засабмитил патч)§ Graphite — RRD-like хранилище + инфраструктура для
рисования графиков
У меня тоже есть свой modern Perl. 2014
Дэшборд
§ Раньше я всегда использовал GDash (он хорошо скриптуется)§ Потом мне показали Grafana (спасибо, Андрюха!)§ Grafana вообще не скриптуется, но отлично конфигурируется
вручную прямо через веб§ Оказалось, что типичный шаблон работы с графиками в
сложном проекте предполагает довольно частые переконфигурирования — скриптовать долго
У меня тоже есть свой modern Perl. 2014
Промежуточный итог
§ В код относительно небольшой кровью внедрены таймеры
§ Теперь на продакшн есть красивые графики зависимости времени исполнения запроса от времени
§ Виновный найден и призван к порядку
У меня тоже есть свой modern Perl. 2014
Не очень-то призрачная угроза
§ Сложная бизнес-логика порождает ошибки*§ *коллеги-программисты, конечно же, а вовсе
не логика, но чем сложнее логика, тем больше ошибок
§ Шокирующее открытие: логи никто не читает!§ Лог-коллектор? Серьезно?
У меня тоже есть свой modern Perl. 2014
Давайте подумаем
§ Мы правда хотим из приложения писать плохо структурированную информацию в файл, потом разбивать этот файл на строки, пересылать их для анализа куда-то (где их, возможно, не примут из-за C10K+ problem), разбирать их там централизованно и там же искать корреляции?
§ youaredoingitwrong.jpg
У меня тоже есть свой modern Perl. 2014
Как же быть?
§ Ошибки надо классифицировать по месту их появления
§ Хорошая классификация ошибок — залог правильной интепретации результата
§ Например:§ rotator.total.errors.log_fatal_calls.rotator11-test-11081§ сервис-тип_ошибки-сервер-порт
У меня тоже есть свой modern Perl. 2014
Ура, счастье!
У меня тоже есть свой modern Perl. 2014
Callback hell strikes back
§ Odd number of hash elements in <some unknown module> at <some unknown string>
§ Сначала у этих загадочных надписей даже не было стектрейса! (а это похуже, чем вырванная вилка)
§ На предложение включить стектрейс коллеги-разработчики сказал, что Carp::Always течет!
§ (Забегая вперед — стектрейс не поможет)
У меня тоже есть свой modern Perl. 2014
Нам срочно нужен хороший memory profiler!
§ Требования:§ Работать в production окружении§ Ладно, хотя бы в 1/10 production окружения§ Кстати, про 1/10 production окружения:§ Отогнать 10% трафика со staging на production путем
зеркалирования было отличной идеей
У меня тоже есть свой modern Perl. 2014
And we need to go deeper
§ Извините, я все время отвлекаюсь§ Как отзеркалировать 10% трафика с продакшна в
стейджинг?§ emproxy и аналоги — стильно, модно, молодежно!§ Старый добрый nginx!§ Wait...what?
У меня тоже есть свой modern Perl. 2014
Как это делается в nginx
§ Способ придуман коллегой @yavorovich_da, инженером по эксплуатации AdCamp
§ В nginx заводится отдельный апстрим, на который направляется 10% трафика
§ Этот апстрим всегда отвечает 503 с минимальным таймаутом, при этом проксируя запрос на staging
§ Боевой прокси, получая 503, идет к боевому сервису
У меня тоже есть свой modern Perl. 2014
Окей, теперь у нас есть тестовая площадка
§ Вернемся к memory profiler§ Где же он, где?§ Подозреваю, что в случае Perl — там же, где и
сэмплирующий профайлер, а значит, ответ мы уже знаем
§ Ответ — StatsD
У меня тоже есть свой modern Perl. 2014
Самолет своими руками
§ Нам понадобятся:§ perlbrew (по-вашему это будет RVM)§ Исходники Perl§ statsd-c-client (мой патч, кстати, принят)§ Небольшие изменения в аллокаторе Perl
У меня тоже есть свой modern Perl. 2014
Итого
§ http://goo.gl/FJqAhG§ Не многопоточное§ Места расстановки датчиков подобраны
экспериментально методом “работает-не трогай”
§ Но оно работает!
У меня тоже есть свой modern Perl. 2014
Краса и гордость
У меня тоже есть свой modern Perl. 2014
Некоторые случайные факты
§ StatsD-сервис придется устаовить на той же машине, совершенно незачем гонять 10-20 тысяч событий в секунду по сети
§ Реализация стектрейсов, используемая в AnyEvent, никуда не течет (в комментариях к ней как раз ругают Carp::Always)
§ Управление памятью в Perl — оно какое-то эээ...
У меня тоже есть свой modern Perl. 2014
Окей, включили стектрейсы
§ Вы помните, про callback hell, да?§ У нас в системе появляются неучтенные ошибки,
которые валятся в логи, который никто не читает§ Стектрейс при этом не говорит ни о чем§ Предупрежден — значит вооружен§ Выход: кастомный appender для Log4Perl, который
репортит счетчик строчек в StatsD
У меня тоже есть свой modern Perl. 2014
Кажется, деплоймент под контролем
§ Кстати, а как в Perl следить за сервисами?§ В Perl есть ubic§ Это такой bluepill (почти), но на Perl§ Что сделает ubic, если сервис умер?§ Через заданное время периодический
процесс форкнет еще один процесс, который стартует всех мертвецов (WTF?)
У меня тоже есть свой modern Perl. 2014
Синхронная модель vs асинхронная модель
§ У меня есть опыт переписывания сервиса отдачи файлов с синхронной модели на асинхронную
§ Лейтенси ВОЗРОСЛА (не верьте тем, кто говорит что асинхронная модель БЫСТРЕЕ)
§ Зато существенно упало потребление памяти§ И я стал контролировать все стадии процесса
(попробуйте в mod_perl вернуть из хэндлера неожиданный результат — будет смешно)
У меня тоже есть свой modern Perl. 2014
Выводы:
§ Мой modern Perl — это не только модули с CPAN и модные фреймворки
§ Но еще и молоток, при помощи которого можно заставить работать
§ Любое достаточно крупное животное
У меня тоже есть свой modern Perl. 2014
Традиционный слайд
§ DevOps-40: Уберите детей от экранов!
У меня тоже есть свой modern Perl. 2014
С вами был Александр Чистяков,главный инженер Git in Sky
[email protected]://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за внимание!
http://devconf.ru/offers/ - ПРОГОЛОСУЙТЕ, ПОЖАЛУЙСТА,ЗА МОИ ЗАЯВКИ!