Когда сайт на Битрикс начинает тормозить — клиенты жалуются, менеджеры нервничают, а в админке каждый клик ждёшь по 10 секунд?
Первый инструмент, который должен освоить каждый разработчик — встроенная панель производительности. Мы за 8 лет на рынке и 50+ проектах по Битрикс не раз убеждались: её данных хватает для 80% задач диагностики без внешних профайлеров. Недавно к нам обратился интернет-магазин с каталогом 50 000 товаров — страница каталога грузилась 12 секунд. После настройки панели и оптимизации SQL время упало до 1.2 секунды, экономия в 10 раз — что в пересчете на хостинг сэкономило клиенту $680–980 ежемесячно. Такие результаты типичны, когда знаешь, на что смотреть. Ниже разберём, как настроить панель, интерпретировать её показатели и провести реальную оптимизацию.
Включение панели производительности
Активируется через административный интерфейс: Настройки → Производительность → Панель производительности. Для быстрой отладки можно включить программно:
// Показывать панель для текущего пользователя $USER->SetShowStatPanel(true); // Или в dbconn.php для отладки на dev-окружении define('BX_STATPANEL', true); Панель видна только авторизованным пользователям в группе «Администраторы». На production её стоит держать включённой только при активной отладке — она сама добавляет небольшую нагрузку на сбор данных. Согласно официальной документации Битрикс, панель не влияет на скорость страницы для обычных посетителей.
Показатели панели производительности
- Время выполнения — полное время PHP + SQL в миллисекундах. Разбивка: PHP-время и время ожидания MySQL.
- Запросы к БД — количество SQL-запросов и их суммарное время. Кликните на блок — откроется список всех запросов с временем выполнения каждого.
- Кеш — количество обращений к кешу: hits (попаданий) и misses (промахов). Низкий hit rate (< 80%) — сигнал, что кеш неэффективно настроен или слишком часто инвалидируется.
- Файлы — количество подключённых PHP-файлов. 500+ файлов без OPcache — это медленная инициализация.
- Память — пиковое потребление памяти PHP-скриптом. 64 МБ+ — стоит проверить, нет ли утечек или избыточных загрузок данных.
Для удобства сведём нормальные значения в таблицу:
| Параметр | Хорошо | Требует внимания | Проблема |
|---|---|---|---|
| Время генерации | до 500 мс | 500-1500 мс | >1500 мс |
| SQL-запросы | до 50 | 50-100 | >100 |
| Hit rate кэша | >90% | 80-90% | <80% |
| Память | до 32 МБ | 32-64 МБ | >64 МБ |
| PHP-файлы | до 300 | 300-500 | >500 |
Типичные проблемы и их решения собраны в таблице ниже.
| Проблема | Признак | Решение |
|---|---|---|
| N+1 запросов | Много однотипных запросов | Использовать GetList с выборками, агрегация в ORM |
| Отсутствие индексов | Медленные запросы >50 мс | Добавить индекс на поля WHERE/ORDER |
| Низкий hit rate кэша | <80% | Настроить тегированный кэш, уменьшить инвалидацию |
Детальное профилирование SQL
Кликните на блок SQL в панели — откроется список всех запросов. Сортируйте по времени. Запросы > 50 мс — кандидаты на оптимизацию через EXPLAIN. Запросы, повторяющиеся 10+ раз с одинаковым шаблоном — N+1 проблема. Обычно это свойства элементов инфоблока, запрашиваемые поэлементно. Сравнение: правильно построенный запрос с одним JOIN работает в 10-20 раз быстрее, чем N отдельных запросов.
Настройка монитора производительности
В меню Настройки → Производительность → Монитор производительности задайте:
- Порог записи в лог — 1000 мс для production, 500 мс для staging
- Хранить записей — 1000–5000 записей в таблице
b_perf_hit - Записывать SQL — включите, чтобы видеть список запросов для медленных страниц
Просмотр лога: Настройки → Производительность → Просмотр лога. Сортируйте по суммарному времени SQL — там будут самые проблемные страницы.
Алгоритм диагностики конкретной проблемы
- Открыть медленную страницу с включённой панелью.
- Посмотреть соотношение PHP-время / SQL-время. Если SQL > 70% — оптимизируем запросы. Если PHP-время большое при небольшом SQL — проблема в коде компонентов.
- Открыть список SQL-запросов, отсортировать по времени.
- Скопировать медленный запрос, запустить
EXPLAINв MySQL Workbench или phpMyAdmin. Часто помогает добавление индекса — время запроса падает в 5-10 раз. - Добавить недостающий индекс, обновить страницу, убедиться в улучшении.
Типичная ситуация: на одном из проектов страница каталога грузилась 8 секунд. Панель показала 250 SQL-запросов. EXPLAIN выявил отсутствие индексов по полю IBLOCK_SECTION_ID. После добавления индекса страница стала грузиться за 0.8 секунды — улучшение в 10 раз.
Почему панель производительности не всегда достаточна?
Панель отлично выявляет медленные SQL-запросы и проблемы кэширования, но не показывает узкие места в асинхронном коде или внешних API-вызовах. Для глубокой диагностики мы дополнительно используем Xdebug-профилирование и мониторинг в сторону REST-сервисов (например, 1С или платежных шлюзов). Панель — первый эшелон диагностики, но не последний.
Как часто нужно проводить аудит производительности?
Рекомендуем запускать монитор производительности постоянно, а развернутый аудит проводить раз в квартал или после крупных обновлений. Это позволяет выявлять деградацию на ранних стадиях. Например, после добавления нового раздела каталога или интеграции с новым API стоит проверить, не увеличилось ли число SQL-запросов.
Состав полного аудита производительности
Если доверить диагностику нам, вы получаете:
- Полный аудит текущей производительности с использованием панели и дополнительных инструментов.
- Оптимизацию SQL-запросов: анализ EXPLAIN, добавление индексов, рефакторинг ORM-запросов.
- Настройку кэширования: тегированный кэш, HTML-кэш, композитный режим.
- Конфигурацию монитора производительности для постоянного сбора метрик.
- Итоговый отчёт с рекомендациями и планом действий.
- Гарантию на результат — зафиксируем целевые показатели времени загрузки.
Средняя экономия после нашего аудита составляет $500–1k в месяц на инфраструктурных расходах. Закажите предварительную бесплатную диагностику по панели производительности. Свяжитесь с нами для консультации по оптимизации.
Пример команды для быстрой проверки индексов
SELECT TABLE_NAME, COLUMN_NAME, INDEX_NAME, NON_UNIQUE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'your_database'; Этот запрос покажет все индексы в базе, что помогает выявить дубликаты и отсутствующие.







