performance engineering stories from #fdminicon saransk

37
Несколько историй из жизни Performance Engineer'а Александр Чистяков, главный инженер Git in Sky, 2014 Как я съел кусок мыла Александр Чистяков, главный инженер Git in Sky, 2014

Upload: alex-chistyakov

Post on 11-Jun-2015

2.179 views

Category:

Technology


0 download

DESCRIPTION

My talk on performance engineering, FoxDevs Minicon #4, Saransk

TRANSCRIPT

Page 1: Performance engineering stories from #fdminicon Saransk

Несколько историй из жизниPerformance Engineer'а

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

2014

Как я съел кусок мыла

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

2014

Page 2: Performance engineering stories from #fdminicon Saransk

Давайте познакомимся

§ Меня зовут Саша§ Я работаю главным инженером в компании Git in Sky§ Мы занимаемся эксплуатацией веб-проектов,

помощью в разработке веб-проектов, собственно разработкой веб-проектов и автоматизацией веб-проектов

§ Во всем этом приходится участвовать мне

Несколько историй из жизни Performance Engineer'а. 2014

Page 3: Performance engineering stories from #fdminicon Saransk

А в чем участвуете вы?

§ Веб-разработка?§ Эксплуатация веб-сайтов?§ Поддержка проекта, написанного непонятно кем?§ Борьба с хабраэффектом?§ Принятие решений об аренде/покупке серверов?§ Еще пока не определились, всё такое вкусное?

Несколько историй из жизни Performance Engineer'а. 2014

Page 4: Performance engineering stories from #fdminicon Saransk

О чем пойдет речь?

§ Кто такие performance engineers и зачем они нужны§ Как справиться с хабраэффектом§ Сколько серверов нужно, чтобы вкрутить одну

лампочку§ Что лучше: MySQL или MongoDB? PHP, Perl или

Ruby?§ Однажды у моей подруги с ее парнем...

Несколько историй из жизни Performance Engineer'а. 2014

Page 5: Performance engineering stories from #fdminicon Saransk

Кто такой performance engineer?

§ Это человек, который делает performance engineering

§ http://en.wikipedia.org/wiki/Performance_engineering § ^ многа букв§ Человек, который знает, как все устроено внутри не

в терминах бизнес-логики приложения

Несколько историй из жизни Performance Engineer'а. 2014

Page 6: Performance engineering stories from #fdminicon Saransk

Как бороться с хабраэффектом

§ Я испытываю хабраэффект почти каждый раз, когда открываю статью на Хабре

§ Способы борьбы:§ Не верьте в магию§ Не читайте статьи на Хабре

§ Знание — сила

§ (на самом деле, сила это масса на ускорение)

Несколько историй из жизни Performance Engineer'а. 2014

Page 7: Performance engineering stories from #fdminicon Saransk

Структурная схема типичного веб-проекта

Несколько историй из жизни Performance Engineer'а. 2014

Page 8: Performance engineering stories from #fdminicon Saransk

Проблемы типичного веб-проекта

§ Непосредственно вытекают из его структуры§ Подразделяются на:

§ ВНЕЗАПНО ничего не работает§ Всё тормозит!§ Мы арендовали c3.xlarge, а оно все равно

тормозит!§ Данные куда-то пропали

Несколько историй из жизни Performance Engineer'а. 2014

Page 9: Performance engineering stories from #fdminicon Saransk

Переходим к практике

§ Краткое содержание следующих серий:§ Описание проблемы, происшедшей у моей

подруги с ее парнем

§ Описание пути решения проблемы§ Несколько слов о том, чем именно

руководствовались при решении проблемы, и почему всё удалось (или не удалось)

Несколько историй из жизни Performance Engineer'а. 2014

Page 10: Performance engineering stories from #fdminicon Saransk

Случай на производстве №1 (типичный)

§ Сайт-новостник, написанный с использованием UMI.CMS древней версии

