Slide 1

Slide 1 text

Профилирование PHP кода в Badoo XHProf aggregator

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

XHProf

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

XHProf aggregator

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

No content

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

t I II III IV

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

В заключение

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

Thank you!