Upgrade to Pro — share decks privately, control downloads, hide ads and more …

«Профилирование PHP кода в Badoo: XHProf aggreg...

Badoo Tech
April 09, 2018
8.6k

«Профилирование PHP кода в Badoo: XHProf aggregator» — Григорий Кузовников, Badoo

Выступление на Badoo PHP Meetup 7.04.2018.

Григорий расскажет, почему код нужно периодически профилировать, и как это делать при помощи XHProf. Он также объяснит, почему функционала оригинального XHProf недостаточно, и покажет наше решение — XHProf aggregator — которое дает на порядок больше возможностей. Доклад будет полезен всем, кто в поисках подходящего проекту инструмента или пользуется XHProf, но не очень им доволен.

Badoo Tech

April 09, 2018
Tweet

More Decks by Badoo Tech

Transcript

  1. Результаты • ответ в среднем быстрее на 25мс; • это

    на 20% быстрее; • на 20% меньше памяти и rusage на кластере
  2. XDebug Плюсы • хороший отладчик; • интеграция с IDE. Минусы

    • отладчик возможностями профайлера; • искажает результаты; • не стоит запускать в бою.
  3. Pinba Плюсы • Минимально искажает результаты • Включается руками в

    нужных методах • Можно вызывать часто Минусы • Не включить для всех методов • Нет контекста вызова
  4. XHProf Плюсы • минимально искажает результаты; • можно запустить изнутри

    PHP кода; • подходит для production-а. Минусы • нет отладчика, но нам он и не нужен
  5. Другие профайлеры Z-Ray, Blackfire, Tideways, … Возможности • дерево вызовов;

    • отчёты по нескольким профилям; • SQL запросы. Минусы • нет истории; • нет перцентилей.
  6. • sudo pecl install -f xhprof • php.ini: extension=xhprof.so •

    Health and Safety Использование
  7. • php extension в 2000 строк кода на C; •

    проксирует вызовы функций, измеряет их; • возвращает результат в виде массива; • массив пакуется в строку, сжимается и кладётся в базу. Как работает XHProf
  8. Скрипт на коленке [email protected]:~> php xhprof_console.php f.php \Fetching data... SQL

    request start SQL done Fetched 300 rows; 606M memory used Fetched all rows Aggregating... PATH: -> main() ==== Self Stat ==== # AVG_CT min_ct max_ct min_wt AVG_WT PERCENT_WT max_wt mark method 1.00 1.00 1.00 85,226 235,324 455,160 887,596 main() ==== Children ==== # AVG_CT min_ct max_ct min_wt AVG_WT PERCENT_WT max_wt mark method 1 1.00 1.00 1.00 85,203 235,302 455,129 887,564 MobileFrontController::run ==== Parents ==== # AVG_CT min_ct max_ct min_wt AVG_WT PERCENT_WT max_wt mark method command (q|0 - go back|1|2|3|...|m1|m2|m3|...|wts1|wts2|...) >
  9. Терминология • профиль — результат работы XHProf; • снапшот —

    статистика из нескольких профилей; • Application – название приложения, от которого был запрос; • Label – произвольная строка, которой помечаются однотипные профили (в нашем случае Label – название метода API).
  10. Что собираем • все вызовы API (не чаще раза в

    минуту); • запуски профайлера вручную. Как собираем • специальный метод для запуска профайлера; • результаты пишутся в базу на shutdown-е.
  11. Аргегатор • запускается по ночам; • пересчитывает снапшоты за вчера,

    агрегируя по паре app + label; • считаем: среднее, 90-ый перцентиль, min, max; • считаем для: memory, rusage, wall time.
  12. Результаты • история изменения всех API методов; • быстрый поиск

    проблем производительности; • одного xhprof aggregator недостаточно.
  13. Наша статистика • ~1200 снапшотов в день; • ~5Мб на

    снапшот; • через год будет 2Тб; • пересчёт занимает 3.5 часа в 6 потоков; • пересчёт каждого снапшота требует от 50мб до 2Гб памяти; • в каждом снапшоте сагрегированные данные от 1 до 1440 профилей.
  14. XHProf Console https://github.com/badoo/xhprof_console • Health and Safety • настройки заполняются

    в специальный файл; • извлекает данные; • аггрегирует; • выводит статистику в консоли; • позволяет ходить по дереву вызовов.