Upload
slach
View
87
Download
5
Embed Size (px)
Citation preview
Мониторинг производительности приложения
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 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
значение метрик с диска и из кеша
Основной 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 API2) напрямую скрипт не вызывается, но прописан как Origin к CDN Amazon CloudFront3) стороннее 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
Полезные ссылки
Как ставить и настраивать Graphitehttp://graphite.wikidot.com
Как ставить и настраивать PINBAhttp://pinba.org
Блог в котором время от времени я пишуhttp://slach.livejournal.com/
Вопросы из зала и контакты
СПАСИБО ЗА ТО, ЧТО УДЕЛИЛИ ВРЕМЯ ;)
Я ГОТОВ ОТВЕТИТЬ НА ЛЮБЫЕ ВОПРОСЫ
ЕСЛИ ЧТО ПИШИТЕ [email protected]: bloodjazman