Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
У меня тоже есть
свой 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
alex@gitinsky.com
http://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за внимание!
http://devconf.ru/offers/ - ПРОГОЛОСУЙТЕ, ПОЖАЛУЙСТА,
ЗА МОИ ЗАЯВКИ!

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
  • 26. Ура, счастье! У меня тоже есть свой 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
  • 34. Краса и гордость У меня тоже есть свой 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
  • 40. Традиционный слайд § DevOps-40: Уберите детей от экранов! У меня тоже есть свой modern Perl. 2014
  • 41. С вами был Александр Чистяков, главный инженер Git in Sky alex@gitinsky.com http://gitinsky.com http://meetup.com/DevOps-40 Пожалуйста, ваши вопросы. Спасибо за внимание! http://devconf.ru/offers/ - ПРОГОЛОСУЙТЕ, ПОЖАЛУЙСТА, ЗА МОИ ЗАЯВКИ!