В статье рассказывается об удобном инструменте сравнения сеансов профилирования PHP кода, который позволил быстрее найти узкие места в проекте на CMS Битрикс.
Из далека
В июле обновили Битрикс до последней на тот момент версии… И скорость загрузки страниц просела: где-то на 20%, где-то на 300+%. Особенно на этапах оформления заказа клиентом.
Цифры внушительные и печальные. Почему обновились?
Т.е. был риск того, что если не обновимся, придется решать сразу две задачи: собственно обновление Битрикса и обновление своей кодовой базы до 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/
Главная страница
Содержит:
- Список всех сеансов профилирования, упорядоченных по дате
- Поля для ввода комментария к сеансам
- Галки, с помощью которых можно выбрать сеансы для удаления, сравнения, агрегирования
- Ссылка на новый отчет
- Ссылки на нативный отчёт и 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
Новый отчет, позволяющий быстро оценить прирост или регресс в производительности.
Чтобы им воспользоваться, на главной странице:
- Выбираем сеансы, которые хотим сравнить.
- Задаем поле сортировки "Sort", чтобы определить порядок вывода сеансов: чем меньше значение поля, тем раньше выведется сеанс. Самый первый сеанс будет взят за базовый — относительно него будут сравниваться все последующие сеансы.
- Если хотим вывести средние значения метрик, то отмечаем "show average".
- Нажимаем "Compare".
В отчёте не показывается %, который “занимает” функция для каждой метрики, чтобы его не загромождать страницу, а выводятся абсолютные значения. В случае, если для профилируемой функции между базовым сеансом и последующим имеется разница более 1% по метрике, это явно показывается: зеленым цветом — улучшение, красным — регресс.
По умолчанию:
- В отчете выводятся первые 100 функций. Если нужно больше — нажмите на "display all".
- Данные отсортированы по колонке “Incl. Wall Time (microsec)”, но можно кликнуть на любую метрику и отсортировать по ней.
Для исключения сеанса из отчёта нажмите "exclude".
Доступна сортировка по каждой метрике — просто кликните на заголовок колонки.
Для показа средних значений по выбранным всем сеансам нажмите “Show average values”.
Для детализации (drill-down) по какой-либо функции можно кликнуть на ячейку на пересечении функции и метрики с показанный сеансом.
Пример использования
- Запустили профилировщик на исходном коде. Открыли список сеансов и добавили комментарий к нему.
- Запустили профилировщик на улучшенном коде. Также добавили комментарий.
- Сделали п.2 несколько раз.
- Потом открыли список сеансов профилирования, последовательно выбрали все сеансы и нажали Compare.
- Посмотрели изменения.
- Приняли решение что еще ускорять.
XHProf Admin удобно использовать для определения часто используемых тяжелых функций, которые выполняются одним пользователем. Например, в Битриксе при оформлении заказа при переходе с одного этапа на другой (доставка, оплата, контакты и т.д.) каждый раз вызываются ряд функций для контроля целостности корзины и др. Эти этапы профилируются по отдельности, а затем выводятся вместе в отчете Compare. Результаты выполнения этих функции можно закешировать, значительно ускорив время переходов с этапа на этап.
Итог
В результате мы нивелировали падение скорости на этапах оформления заказа при обновлении Битрикса, попутно проанализировав другие разделы сайта и ускорив их.
Время от времени используем XHProf Admin на проектах, как более наглядный GUI.
Ссылка на документацию к XHProf Admin: перейти
Кто увлекается темой оптимизации кода и инструментами для этого пишите в комментариях.
Комментарии (4)
SergeyRock Автор
07.12.2019 07:59Удивительно, что Эльдорадо на Битриксе работает. Ещё интереснее, как у них проходит обновление платформы, потому что ребята из Битрикс часто не думают об обратной совместимости при смене версий.
lleo_aha
Самое узкое место битрикса — это сам битрикс. Грустно что если говорить про синхронизацию чего либо с 1С бухгалтерией (и при этом иметь CMS), то нормальных альтернатив особо и нет.
WebMonet
Именно эта мантра позволяет компании 1С продавать его многие годы за бешеные (для такого качества) бабки и в огромных количествах.
С 1С вяжется все, что умеет парсить XML. Все остальное вяжется через кросс-формат.
sumanai
Ну, в некоторых ситуациях, при грамотном использовании и простом проекте, битрикс вполне может быстро отдавать странички.