24
Мониторинг производительности приложения pinba + graphite Наш подход в Lingualeo

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

  • Upload
    slach

  • View
    87

  • Download
    5

Embed Size (px)

Citation preview

Page 1: мониторинг производительности приложения на PINBA

Мониторинг производительности приложения

pinba + graphite

Наш подход в Lingualeo

Page 2: мониторинг производительности приложения на PINBA

Сервис помогающий изучать Английский язык

- 9 000 000 пользователей- 100-150k DAU (website), 300k DAU (Mobile)- 1.5M MAU (website), 900k MAU (Mobile)

- nginx, PHP, sphinx, redis, memcache, mysql- 400 rps в пике к динамике (12 rps на ядро AWS)

Коротко о Lingualeo

Page 3: мониторинг производительности приложения на PINBA

- Мониторинг программной и аппаратной инфраструктуры (Zabbix, Icinga, Munin)

- Мониторинг пользовательской активности(Google Analytics Alerts, внутренняя аналитика )

- Функциональный мониторинг(Zabbix+Selenium+BrowserMob, site24x7.com)

- Мониторинг производительности приложения(pinba, xhprof, NewRelic)

Виды мониторинга

Page 4: мониторинг производительности приложения на PINBA

- Измерение и анализ времени на обработку всего запроса на application серверах

- Измерение и анализ времени загрузки страниц и ajax запросов в браузере

- Измерение потребления ресурсов RAM и CPU на application серверах

- Мониторинг кол-ва ошибок при обработке запроса

Мониторинг производительности приложения это:

Page 5: мониторинг производительности приложения на PINBA

- Отвечает на вопрос какие именно участки кода тормозят, но не отвечает на вопрос ПОЧЕМУ

- Помогает понять, какое влияние на скорость обработки запросов оказывает то или иное изменение в коде

- Помогает принять быстрое решение в случае «выкатили новый релиз и все вкорячило»

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

Page 6: мониторинг производительности приложения на PINBA

Почему pinba?

Характеристика Pinba XHProf NewRelic

Нужен extension? Да (но есть purePHP реализация)

Да Да

Нужно переделывать код?

Да Да (но незначительно) Да

Можно ли мониторить что-то кроме времени

Да, CPU (rusage,susage), RAM

Да, RAM, CPU Да, много чего

Где хранит метрики MySQL MongoDB/файлы Cloud

Легковесность Да Относительно, сбор быстрый но save_run это вставка в Mongo

Да

Стоимость Free + 50 USD/месяц сам сервер мониторинга

Free + 50 USD/месяц сам сервер мониторинга

~500USD month для small bussines, дальше 150 USD/month за сервер

Page 7: мониторинг производительности приложения на PINBA

Почему graphite?

Характеристика Graphite (Carbon) Zabbix RRDCached

Скорость сбора метрик 50k/sec (SATA) 100k/sec (SSD)

2-3k/sec (максимум 10k) 3-4k/sec (если диски SSD)

Масштабируемость Высокая (relay, proxy) Средняя (proxy) Низкая

Alerts Нет Да Нет

Где хранит метрики Whisper, Ceres MySQL RRD

Кастомизируемость графиков

Очень высокая, много альтернативных viewer’s

Средняя (есть reports) Высокая, но рисовать ОЧЕНЬ сложно

Скорость отрисовки графиков

быстро для простых графиковдля сложных графиков упирается в диски

Быстрая Быстро для простых графиковдля сложных графиков упирается в диски

Page 8: мониторинг производительности приложения на PINBA

Итоговая схема сбора метрикdeployment Pinba Data Flow

autoscale-XX

«executionEnvironment»PHP-FPM + pinba extension

notesзапуск php кодазамер времени исполненияAWS ELBAWS EC2 (c1.small) autoscale group

monitor

«executionEnvironment»MySQL + pinba-engine

«executionEnvironment»pinba2graphite.php 1 раз в минуту

User

«executionEnvironment»Carbon Daemon (Whisper)

notesчасть данных кешируется в памяти,часть данных flush на диск в Whisperфайлы

«executionEnvironment»graphite (uwsgi + nginx + memcache)

protobuf over UDP

аггрегирующий SQL запрос

time + metric name + value over TCP

view dashboards over HTTP

значение метрик с диска и из кеша

Page 9: мониторинг производительности приложения на PINBA

Основной dashboard (время в UTC)

