Сравнение сеансов профилирования в XHProf Admin

    В статье рассказывается об удобном инструменте сравнения сеансов профилирования PHP кода, который позволил быстрее найти узкие места в проекте на CMS Битрикс.


    Из далека


    В июле обновили Битрикс до последней на тот момент версии… И скорость загрузки страниц просела: где-то на 20%, где-то на 300+%. Особенно на этапах оформления заказа клиентом.


    Цифры внушительные и печальные. Почему обновились?


    N|Solid


    Т.е. был риск того, что если не обновимся, придется решать сразу две задачи: собственно обновление Битрикса и обновление своей кодовой базы до PHP > 7.1.


    Причина тормозов


    Причина самых больших тормозов, как оказалось – это новая кодовая логика работы с профилями доставок. По коду сделали правильнее, что ли: появились отгрузки, как отдельные сущности. Теперь заказ может быть отправлен несколькими отгрузками (со своими характеристиками по стоимости, способу доставки и составу товаров).


    Однако, теперь профиль доставки – это отдельная запись в БД со своими ограничениями из ядра Битрикса, которые лопатятся каждый раз, когда нужно проверить возможность показа этого профиля при оформлении заказа.


    В целом в статье речь пойдет не о том, что именно переделывали, чтобы справиться с тормозами, а об инструменте, который позволил быстрее найти узкие места в коде и исправить их.


    XHProf Admin


    В нашем распоряжении был популярный профилировщих от Facebook – XHProf. Недостатки, тормозящие работу с инструментом, относятся к его GUI:


    • Отсутствие внятной навигации между сеансами профилирования
    • Невозможность сравнить более двух сеансов одновременно вне одного namespace.
    • В списке сеансов нельзя делать комментарии к ним. После десятого сеанса уже забываешь, к каким изменениям относятся предыдущие результаты профилирования.

    В итоге, посмотрев на ИСХОДНИКИ нативного GUI XHProf, и, немного ужаснувшись, был написан новый GUI для него, закрывающий перечисленные недостатки.


    Установка


    Ссылка на проект


    Как установить XHProf и профилировать описывать не буду, на хабре как минимум несколько хороших туториалов.


    Для установки XHProf Admin нужно положить в папку xhprof_html нативного XHProf папку xhprof_admin. Либо склонировать весь проект (он уже содержит и XHProf, и новый GUI).


    Затем открыть страницу <Путь к xhprof>/xhprof_html/xhprof_admin/
    Если включен маппинг, как рекомендуют сделать в документации, то нужно открыть <Путь к xhprof>/xhprof_admin/


    Главная страница


    N


    Содержит:


    • Список всех сеансов профилирования, упорядоченных по дате
    • Поля для ввода комментария к сеансам
    • Галки, с помощью которых можно выбрать сеансы для удаления, сравнения, агрегирования
    • Ссылка на новый отчет
    • Ссылки на нативный отчёт и callgraph
    • Поля для указания веса сеанса для режима Diff и Aggregate
    • Поле, задающее последовательность, в которой будут выводиться сеансы в режиме Compare, а также в режиме Diff
    • Кнопки:
      • Compare — сравнивает выбранные сеансы (новый отчет)
      • Diff — стандартный отчет для сравнения сеансов в одном namespace
      • Aggregate — стандартный отчет с агрегацией сеансов в одном namespace
      • Save custom comments — сохраняет комментарий к сеансу (в отдельном файле)
      • Delete selected runs — удаляет файлы сеансов и файлы комментариев
      • Ссылка на нативную страницу со списком сеансов

    View original report, Diff runs, Aggregate runs, View callgraph — нативные возможности XHProf GUI, — их описывать не буду. Скажу только, что XHProf Admin позволяет удобно перейти к ним, а не составлять вручную ссылки.


    Compare runs


    N|Solid


    Новый отчет, позволяющий быстро оценить прирост или регресс в производительности.
    Чтобы им воспользоваться, на главной странице:


    • Выбираем сеансы, которые хотим сравнить.
    • Задаем поле сортировки "Sort", чтобы определить порядок вывода сеансов: чем меньше значение поля, тем раньше выведется сеанс. Самый первый сеанс будет взят за базовый — относительно него будут сравниваться все последующие сеансы.
    • Если хотим вывести средние значения метрик, то отмечаем "show average".
    • Нажимаем "Compare".
      N|Solid

    В отчёте не показывается %, который “занимает” функция для каждой метрики, чтобы его не загромождать страницу, а выводятся абсолютные значения. В случае, если для профилируемой функции между базовым сеансом и последующим имеется разница более 1% по метрике, это явно показывается: зеленым цветом — улучшение, красным — регресс.


    По умолчанию:


    • В отчете выводятся первые 100 функций. Если нужно больше — нажмите на "display all".
    • Данные отсортированы по колонке “Incl. Wall Time (microsec)”, но можно кликнуть на любую метрику и отсортировать по ней.

    Для исключения сеанса из отчёта нажмите "exclude".


    Доступна сортировка по каждой метрике — просто кликните на заголовок колонки.


    Для показа средних значений по выбранным всем сеансам нажмите “Show average values”.


    Для детализации (drill-down) по какой-либо функции можно кликнуть на ячейку на пересечении функции и метрики с показанный сеансом.


    N|Solid


    Пример использования


    1. Запустили профилировщик на исходном коде. Открыли список сеансов и добавили комментарий к нему.
    2. Запустили профилировщик на улучшенном коде. Также добавили комментарий.
    3. Сделали п.2 несколько раз.
    4. Потом открыли список сеансов профилирования, последовательно выбрали все сеансы и нажали Compare.
    5. Посмотрели изменения.
    6. Приняли решение что еще ускорять.

    XHProf Admin удобно использовать для определения часто используемых тяжелых функций, которые выполняются одним пользователем. Например, в Битриксе при оформлении заказа при переходе с одного этапа на другой (доставка, оплата, контакты и т.д.) каждый раз вызываются ряд функций для контроля целостности корзины и др. Эти этапы профилируются по отдельности, а затем выводятся вместе в отчете Compare. Результаты выполнения этих функции можно закешировать, значительно ускорив время переходов с этапа на этап.


    Итог


    В результате мы нивелировали падение скорости на этапах оформления заказа при обновлении Битрикса, попутно проанализировав другие разделы сайта и ускорив их.
    Время от времени используем XHProf Admin на проектах, как более наглядный GUI.
    Ссылка на документацию к XHProf Admin: перейти


    Кто увлекается темой оптимизации кода и инструментами для этого пишите в комментариях.

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Как часто пользуетесь профилировщиками?

    • 7,1%Постоянно1
    • 71,4%Только когда прижмет10
    • 21,4%Что это?3
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 4

      0
      Самое узкое место битрикса — это сам битрикс. Грустно что если говорить про синхронизацию чего либо с 1С бухгалтерией (и при этом иметь CMS), то нормальных альтернатив особо и нет.
        +2
        … с 1С бухгалтерией (и при этом иметь CMS), то нормальных альтернатив особо и нет...

        Именно эта мантра позволяет компании 1С продавать его многие годы за бешеные (для такого качества) бабки и в огромных количествах.
        С 1С вяжется все, что умеет парсить XML. Все остальное вяжется через кросс-формат.
          0
          Самое узкое место битрикса — это сам битрикс.

          Ну, в некоторых ситуациях, при грамотном использовании и простом проекте, битрикс вполне может быстро отдавать странички.
          0

          Удивительно, что Эльдорадо на Битриксе работает. Ещё интереснее, как у них проходит обновление платформы, потому что ребята из Битрикс часто не думают об обратной совместимости при смене версий.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.