§ Проблема: медленно работает админка, время от времени начинает медленно работать всё

§ “Медленно” - страница генерируется десятки секунд

Несколько историй из жизни Performance Engineer'а. 2014

Page 11: Performance engineering stories from #fdminicon Saransk

Решение №1 (типичнее некуда)

§ Включить MySQL slow queries log§ На всякий случай добавить в код вызовы

профайлинга (подойдет что угодно — например, записывать скорость генерации страницы в лог, в базу данных, в PINBA, в Graphite или еще куда-то)

§ Убедиться, что проблема в запросах к БД§ Найти долгий запрос и посмотреть его query plan

Несколько историй из жизни Performance Engineer'а. 2014

Page 12: Performance engineering stories from #fdminicon Saransk

Почему (не) работает (тоже типично)

§ Запрос сгенерирован ORM и делает фиг знает что§ На самом деле, никто не знает, что именно он

делает, но он джойнит две огромных таблицы, накладывает условия и сортирует результат

§ Индексы не работают, да и не могут§ Такие сортировки — хуже всего для СУБД§ Разработчики не знают, как быть

Несколько историй из жизни Performance Engineer'а. 2014

Page 13: Performance engineering stories from #fdminicon Saransk

Альтернативная история

§ Можно хакнуть ORM и заменять “плохой” запрос на “хороший” (резалтсеты должны совпадать)

§ Можно заменять “плохой” запрос на N “хороших”§ Можно вообще выбросить ORM§ ^ До этого в моей практике не доходило ни у кого§ Можно выбросить плохой запрос — вдруг, никто не

заметит?

Несколько историй из жизни Performance Engineer'а. 2014

Page 14: Performance engineering stories from #fdminicon Saransk

Случай на производстве №2 (тоже типичный)

§ Сайт по продаже чего-то§ Когда приходят боты, чтобы парсить контент — всё

тормозит§ “Боты” - это не Яндекс или Google, а какие-то

конкуренты, которые игнорируют robots.txt и публично доступное API

Несколько историй из жизни Performance Engineer'а. 2014

Page 15: Performance engineering stories from #fdminicon Saransk

Решение №2 (довольно типичное)

§ На сайте уже стоит платный NewRelic, который умеет показывать проблемные места с хорошей степенью детализации*

§ * Для некоторых языков программирования§ Туда никто даже смотреть не стал — ботов

просто забанили по IP§ Потому что нефиг тут шастать!

Несколько историй из жизни Performance Engineer'а. 2014

Page 16: Performance engineering stories from #fdminicon Saransk

Случай на производстве №3 (уже было)

§ Сайт по продаже чего-то еще§ Когда приходят боты, чтобы подбирать логины

клиентов — всё тормозит§ Боты приходят слишком умные, и по IP их забанить

невозможно — они делают по одному запросу в несколько минут с одного IP, не чаще

Несколько историй из жизни Performance Engineer'а. 2014

Page 17: Performance engineering stories from #fdminicon Saransk

Решение №3 (довольно унылое)

§ Добавить в код профилирующих метрик§ Убедиться в том, что тормозит шаблонизатор§ Подумать, о замене шаблонизатора на нормальный§ Оценить трудоемкость§ Выделить общий для ботов шаблон (запросы по

HTTP/1.0, у нормальных клиентов — 1.1)§ Побанить ботов по шаблону

Несколько историй из жизни Performance Engineer'а. 2014

Page 18: Performance engineering stories from #fdminicon Saransk

Случай на производстве №4 (бывает)

§ B2B-сервис, ходящий за исходным данными для расчетов на несколько внешних сайтов

§ Когда клиентов на сайт заходит много — наступает отказ в обслуживании

§ Особенно, если в то же самое время какой-нибудь из сайтов-партнеров отдает данные не слишком быстро

Несколько историй из жизни Performance Engineer'а. 2014

Page 19: Performance engineering stories from #fdminicon Saransk

