$30 off During Our Annual Pro Sale. View Details »

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

Badoo Tech
April 09, 2018
8.5k

«Профилирование 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. Профилирование PHP кода в Badoo
    XHProf aggregator

    View Slide

  2. g.k[email protected] https://www.linkedin.com/in/kuzovnikov/
    Григорий Кузовников
    Разработчик Badoo

    View Slide

  3. Время ответа на запрос

    View Slide

  4. Время ответа на запрос
    rusage

    View Slide

  5. Время ответа на запрос

    View Slide

  6. Результаты
    • ответ в среднем быстрее на 25мс;
    • это на 20% быстрее;
    • на 20% меньше памяти и rusage на
    кластере

    View Slide

  7. Причины
    • быстро меняется код;
    • нагрузка растёт;
    • гибкий API.

    View Slide

  8. Инструменты профилирования

    View Slide

  9. XDebug Плюсы
    • хороший отладчик;
    • интеграция с IDE.
    Минусы
    • отладчик возможностями
    профайлера;
    • искажает результаты;
    • не стоит запускать в бою.

    View Slide

  10. Pinba Плюсы
    • Минимально искажает результаты
    • Включается руками в нужных методах
    • Можно вызывать часто
    Минусы
    • Не включить для всех методов
    • Нет контекста вызова

    View Slide

  11. XHProf Плюсы
    • минимально искажает результаты;
    • можно запустить изнутри PHP кода;
    • подходит для production-а.
    Минусы
    • нет отладчика, но нам он и не нужен

    View Slide

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

    View Slide

  13. XHProf

    View Slide

  14. • sudo pecl install -f xhprof
    • php.ini: extension=xhprof.so
    • Health and Safety
    Использование

    View Slide

  15. • php extension в 2000 строк кода на C;
    • проксирует вызовы функций, измеряет их;
    • возвращает результат в виде массива;
    • массив пакуется в строку, сжимается и кладётся в базу.
    Как работает XHProf

    View Slide

  16. View Slide

  17. View Slide

  18. Что неудобно
    • статистика по одному вызову;
    • много шума;
    • нет истории.

    View Slide

  19. XHProf aggregator

    View Slide

  20. Скрипт на коленке
    [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|...) >

    View Slide

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

    View Slide

  22. Что собираем
    • все вызовы API (не чаще раза в минуту);
    • запуски профайлера вручную.
    Как собираем
    • специальный метод для запуска профайлера;
    • результаты пишутся в базу на shutdown-е.

    View Slide

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

    View Slide

  24. View Slide

  25. View Slide

  26. View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. t
    I II III IV

    View Slide

  31. Результаты
    • история изменения всех API методов;
    • быстрый поиск проблем производительности;
    • одного xhprof aggregator недостаточно.

    View Slide

  32. В заключение

    View Slide

  33. Наша статистика
    • ~1200 снапшотов в день;
    • ~5Мб на снапшот;
    • через год будет 2Тб;
    • пересчёт занимает 3.5 часа в 6 потоков;
    • пересчёт каждого снапшота требует от 50мб до 2Гб памяти;
    • в каждом снапшоте сагрегированные данные от 1 до 1440 профилей.

    View Slide

  34. Планы
    • улучшить интерфейс;
    • учесть пожелания коллег;
    • вывести в opensource.

    View Slide

  35. XHProf Console
    https://github.com/badoo/xhprof_console
    • Health and Safety
    • настройки заполняются в специальный файл;
    • извлекает данные;
    • аггрегирует;
    • выводит статистику в консоли;
    • позволяет ходить по дереву вызовов.

    View Slide

  36. Thank you!

    View Slide