Page 10: мониторинг производительности приложения на PINBA

Распределение по времени выполнения

Page 11: мониторинг производительности приложения на PINBA

Распределение по времени выполнения

Page 12: мониторинг производительности приложения на PINBA

Какой модуль тормозит

Page 13: мониторинг производительности приложения на PINBA

Где тормозит API

Page 14: мониторинг производительности приложения на PINBA

Перцентили и average response time

Перцентиль 90 – означает что 90% запросов длятся не более 0.25-0.45 секунды

Slach
Page 15: мониторинг производительности приложения на PINBA

Ищем bottleneck’s пример 1 шаг 1

15 мая 2014 17:20 MSKСимптомы

Кол-во «тормозящих» скриптов очень мало, но они занимают php-fpm childв результате все остальные скрипты ждут очереди от nginx, autoscale масштабируется, но полностью проблему не решает, сайт работает но «подтормаживает»

Slach
Page 16: мониторинг производительности приложения на PINBA

Ищем bottleneck’s пример 1 шаг 2

Модули и API не тормозят. Значит проблема не в framework (index.php)

Slach
Page 17: мониторинг производительности приложения на PINBA

Ищем bottleneck’s пример 1 шаг 3

Нашли ЧТО тормозит - тормозит getsound.php, но мониторинг не скажет почему тормозит, для этого надо знать код1) скрипт является прокси сервисом к стороннему HTTP API2) напрямую скрипт не вызывается, но прописан как Origin к CDN Amazon CloudFront3) стороннее API упало и скрипт подвисает на HTTP timeout при обращении к стороннему сервису

Решение – уменьшить connection и read timeout для работы со сторонним API, кидать дополнительный Exception и настроить ALERT по нему в Graylog

Slach
Page 18: мониторинг производительности приложения на PINBA

Ищем bottleneck’s пример 2 шаг 1

24 апреля 2014 14:10 MSKСимптомыРезко начал «вкорячивать» index.php, статика и генерированный html грузится (CDN), AJAX нет, сайт «почти лежит»

Slach
Page 19: мониторинг производительности приложения на PINBA

Ищем bottleneck’s пример 2 шаг 2

Судя по графикам тормозят все AJAX, но больше всех userdict/getTranslationsно почему?

Анализ кода показал что в этом месте ведется активное общение с MySQL, дальше SHOW PROCCESSLIST помог локализовать запрос с тяжелым дисковым IO и убить его.

Slach
Page 20: мониторинг производительности приложения на PINBA

Системная оптимизация пример 1 шаг 1

На dashboard есть вот такой график

Анализ кода показал что для api_getUntrainedWordsCount, делается прямой SQL запрос по PrimaryKeyКеширование запроса позволило в 7 раз снизить общее время на обработку этого action (к сожалению это было год назад а метрики мы храним всего пол года)

Slach
Page 21: мониторинг производительности приложения на PINBA

Системная оптимизация пример 1 шаг 2

Второй шаг оптимизации простое сокращение частотности обращения к APIна клиенте

Slach
Page 22: мониторинг производительности приложения на PINBA

Итоговые принципы

Не смотрите МИНИМУМ (в идеале он должен стремиться к нулю ;)

Смотрите «распределение по гистограмме» мы используем 0.2, 0.5, 1.0, 2.0 sec для pinba_sripts и0.1, 0.2, 0.5, 1.0, 1.0 для pinba_tags

Для оценки мгновенных изменений лучше не смотреть «среднее время»

Для оценки качественных изменений, лучше смотреть перцентили (98%)

Снижение количества обращений к серверу может такой же хорошей оптимизацией как и уменьшение времени работы отдельного URL

Slach
Page 23: мониторинг производительности приложения на PINBA

Полезные ссылки

Как ставить и настраивать Graphitehttp://graphite.wikidot.com

Как ставить и настраивать PINBAhttp://pinba.org

Блог в котором время от времени я пишуhttp://slach.livejournal.com/

Slach
Page 24: мониторинг производительности приложения на PINBA

Вопросы из зала и контакты

СПАСИБО ЗА ТО, ЧТО УДЕЛИЛИ ВРЕМЯ ;)

Я ГОТОВ ОТВЕТИТЬ НА ЛЮБЫЕ ВОПРОСЫ

ЕСЛИ ЧТО ПИШИТЕ [email protected]: bloodjazman

Slach