Решение №4 (тоже унылое)

§ Добавить в код профилирующих метрик§ Убедиться в том, что синхронные запросы к

внешним сервисам — это далеко не всегда хорошая идея (никогда, на самом деле)

§ Добавить uwsgi воркеров (пусть их будет 150)§ Скрестить пальцы

Несколько историй из жизни Performance Engineer'а. 2014

Page 20: Performance engineering stories from #fdminicon Saransk

Альтернативная история

§ Убедить разработчиков переделать чудо-приложение под асинхронную модель взаимодействия с внешним тормозным миром

§ ^ Как оно и должно быть по науке§ Хочешь, чтобы что-то было сделано — сделай

сам

Несколько историй из жизни Performance Engineer'а. 2014

Page 21: Performance engineering stories from #fdminicon Saransk

Найдите десять отличий

§ Во всех четырех историях есть общие черты:§ Приложение работает неоптимально§ Проблемы довольно очевидны§ У разработчиков нет времени и/или

желания разбираться с проблемами производительности

§ Технический долг (и энтропия) растет

Несколько историй из жизни Performance Engineer'а. 2014

Page 22: Performance engineering stories from #fdminicon Saransk

Пара слов о социальном взаимодействии

§ Коллеги не будут вас любить:§ Вы разрушаете то, что было создано ими§ Они часто путают красоту и эффективность§ Для них вы какой-то выскочка§ У них есть более важные задачи, чем

общение с вами§ Они знают бизнес-логику, а вы - нет

Несколько историй из жизни Performance Engineer'а. 2014

Page 23: Performance engineering stories from #fdminicon Saransk

Случай на производстве №5 (Н.Е.Х.)

§ B2B-сервис из случая №4§ ОДНАЖДЫ все перестало работать, а именно:§ Загрузка процессора 100%§ Несмотря на наличие SSD, база данных работает

не слишком быстро§ А приложение — и того хуже

Несколько историй из жизни Performance Engineer'а. 2014

Page 24: Performance engineering stories from #fdminicon Saransk

Решение №5 (магия дружбы)

§ Метаться, кричать§ Найти, что поменялось в последние две недели

(ничего не поменялось)§ После 30-40 минут раздумий выключить в BIOS

сервера Hyper-Threading и запретить изменения частоты процессора

§ Выдохнуть

Несколько историй из жизни Performance Engineer'а. 2014

Page 25: Performance engineering stories from #fdminicon Saransk

Почему это работает

§ Не будь у моей подруги с ее парнем опыта работы с системами виртуализации — фиг бы они вообще до этого додумались

§ Планировщику операционной системы тяжело в ситуации, когда ядра меняют частоту, к тому же, некоторые из ядер не существуют на самом деле

§ Планировщик двигает задачи туда-сюда

Несколько историй из жизни Performance Engineer'а. 2014

Page 26: Performance engineering stories from #fdminicon Saransk

Стоп, стоп, стоп!

§ Метаться, делать другие хаотические движения, а через какое-то время решить проблему?

§ WTF?§ Факты — гипотеза — ответные меры§ Как возникла гипотеза?§ Сбор фактов, потом их анализ:§ echo t > /proc/sysrq-trigger

Несколько историй из жизни Performance Engineer'а. 2014

Page 27: Performance engineering stories from #fdminicon Saransk

Немного когнитивной психологии

§ А почему именно echo t > /proc/sysrq-trigger,§ А не другая странная и непонятная мера?§ Исходим из известных нам фактов: что-то

занимает процессор§ Как посмотреть, что именно?§ В приложении — gdb thread apply all bt§ Не видим ничего необычного — спустимся ниже

Несколько историй из жизни Performance Engineer'а. 2014

Page 28: Performance engineering stories from #fdminicon Saransk

Случай на производстве №6 (сложный)

