В статье рассказывается об удобном инструменте сравнения сеансов профилирования 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: перейти


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

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


  1. lleo_aha
    06.12.2019 09:04

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


    1. WebMonet
      06.12.2019 09:46
      +2

      … с 1С бухгалтерией (и при этом иметь CMS), то нормальных альтернатив особо и нет...

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


    1. sumanai
      07.12.2019 02:02

      Самое узкое место битрикса — это сам битрикс.

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


  1. SergeyRock Автор
    07.12.2019 07:59

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