Несколько историй из жизни
Performance Engineer'а
Александр Чистяков,
главный инженер Git in Sky,
2014
Как я съел кусок мыла
Александр Чистяков,
главный инженер Git in Sky,
2014
Давайте познакомимся
§ Меня зовут Саша
§ Я работаю главным инженером в компании Git in Sky
§ Мы занимаемся эксплуатацией веб-проектов,
помощью в разработке веб-проектов, собственно
разработкой веб-проектов и автоматизацией веб-
проектов
§ Во всем этом приходится участвовать мне
Несколько историй из жизни Performance Engineer'а. 2014
А в чем участвуете вы?
§ Веб-разработка?
§ Эксплуатация веб-сайтов?
§ Поддержка проекта, написанного непонятно кем?
§ Борьба с хабраэффектом?
§ Принятие решений об аренде/покупке серверов?
§ Еще пока не определились, всё такое вкусное?
Несколько историй из жизни Performance Engineer'а. 2014
О чем пойдет речь?
§ Кто такие performance engineers и зачем они нужны
§ Как справиться с хабраэффектом
§ Сколько серверов нужно, чтобы вкрутить одну
лампочку
§ Что лучше: MySQL или MongoDB? PHP, Perl или
Ruby?
§ Однажды у моей подруги с ее парнем...
Несколько историй из жизни Performance Engineer'а. 2014
Кто такой performance engineer?
§ Это человек, который делает performance
engineering
§ http://en.wikipedia.org/wiki/Performance_engineering
§ ^ многа букв
§ Человек, который знает, как все устроено внутри не
в терминах бизнес-логики приложения
Несколько историй из жизни Performance Engineer'а. 2014
Как бороться с хабраэффектом
§ Я испытываю хабраэффект почти каждый раз, когда
открываю статью на Хабре
§ Способы борьбы:
§ Не верьте в магию
§ Не читайте статьи на Хабре
§ Знание — сила
§ (на самом деле, сила это масса на ускорение)
Несколько историй из жизни Performance Engineer'а. 2014
Структурная схема типичного веб-проекта
Несколько историй из жизни Performance Engineer'а. 2014
Проблемы типичного веб-проекта
§ Непосредственно вытекают из его структуры
§ Подразделяются на:
§ ВНЕЗАПНО ничего не работает
§ Всё тормозит!
§ Мы арендовали c3.xlarge, а оно все равно
тормозит!
§ Данные куда-то пропали
Несколько историй из жизни Performance Engineer'а. 2014
Переходим к практике
§ Краткое содержание следующих серий:
§ Описание проблемы, происшедшей у моей
подруги с ее парнем
§ Описание пути решения проблемы
§ Несколько слов о том, чем именно
руководствовались при решении проблемы,
и почему всё удалось (или не удалось)
Несколько историй из жизни Performance Engineer'а. 2014
Случай на производстве №1 (типичный)
§ Сайт-новостник, написанный с использованием
UMI.CMS древней версии
§ Проблема: медленно работает админка, время
от времени начинает медленно работать всё
§ “Медленно” - страница генерируется десятки
секунд
Несколько историй из жизни Performance Engineer'а. 2014
Решение №1 (типичнее некуда)
§ Включить MySQL slow queries log
§ На всякий случай добавить в код вызовы
профайлинга (подойдет что угодно — например,
записывать скорость генерации страницы в лог, в
базу данных, в PINBA, в Graphite или еще куда-то)
§ Убедиться, что проблема в запросах к БД
§ Найти долгий запрос и посмотреть его query plan
Несколько историй из жизни Performance Engineer'а. 2014
Почему (не) работает (тоже типично)
§ Запрос сгенерирован ORM и делает фиг знает что
§ На самом деле, никто не знает, что именно он
делает, но он джойнит две огромных таблицы,
накладывает условия и сортирует результат
§ Индексы не работают, да и не могут
§ Такие сортировки — хуже всего для СУБД
§ Разработчики не знают, как быть
Несколько историй из жизни Performance Engineer'а. 2014
Альтернативная история
§ Можно хакнуть ORM и заменять “плохой” запрос на
“хороший” (резалтсеты должны совпадать)
§ Можно заменять “плохой” запрос на N “хороших”
§ Можно вообще выбросить ORM
§ ^ До этого в моей практике не доходило ни у кого
§ Можно выбросить плохой запрос — вдруг, никто не
заметит?
Несколько историй из жизни Performance Engineer'а. 2014
Случай на производстве №2 (тоже типичный)
§ Сайт по продаже чего-то
§ Когда приходят боты, чтобы парсить контент — всё
тормозит
§ “Боты” - это не Яндекс или Google, а какие-то
конкуренты, которые игнорируют robots.txt и
публично доступное API
Несколько историй из жизни Performance Engineer'а. 2014
Решение №2 (довольно типичное)
§ На сайте уже стоит платный NewRelic, который
умеет показывать проблемные места с
хорошей степенью детализации*
§ * Для некоторых языков программирования
§ Туда никто даже смотреть не стал — ботов
просто забанили по IP
§ Потому что нефиг тут шастать!
Несколько историй из жизни Performance Engineer'а. 2014
Случай на производстве №3 (уже было)
§ Сайт по продаже чего-то еще
§ Когда приходят боты, чтобы подбирать логины
клиентов — всё тормозит
§ Боты приходят слишком умные, и по IP их забанить
невозможно — они делают по одному запросу в
несколько минут с одного IP, не чаще
Несколько историй из жизни Performance Engineer'а. 2014
Решение №3 (довольно унылое)
§ Добавить в код профилирующих метрик
§ Убедиться в том, что тормозит шаблонизатор
§ Подумать, о замене шаблонизатора на нормальный
§ Оценить трудоемкость
§ Выделить общий для ботов шаблон (запросы по
HTTP/1.0, у нормальных клиентов — 1.1)
§ Побанить ботов по шаблону
Несколько историй из жизни Performance Engineer'а. 2014
Случай на производстве №4 (бывает)
§ B2B-сервис, ходящий за исходным данными для
расчетов на несколько внешних сайтов
§ Когда клиентов на сайт заходит много — наступает
отказ в обслуживании
§ Особенно, если в то же самое время какой-нибудь
из сайтов-партнеров отдает данные не слишком
быстро
Несколько историй из жизни Performance Engineer'а. 2014
Решение №4 (тоже унылое)
§ Добавить в код профилирующих метрик
§ Убедиться в том, что синхронные запросы к
внешним сервисам — это далеко не всегда
хорошая идея (никогда, на самом деле)
§ Добавить uwsgi воркеров (пусть их будет 150)
§ Скрестить пальцы
Несколько историй из жизни Performance Engineer'а. 2014
Альтернативная история
§ Убедить разработчиков переделать
чудо-приложение под асинхронную модель
взаимодействия с внешним тормозным
миром
§ ^ Как оно и должно быть по науке
§ Хочешь, чтобы что-то было сделано — сделай
сам
Несколько историй из жизни Performance Engineer'а. 2014
Найдите десять отличий
§ Во всех четырех историях есть общие черты:
§ Приложение работает неоптимально
§ Проблемы довольно очевидны
§ У разработчиков нет времени и/или
желания разбираться с проблемами
производительности
§ Технический долг (и энтропия) растет
Несколько историй из жизни Performance Engineer'а. 2014
Пара слов о социальном взаимодействии
§ Коллеги не будут вас любить:
§ Вы разрушаете то, что было создано ими
§ Они часто путают красоту и эффективность
§ Для них вы какой-то выскочка
§ У них есть более важные задачи, чем
общение с вами
§ Они знают бизнес-логику, а вы - нет
Несколько историй из жизни Performance Engineer'а. 2014
Случай на производстве №5 (Н.Е.Х.)
§ B2B-сервис из случая №4
§ ОДНАЖДЫ все перестало работать, а именно:
§ Загрузка процессора 100%
§ Несмотря на наличие SSD, база данных работает
не слишком быстро
§ А приложение — и того хуже
Несколько историй из жизни Performance Engineer'а. 2014
Решение №5 (магия дружбы)
§ Метаться, кричать
§ Найти, что поменялось в последние две недели
(ничего не поменялось)
§ После 30-40 минут раздумий выключить в BIOS
сервера Hyper-Threading и запретить
изменения частоты процессора
§ Выдохнуть
Несколько историй из жизни Performance Engineer'а. 2014
Почему это работает
§ Не будь у моей подруги с ее парнем опыта
работы с системами виртуализации — фиг
бы они вообще до этого додумались
§ Планировщику операционной системы тяжело
в ситуации, когда ядра меняют частоту,
к тому же, некоторые из ядер не существуют
на самом деле
§ Планировщик двигает задачи туда-сюда
Несколько историй из жизни Performance Engineer'а. 2014
Стоп, стоп, стоп!
§ Метаться, делать другие хаотические движения,
а через какое-то время решить проблему?
§ WTF?
§ Факты — гипотеза — ответные меры
§ Как возникла гипотеза?
§ Сбор фактов, потом их анализ:
§ echo t > /proc/sysrq-trigger
Несколько историй из жизни Performance Engineer'а. 2014
Немного когнитивной психологии
§ А почему именно echo t > /proc/sysrq-trigger,
§ А не другая странная и непонятная мера?
§ Исходим из известных нам фактов: что-то
занимает процессор
§ Как посмотреть, что именно?
§ В приложении — gdb thread apply all bt
§ Не видим ничего необычного — спустимся ниже
Несколько историй из жизни Performance Engineer'а. 2014
Случай на производстве №6 (сложный)
§ Сервис показа мобильной рекламы
§ Набор асинхронных сервисов на языке Perl
§ ОДНАЖДЫ ПРЯМО НА ПРОДАКШНЕ все
перестало работать, а именно:
§ Реклама перестала отдаваться, хотя партнеры
работают исправно
§ На сервисах в пределах одной машины - таймауты
Несколько историй из жизни Performance Engineer'а. 2014
Решение №6 (очевидное)
§ Обвешать вообще всё метриками профайлинга,
включая 3rd party асинхронные модули
§ Под “вообще всё” я имел в виду вообще всё
§ Найти магическую константу MAX_PER_HOST в
одном из модулей, который, вообще-то, был
задуман автором как эмуляция браузера
§ Увеличить ее с 4 до 400
§ Жить спокойно до следующего падения
Несколько историй из жизни Performance Engineer'а. 2014
Почему это работает
§ Потому что это и есть нормальный инженерный
подход, а именно:
§ Измерить (получить метрики)
§ Выработать план (проанализировать метрики)
§ Внести полезные изменения
§ Снова измерить
Несколько историй из жизни Performance Engineer'а. 2014
Почему было сложно
§ Несмотря на верность в целом, описанный
подход имеет ряд недостатков:
§ Невозможно предсказать время его
сходимости в общем виде
§ Он вообще может не сойтись в общем виде
по объективным причинам
§ Альтернативные отличные идеи (“всё
переписать”, etc)
Несколько историй из жизни Performance Engineer'а. 2014
Все переписать!
§ Итак, что лучше, Perl, Ruby или PHP?
§ В неравенстве Perl <> Ruby <> PHP, в конечном
счете, где-то должны находиться и вы сами
§ И если вы хуже и чем Perl, и чем Ruby, и чем
PHP — у вас не получится НИЧЕГО
§ Для CPU-bound задач берите что-нибудь, что
поближе к железу, чем перечисленные
не-JIT-enabled скриптовые поделки*
Несколько историй из жизни Performance Engineer'а. 2014
* есть всякие наработки и для них
Случай на производстве №7 (повсеместный)
§ Клиент хостился на Хетцнере
§ ОДНАЖДЫ в зеркале сломался первый диск
§ Через некоторое время сломался и второй
§ Когда все это заметили — данные уже были
немножко потеряны
Несколько историй из жизни Performance Engineer'а. 2014
Решение №7 (необходимое)
§ Завести бэкапы!
§ При чем же тут performance?
§ Pooling, compression, deduplication...
§ ^ BackupPC отлично подходит, но...
§ rsync очень сильно нагружает дисковую
подсистему машины-клиента
§ Опция --bwlimit=500 (или сколько можете)
Несколько историй из жизни Performance Engineer'а. 2014
Почему это (не) работает
§ Зачем нужны бэкапы?
§ Затем, чтобы однажды ими воспользоваться,
например...
§ Развернуть систему из бэкапа целиком!
§ Бэкап сотен гигабайт будет разворачиваться
несколько суток
§ ^ Для начала просто задумайтесь об этом
Несколько историй из жизни Performance Engineer'а. 2014
Выводы
§ Старайтесь всегда точно знать, где вы находитесь
§ Измеряйте
§ Планируйте
§ Не паникуйте
§ В сложной ситуации делайте что-нибудь красиво
§ Все хорошо будет
Несколько историй из жизни Performance Engineer'а. 2014
С вами был Александр Чистяков,
главный инженер Git in Sky
alex@gitinsky.com
http://gitinsky.com
http://meetup.com/DevOps-40
Пожалуйста, ваши вопросы.
Спасибо за внимание!