§ Сервис показа мобильной рекламы§ Набор асинхронных сервисов на языке Perl§ ОДНАЖДЫ ПРЯМО НА ПРОДАКШНЕ все

перестало работать, а именно:§ Реклама перестала отдаваться, хотя партнеры

работают исправно§ На сервисах в пределах одной машины - таймауты

Несколько историй из жизни Performance Engineer'а. 2014

Page 29: Performance engineering stories from #fdminicon Saransk

Решение №6 (очевидное)

§ Обвешать вообще всё метриками профайлинга, включая 3rd party асинхронные модули

§ Под “вообще всё” я имел в виду вообще всё§ Найти магическую константу MAX_PER_HOST в

одном из модулей, который, вообще-то, был задуман автором как эмуляция браузера

§ Увеличить ее с 4 до 400§ Жить спокойно до следующего падения

Несколько историй из жизни Performance Engineer'а. 2014

Page 30: Performance engineering stories from #fdminicon Saransk

Почему это работает

§ Потому что это и есть нормальный инженерный подход, а именно:

§ Измерить (получить метрики)§ Выработать план (проанализировать метрики)§ Внести полезные изменения§ Снова измерить

Несколько историй из жизни Performance Engineer'а. 2014

Page 31: Performance engineering stories from #fdminicon Saransk

Почему было сложно

§ Несмотря на верность в целом, описанный подход имеет ряд недостатков:§ Невозможно предсказать время его

сходимости в общем виде§ Он вообще может не сойтись в общем виде

по объективным причинам§ Альтернативные отличные идеи (“всё

переписать”, etc)

Несколько историй из жизни Performance Engineer'а. 2014

Page 32: Performance engineering stories from #fdminicon Saransk

Все переписать!

§ Итак, что лучше, Perl, Ruby или PHP?§ В неравенстве Perl <> Ruby <> PHP, в конечном

счете, где-то должны находиться и вы сами§ И если вы хуже и чем Perl, и чем Ruby, и чем

PHP — у вас не получится НИЧЕГО§ Для CPU-bound задач берите что-нибудь, что

поближе к железу, чем перечисленные не-JIT-enabled скриптовые поделки*

Несколько историй из жизни Performance Engineer'а. 2014

* есть всякие наработки и для них

Page 33: Performance engineering stories from #fdminicon Saransk

Случай на производстве №7 (повсеместный)

§ Клиент хостился на Хетцнере§ ОДНАЖДЫ в зеркале сломался первый диск§ Через некоторое время сломался и второй§ Когда все это заметили — данные уже были

немножко потеряны

Несколько историй из жизни Performance Engineer'а. 2014

Page 34: Performance engineering stories from #fdminicon Saransk

Решение №7 (необходимое)

§ Завести бэкапы!§ При чем же тут performance?§ Pooling, compression, deduplication...§ ^ BackupPC отлично подходит, но...§ rsync очень сильно нагружает дисковую

подсистему машины-клиента§ Опция --bwlimit=500 (или сколько можете)

Несколько историй из жизни Performance Engineer'а. 2014

Page 35: Performance engineering stories from #fdminicon Saransk

Почему это (не) работает

§ Зачем нужны бэкапы?§ Затем, чтобы однажды ими воспользоваться,

например...§ Развернуть систему из бэкапа целиком!§ Бэкап сотен гигабайт будет разворачиваться

несколько суток§ ^ Для начала просто задумайтесь об этом

Несколько историй из жизни Performance Engineer'а. 2014

Page 36: Performance engineering stories from #fdminicon Saransk

Выводы

§ Старайтесь всегда точно знать, где вы находитесь§ Измеряйте§ Планируйте§ Не паникуйте§ В сложной ситуации делайте что-нибудь красиво§ Все хорошо будет

Несколько историй из жизни Performance Engineer'а. 2014

Page 37: Performance engineering stories from #fdminicon Saransk

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

[email protected]://gitinsky.com

http://meetup.com/DevOps-40

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

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