Мониторинг производительности
приложения
pinba + graphite
Наш подход в Lingualeo
Сервис помогающий изучать Английский язык
- 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
- Мониторинг программной и аппаратной
инфраструктуры
(Zabbix, Icinga, Munin)
- Мониторинг пользовательской активности
(Google Analytics Alerts, внутренняя аналитика )
- Функциональный мониторинг
(Zabbix+Selenium+BrowserMob, site24x7.com)
- Мониторинг производительности приложения
(pinba, xhprof, NewRelic)
Виды мониторинга
- Измерение и анализ времени на обработку
всего запроса на application серверах
- Измерение и анализ времени загрузки страниц и
ajax запросов в браузере
- Измерение потребления ресурсов RAM и CPU на
application серверах
- Мониторинг кол-ва ошибок при обработке
запроса
Мониторинг производительности приложения это:
- Отвечает на вопрос какие именно участки кода
тормозят, но не отвечает на вопрос ПОЧЕМУ
- Помогает понять, какое влияние на скорость
обработки запросов оказывает то или иное
изменение в коде
- Помогает принять быстрое решение в случае
«выкатили новый релиз и все вкорячило»
Цели и особенности мониторинга производительности
Почему 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 за
сервер
Почему 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) Высокая, но рисовать
ОЧЕНЬ сложно
Скорость отрисовки
графиков
быстро для простых
графиков
для сложных графиков
упирается в диски
Быстрая Быстро для простых
графиков
для сложных графиков
упирается в диски
Итоговая схема сбора метрик
deployment Pinba Data Flow
autoscale-XX
«executionEnvironment»
PHP-FPM + pinba extension
notes
запуск php кода
замер времени исполнения
AWS ELB
AWS 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
значение метрик с диска и из кеша
Основной dashboard (время в UTC)
Распределение по времени выполнения
Распределение по времени выполнения
Какой модуль тормозит
Где тормозит API
Перцентили и average response time
Перцентиль 90 – означает что 90% запросов длятся не более 0.25-0.45 секунды
Ищем bottleneck’s пример 1 шаг 1
15 мая 2014 17:20 MSK
Симптомы
Кол-во «тормозящих» скриптов очень мало, но они занимают php-fpm child
в результате все остальные скрипты ждут очереди от nginx, autoscale масштабируется, но
полностью проблему не решает, сайт работает но «подтормаживает»
Ищем bottleneck’s пример 1 шаг 2
Модули и API не тормозят. Значит проблема не в framework (index.php)
Ищем bottleneck’s пример 1 шаг 3
Нашли ЧТО тормозит - тормозит getsound.php, но мониторинг не скажет почему тормозит, для
этого надо знать код
1) скрипт является прокси сервисом к стороннему HTTP API
2) напрямую скрипт не вызывается, но прописан как Origin к CDN Amazon CloudFront
3) стороннее API упало и скрипт подвисает на HTTP timeout при обращении к стороннему
сервису
Решение – уменьшить connection и read timeout для работы со сторонним API, кидать
дополнительный Exception и настроить ALERT по нему в Graylog
Ищем bottleneck’s пример 2 шаг 1
24 апреля 2014 14:10 MSK
Симптомы
Резко начал «вкорячивать» index.php, статика и генерированный html грузится (CDN), AJAX нет, сайт
«почти лежит»
Ищем bottleneck’s пример 2 шаг 2
Судя по графикам тормозят все AJAX, но больше всех userdict/getTranslations
но почему?
Анализ кода показал что в этом месте ведется активное общение с MySQL, дальше SHOW PROCCESSLIST
помог локализовать запрос с тяжелым дисковым IO и убить его.
Системная оптимизация пример 1 шаг 1
На dashboard есть вот такой график
Анализ кода показал что для api_getUntrainedWordsCount, делается прямой
SQL запрос по PrimaryKey
Кеширование запроса позволило в 7 раз снизить общее время на
обработку этого action
(к сожалению это было год назад а метрики мы храним всего пол года)
Системная оптимизация пример 1 шаг 2
Второй шаг оптимизации простое сокращение частотности обращения к API
на клиенте
Итоговые принципы
Не смотрите МИНИМУМ (в идеале он должен стремиться к нулю ;)
Смотрите «распределение по гистограмме»
мы используем 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
Полезные ссылки
Как ставить и настраивать Graphite
http://graphite.wikidot.com
Как ставить и настраивать PINBA
http://pinba.org
Блог в котором время от времени я пишу
http://slach.livejournal.com/
Вопросы из зала и контакты
СПАСИБО ЗА ТО, ЧТО УДЕЛИЛИ ВРЕМЯ ;)
Я ГОТОВ ОТВЕТИТЬ НА ЛЮБЫЕ ВОПРОСЫ
ЕСЛИ ЧТО ПИШИТЕ
bloodjazman@gmail.com
skype: bloodjazman

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

  • 1.
  • 2.
    Сервис помогающий изучатьАнглийский язык - 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
  • 3.
    - Мониторинг программнойи аппаратной инфраструктуры (Zabbix, Icinga, Munin) - Мониторинг пользовательской активности (Google Analytics Alerts, внутренняя аналитика ) - Функциональный мониторинг (Zabbix+Selenium+BrowserMob, site24x7.com) - Мониторинг производительности приложения (pinba, xhprof, NewRelic) Виды мониторинга
  • 4.
    - Измерение ианализ времени на обработку всего запроса на application серверах - Измерение и анализ времени загрузки страниц и ajax запросов в браузере - Измерение потребления ресурсов RAM и CPU на application серверах - Мониторинг кол-ва ошибок при обработке запроса Мониторинг производительности приложения это:
  • 5.
    - Отвечает навопрос какие именно участки кода тормозят, но не отвечает на вопрос ПОЧЕМУ - Помогает понять, какое влияние на скорость обработки запросов оказывает то или иное изменение в коде - Помогает принять быстрое решение в случае «выкатили новый релиз и все вкорячило» Цели и особенности мониторинга производительности
  • 6.
    Почему pinba? Характеристика PinbaXHProf 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 за сервер
  • 7.
    Почему 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) Высокая, но рисовать ОЧЕНЬ сложно Скорость отрисовки графиков быстро для простых графиков для сложных графиков упирается в диски Быстрая Быстро для простых графиков для сложных графиков упирается в диски
  • 8.
    Итоговая схема сбораметрик deployment Pinba Data Flow autoscale-XX «executionEnvironment» PHP-FPM + pinba extension notes запуск php кода замер времени исполнения AWS ELB AWS 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 значение метрик с диска и из кеша
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
    Перцентили и averageresponse time Перцентиль 90 – означает что 90% запросов длятся не более 0.25-0.45 секунды
  • 15.
    Ищем bottleneck’s пример1 шаг 1 15 мая 2014 17:20 MSK Симптомы Кол-во «тормозящих» скриптов очень мало, но они занимают php-fpm child в результате все остальные скрипты ждут очереди от nginx, autoscale масштабируется, но полностью проблему не решает, сайт работает но «подтормаживает»
  • 16.
    Ищем bottleneck’s пример1 шаг 2 Модули и API не тормозят. Значит проблема не в framework (index.php)
  • 17.
    Ищем bottleneck’s пример1 шаг 3 Нашли ЧТО тормозит - тормозит getsound.php, но мониторинг не скажет почему тормозит, для этого надо знать код 1) скрипт является прокси сервисом к стороннему HTTP API 2) напрямую скрипт не вызывается, но прописан как Origin к CDN Amazon CloudFront 3) стороннее API упало и скрипт подвисает на HTTP timeout при обращении к стороннему сервису Решение – уменьшить connection и read timeout для работы со сторонним API, кидать дополнительный Exception и настроить ALERT по нему в Graylog
  • 18.
    Ищем bottleneck’s пример2 шаг 1 24 апреля 2014 14:10 MSK Симптомы Резко начал «вкорячивать» index.php, статика и генерированный html грузится (CDN), AJAX нет, сайт «почти лежит»
  • 19.
    Ищем bottleneck’s пример2 шаг 2 Судя по графикам тормозят все AJAX, но больше всех userdict/getTranslations но почему? Анализ кода показал что в этом месте ведется активное общение с MySQL, дальше SHOW PROCCESSLIST помог локализовать запрос с тяжелым дисковым IO и убить его.
  • 20.
    Системная оптимизация пример1 шаг 1 На dashboard есть вот такой график Анализ кода показал что для api_getUntrainedWordsCount, делается прямой SQL запрос по PrimaryKey Кеширование запроса позволило в 7 раз снизить общее время на обработку этого action (к сожалению это было год назад а метрики мы храним всего пол года)
  • 21.
    Системная оптимизация пример1 шаг 2 Второй шаг оптимизации простое сокращение частотности обращения к API на клиенте
  • 22.
    Итоговые принципы Не смотритеМИНИМУМ (в идеале он должен стремиться к нулю ;) Смотрите «распределение по гистограмме» мы используем 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
  • 23.
    Полезные ссылки Как ставитьи настраивать Graphite http://graphite.wikidot.com Как ставить и настраивать PINBA http://pinba.org Блог в котором время от времени я пишу http://slach.livejournal.com/
  • 24.
    Вопросы из залаи контакты СПАСИБО ЗА ТО, ЧТО УДЕЛИЛИ ВРЕМЯ ;) Я ГОТОВ ОТВЕТИТЬ НА ЛЮБЫЕ ВОПРОСЫ ЕСЛИ ЧТО ПИШИТЕ bloodjazman@gmail.com skype: bloodjazman