Профилирование — это измерение, а не догадки. Прежде чем оптимизировать highload-проект на Битрикс, нужно точно знать, сколько времени уходит на PHP, сколько на SQL и какой участок кода виноват. Разберём инструменты и метод, который даёт воспроизводимый результат.
Что измеряем и в каких метриках
Производительность страницы Битрикс складывается из нескольких составляющих, и путать их нельзя. Базовые метрики, за которыми следим:
- Время генерации — сколько PHP считал страницу (виден внизу через
$APPLICATION->ShowPageStatistic()или панель разработчика); - Число SQL-запросов и суммарное время в БД;
- Пиковая память (
memory_get_peak_usage); - Хиты и промахи кэша — сколько компонентов отдалось из кэша.
Включить детальную статистику можно константой define('SHOW_SQL_STAT', true) в /bitrix/php_interface/dbconn.php — тогда панель покажет полный список SQL-запросов с временем каждого.
Монитор производительности Битрикс
Штатный модуль perfmon — первая точка входа. Он лежит в Настройки → Производительность и умеет:
- оценивать конфигурацию (BUS-тест) и сверять её с рекомендованной;
- записывать трассировку хита — сколько времени заняли компоненты, события и SQL на конкретной странице;
- собирать статистику по таблицам и запросам за период.
Запустите запись трассировки на реальном сценарии (каталог, карточка товара, оформление заказа) и посмотрите разбивку по компонентам. Часто виден один «тяжёлый» компонент, съедающий половину времени, — например, умный фильтр без facet-индекса или меню без кэша.
Профилирование PHP: Xhprof и Blackfire
Когда нужно понять, какая именно функция тормозит, монитора мало — нужен профайлер уровня вызовов. Битрикс интегрирован с Xhprof: включается в /bitrix/php_interface/dbconn.php и даёт дерево вызовов с временем и памятью по каждой функции.
| Инструмент | Когда применять |
|---|---|
| Xhprof / Tideways | Поиск тяжёлых функций, деревьев вызовов, N+1 |
| Blackfire | Регулярное профилирование на staging, сравнение до/после |
| XDebug profiler | Локальная отладка, cachegrind-дампы (медленно, не для prod) |
Смотрите на inclusive и exclusive время: первое включает вложенные вызовы, второе — только саму функцию. Дублирующиеся вызовы одной функции сотни раз — верный признак N+1 или отсутствия кэша.
Трейсинг SQL и медленные запросы
Если время утекает в БД, работают два инструмента. Первый — панель SQL Битрикс с включённым SHOW_SQL_STAT: она покажет каждый запрос страницы, его время и, что важно, место в коде, откуда он вызван (backtrace).
Второй — серверный slow query log MySQL:
slow_query_log = 1иlong_query_time = 0.5;- анализ через
pt-query-digest— он группирует похожие запросы и показывает топ по суммарному времени; EXPLAINна подозрительных выборках для проверки индексов.
Важно смотреть не на самый медленный единичный запрос, а на суммарное время: сотня запросов по 20 мс вреднее одного на 500 мс, потому что повторяется на каждом хите.
Нагрузочное тестирование: профиль под RPS
Профилирование одиночного хита не показывает, как поведёт себя проект под нагрузкой. Для этого нужен нагрузочный тест, воспроизводящий реальный сценарий:
- сформируйте профиль запросов — доли главной, каталога, карточек, поиска, оформления;
- прогоните
k6,JMeterилиyandex-tankс нарастающим RPS; - снимайте метрики сервера параллельно: CPU, память, число коннектов MySQL, попадания в кэш.
Под нагрузкой всплывают проблемы, невидимые на одном хите: блокировки в БД, исчерпание пула PHP-FPM (pm.max_children), нехватка коннектов Redis. Именно нагрузочный тест показывает реальный потолок проекта до его выхода в прод.
Метод: как не утонуть в цифрах
Инструментов много, но без дисциплины они дают шум. Рабочая методика:
- Фиксируйте baseline — замер до любых правок в одинаковых условиях;
- Одна гипотеза — одно изменение — повторный замер;
- оптимизируйте по принципу Парето: сначала то, что даёт 80% выигрыша (обычно 1–2 узких места);
- не оптимизируйте то, что не измерено как проблема, — «преждевременная оптимизация» тратит время впустую.
Итог
Профилирование Битрикс идёт от общего к частному: монитор perfmon показывает, где болит (PHP, SQL, компонент), Xhprof и Blackfire — какая функция виновата, slow log и EXPLAIN — какие запросы неоптимальны, а нагрузочный тест — где проект упрётся в потолок. Метод важнее инструмента: измеряй, меняй по одному, перепроверяй.
Мы в B2Bsite профилируем highload-проекты под реальным нагрузочным профилем, находим корневые причины и приводим код и БД в порядок с подтверждением цифрами до и после. Если нужно понять, почему проект не держит нагрузку, — поможем измерить и устранить причину, а не симптомы.
Частые вопросы
Чем монитор perfmon отличается от Xhprof?
Perfmon показывает разбивку хита по компонентам, событиям и SQL — где именно теряется время на уровне Битрикс. Xhprof спускается ниже, до конкретных PHP-функций и дерева вызовов, и нужен, когда виновник не очевиден.
Как включить полную статистику SQL на странице?
Добавьте define('SHOW_SQL_STAT', true) в /bitrix/php_interface/dbconn.php. Тогда панель разработчика покажет список всех запросов страницы с временем и местом вызова в коде.
Можно ли профилировать XDebug на проде?
Нет. XDebug сильно замедляет выполнение и искажает пропорции времени. На проде используйте семплирующие профайлеры с низким оверхедом — Xhprof, Tideways или Blackfire.
На что смотреть в slow query log в первую очередь?
На суммарное время группы запросов, а не на единичный самый медленный. Частый запрос на 20 мс, повторяющийся на каждом хите, вреднее редкого запроса на 500 мс. Группируйте через pt-query-digest.
Что такое inclusive и exclusive время в профайлере?
Inclusive — время функции вместе со всеми вложенными вызовами, exclusive — только код самой функции. Высокое exclusive указывает на тяжёлую функцию, высокое inclusive при большом числе вызовов — на N+1.
Зачем нужно нагрузочное тестирование, если хит уже быстрый?
Одиночный быстрый хит не гарантирует поведения под нагрузкой. Под RPS всплывают блокировки БД, исчерпание пула PHP-FPM и нехватка коннектов. Только нагрузочный тест показывает реальный потолок.
Как избежать преждевременной оптимизации?
Оптимизируйте только то, что измерено как проблема. Фиксируйте baseline, меняйте по одной гипотезе за раз и перепроверяйте. Правки без замера часто не дают эффекта или ухудшают ситуацию.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.