Performance engineering stories from #fdminicon Saransk

  • 1.
    Несколько историй изжизни Performance Engineer'а Александр Чистяков, главный инженер Git in Sky, 2014 Как я съел кусок мыла Александр Чистяков, главный инженер Git in Sky, 2014
  • 2.
    Давайте познакомимся § Менязовут Саша § Я работаю главным инженером в компании Git in Sky § Мы занимаемся эксплуатацией веб-проектов, помощью в разработке веб-проектов, собственно разработкой веб-проектов и автоматизацией веб- проектов § Во всем этом приходится участвовать мне Несколько историй из жизни Performance Engineer'а. 2014
  • 3.
    А в чемучаствуете вы? § Веб-разработка? § Эксплуатация веб-сайтов? § Поддержка проекта, написанного непонятно кем? § Борьба с хабраэффектом? § Принятие решений об аренде/покупке серверов? § Еще пока не определились, всё такое вкусное? Несколько историй из жизни Performance Engineer'а. 2014
  • 4.
    О чем пойдетречь? § Кто такие performance engineers и зачем они нужны § Как справиться с хабраэффектом § Сколько серверов нужно, чтобы вкрутить одну лампочку § Что лучше: MySQL или MongoDB? PHP, Perl или Ruby? § Однажды у моей подруги с ее парнем... Несколько историй из жизни Performance Engineer'а. 2014
  • 5.
    Кто такой performanceengineer? § Это человек, который делает performance engineering § http://en.wikipedia.org/wiki/Performance_engineering § ^ многа букв § Человек, который знает, как все устроено внутри не в терминах бизнес-логики приложения Несколько историй из жизни Performance Engineer'а. 2014
  • 6.
    Как бороться схабраэффектом § Я испытываю хабраэффект почти каждый раз, когда открываю статью на Хабре § Способы борьбы: § Не верьте в магию § Не читайте статьи на Хабре § Знание — сила § (на самом деле, сила это масса на ускорение) Несколько историй из жизни Performance Engineer'а. 2014
  • 7.
    Структурная схема типичноговеб-проекта Несколько историй из жизни Performance Engineer'а. 2014
  • 8.
    Проблемы типичного веб-проекта §Непосредственно вытекают из его структуры § Подразделяются на: § ВНЕЗАПНО ничего не работает § Всё тормозит! § Мы арендовали c3.xlarge, а оно все равно тормозит! § Данные куда-то пропали Несколько историй из жизни Performance Engineer'а. 2014
  • 9.
    Переходим к практике §Краткое содержание следующих серий: § Описание проблемы, происшедшей у моей подруги с ее парнем § Описание пути решения проблемы § Несколько слов о том, чем именно руководствовались при решении проблемы, и почему всё удалось (или не удалось) Несколько историй из жизни Performance Engineer'а. 2014
  • 10.
    Случай на производстве№1 (типичный) § Сайт-новостник, написанный с использованием UMI.CMS древней версии § Проблема: медленно работает админка, время от времени начинает медленно работать всё § “Медленно” - страница генерируется десятки секунд Несколько историй из жизни Performance Engineer'а. 2014
  • 11.
    Решение №1 (типичнеенекуда) § Включить MySQL slow queries log § На всякий случай добавить в код вызовы профайлинга (подойдет что угодно — например, записывать скорость генерации страницы в лог, в базу данных, в PINBA, в Graphite или еще куда-то) § Убедиться, что проблема в запросах к БД § Найти долгий запрос и посмотреть его query plan Несколько историй из жизни Performance Engineer'а. 2014
  • 12.
    Почему (не) работает(тоже типично) § Запрос сгенерирован ORM и делает фиг знает что § На самом деле, никто не знает, что именно он делает, но он джойнит две огромных таблицы, накладывает условия и сортирует результат § Индексы не работают, да и не могут § Такие сортировки — хуже всего для СУБД § Разработчики не знают, как быть Несколько историй из жизни Performance Engineer'а. 2014
  • 13.
    Альтернативная история § Можнохакнуть ORM и заменять “плохой” запрос на “хороший” (резалтсеты должны совпадать) § Можно заменять “плохой” запрос на N “хороших” § Можно вообще выбросить ORM § ^ До этого в моей практике не доходило ни у кого § Можно выбросить плохой запрос — вдруг, никто не заметит? Несколько историй из жизни Performance Engineer'а. 2014
  • 14.
    Случай на производстве№2 (тоже типичный) § Сайт по продаже чего-то § Когда приходят боты, чтобы парсить контент — всё тормозит § “Боты” - это не Яндекс или Google, а какие-то конкуренты, которые игнорируют robots.txt и публично доступное API Несколько историй из жизни Performance Engineer'а. 2014
  • 15.
    Решение №2 (довольнотипичное) § На сайте уже стоит платный NewRelic, который умеет показывать проблемные места с хорошей степенью детализации* § * Для некоторых языков программирования § Туда никто даже смотреть не стал — ботов просто забанили по IP § Потому что нефиг тут шастать! Несколько историй из жизни Performance Engineer'а. 2014
  • 16.
    Случай на производстве№3 (уже было) § Сайт по продаже чего-то еще § Когда приходят боты, чтобы подбирать логины клиентов — всё тормозит § Боты приходят слишком умные, и по IP их забанить невозможно — они делают по одному запросу в несколько минут с одного IP, не чаще Несколько историй из жизни Performance Engineer'а. 2014
  • 17.
    Решение №3 (довольноунылое) § Добавить в код профилирующих метрик § Убедиться в том, что тормозит шаблонизатор § Подумать, о замене шаблонизатора на нормальный § Оценить трудоемкость § Выделить общий для ботов шаблон (запросы по HTTP/1.0, у нормальных клиентов — 1.1) § Побанить ботов по шаблону Несколько историй из жизни Performance Engineer'а. 2014
  • 18.
    Случай на производстве№4 (бывает) § B2B-сервис, ходящий за исходным данными для расчетов на несколько внешних сайтов § Когда клиентов на сайт заходит много — наступает отказ в обслуживании § Особенно, если в то же самое время какой-нибудь из сайтов-партнеров отдает данные не слишком быстро Несколько историй из жизни Performance Engineer'а. 2014
  • 19.
    Решение №4 (тожеунылое) § Добавить в код профилирующих метрик § Убедиться в том, что синхронные запросы к внешним сервисам — это далеко не всегда хорошая идея (никогда, на самом деле) § Добавить uwsgi воркеров (пусть их будет 150) § Скрестить пальцы Несколько историй из жизни Performance Engineer'а. 2014
  • 20.
    Альтернативная история § Убедитьразработчиков переделать чудо-приложение под асинхронную модель взаимодействия с внешним тормозным миром § ^ Как оно и должно быть по науке § Хочешь, чтобы что-то было сделано — сделай сам Несколько историй из жизни Performance Engineer'а. 2014
  • 21.
    Найдите десять отличий §Во всех четырех историях есть общие черты: § Приложение работает неоптимально § Проблемы довольно очевидны § У разработчиков нет времени и/или желания разбираться с проблемами производительности § Технический долг (и энтропия) растет Несколько историй из жизни Performance Engineer'а. 2014
  • 22.
    Пара слов осоциальном взаимодействии § Коллеги не будут вас любить: § Вы разрушаете то, что было создано ими § Они часто путают красоту и эффективность § Для них вы какой-то выскочка § У них есть более важные задачи, чем общение с вами § Они знают бизнес-логику, а вы - нет Несколько историй из жизни Performance Engineer'а. 2014
  • 23.
    Случай на производстве№5 (Н.Е.Х.) § B2B-сервис из случая №4 § ОДНАЖДЫ все перестало работать, а именно: § Загрузка процессора 100% § Несмотря на наличие SSD, база данных работает не слишком быстро § А приложение — и того хуже Несколько историй из жизни Performance Engineer'а. 2014
  • 24.
    Решение №5 (магиядружбы) § Метаться, кричать § Найти, что поменялось в последние две недели (ничего не поменялось) § После 30-40 минут раздумий выключить в BIOS сервера Hyper-Threading и запретить изменения частоты процессора § Выдохнуть Несколько историй из жизни Performance Engineer'а. 2014
  • 25.
    Почему это работает §Не будь у моей подруги с ее парнем опыта работы с системами виртуализации — фиг бы они вообще до этого додумались § Планировщику операционной системы тяжело в ситуации, когда ядра меняют частоту, к тому же, некоторые из ядер не существуют на самом деле § Планировщик двигает задачи туда-сюда Несколько историй из жизни Performance Engineer'а. 2014
  • 26.
    Стоп, стоп, стоп! §Метаться, делать другие хаотические движения, а через какое-то время решить проблему? § WTF? § Факты — гипотеза — ответные меры § Как возникла гипотеза? § Сбор фактов, потом их анализ: § echo t > /proc/sysrq-trigger Несколько историй из жизни Performance Engineer'а. 2014
  • 27.
    Немного когнитивной психологии §А почему именно echo t > /proc/sysrq-trigger, § А не другая странная и непонятная мера? § Исходим из известных нам фактов: что-то занимает процессор § Как посмотреть, что именно? § В приложении — gdb thread apply all bt § Не видим ничего необычного — спустимся ниже Несколько историй из жизни Performance Engineer'а. 2014
  • 28.
    Случай на производстве№6 (сложный) § Сервис показа мобильной рекламы § Набор асинхронных сервисов на языке Perl § ОДНАЖДЫ ПРЯМО НА ПРОДАКШНЕ все перестало работать, а именно: § Реклама перестала отдаваться, хотя партнеры работают исправно § На сервисах в пределах одной машины - таймауты Несколько историй из жизни Performance Engineer'а. 2014
  • 29.
    Решение №6 (очевидное) §Обвешать вообще всё метриками профайлинга, включая 3rd party асинхронные модули § Под “вообще всё” я имел в виду вообще всё § Найти магическую константу MAX_PER_HOST в одном из модулей, который, вообще-то, был задуман автором как эмуляция браузера § Увеличить ее с 4 до 400 § Жить спокойно до следующего падения Несколько историй из жизни Performance Engineer'а. 2014
  • 30.
    Почему это работает §Потому что это и есть нормальный инженерный подход, а именно: § Измерить (получить метрики) § Выработать план (проанализировать метрики) § Внести полезные изменения § Снова измерить Несколько историй из жизни Performance Engineer'а. 2014
  • 31.
    Почему было сложно §Несмотря на верность в целом, описанный подход имеет ряд недостатков: § Невозможно предсказать время его сходимости в общем виде § Он вообще может не сойтись в общем виде по объективным причинам § Альтернативные отличные идеи (“всё переписать”, etc) Несколько историй из жизни Performance Engineer'а. 2014
  • 32.
    Все переписать! § Итак,что лучше, Perl, Ruby или PHP? § В неравенстве Perl <> Ruby <> PHP, в конечном счете, где-то должны находиться и вы сами § И если вы хуже и чем Perl, и чем Ruby, и чем PHP — у вас не получится НИЧЕГО § Для CPU-bound задач берите что-нибудь, что поближе к железу, чем перечисленные не-JIT-enabled скриптовые поделки* Несколько историй из жизни Performance Engineer'а. 2014 * есть всякие наработки и для них
  • 33.
    Случай на производстве№7 (повсеместный) § Клиент хостился на Хетцнере § ОДНАЖДЫ в зеркале сломался первый диск § Через некоторое время сломался и второй § Когда все это заметили — данные уже были немножко потеряны Несколько историй из жизни Performance Engineer'а. 2014
  • 34.
    Решение №7 (необходимое) §Завести бэкапы! § При чем же тут performance? § Pooling, compression, deduplication... § ^ BackupPC отлично подходит, но... § rsync очень сильно нагружает дисковую подсистему машины-клиента § Опция --bwlimit=500 (или сколько можете) Несколько историй из жизни Performance Engineer'а. 2014
  • 35.
    Почему это (не)работает § Зачем нужны бэкапы? § Затем, чтобы однажды ими воспользоваться, например... § Развернуть систему из бэкапа целиком! § Бэкап сотен гигабайт будет разворачиваться несколько суток § ^ Для начала просто задумайтесь об этом Несколько историй из жизни Performance Engineer'а. 2014
  • 36.
    Выводы § Старайтесь всегдаточно знать, где вы находитесь § Измеряйте § Планируйте § Не паникуйте § В сложной ситуации делайте что-нибудь красиво § Все хорошо будет Несколько историй из жизни Performance Engineer'а. 2014
  • 37.
    С вами былАлександр Чистяков, главный инженер Git in Sky alex@gitinsky.com http://gitinsky.com http://meetup.com/DevOps-40 Пожалуйста, ваши вопросы. Спасибо за внимание!