Монитор производительности 1С-Битрикс и отладка запросов
Оптимизировать без измерений - значит гадать. В платформе есть штатный инструмент диагностики: он показывает самые нагружающие страницы, разбирает их по компонентам, ведёт журнал SQL-запросов и помогает подобрать индексы. Разберём, как им пользоваться.
Как это работает
У модуля две части. Первая - настройки: что журналировать (предупреждения PHP, кеширование, SQL-запросы, стек вызовов). Журналы пишутся в базу, и сбор идёт только при включённом мониторе. Вторая часть
- раздел отчётов, где собранное разбирают.
Ключевые отчёты.
- Панель производительности даёт интегральный балл - по сути число генераций пустой страницы в секунду. Абсолютное значение само по себе ничего не значит: его оценивают в контексте нагрузки и редакции продукта.
- Конфигурация сравнивает подсистемы с эталоном и подсвечивает типичные проблемы: нет акселератора кода, статику отдаёт не тот сервер, база не на InnoDB, PHP работает как CGI.
- Масштабируемость - встроенный нагрузочный тест.
- Разработка - двадцать самых нагружающих страниц с разбором по компонентам: сколько запросов делает каждый и кешируется ли он. Именно здесь чаще всего и находится причина тормозов - некешированные компоненты.
- Детальные журналы по страницам, компонентам, хитам, SQL-запросам, файлам кеша и таблицам.
Отладка SQL. В журнале запросов доступен план исполнения, а при включённой опции сохранения стека - видно, какая функция инициировала запрос. На публичной стороне есть кнопка отладки: она показывает время генерации, статистику запросов и кеша прямо на странице.
Важное ограничение. Постоянное журналирование само нагружает систему, поэтому монитор включают на период диагностики, а не навсегда.
Примеры
1. Отладка запросов участка кода
$connection = \Bitrix\Main\Application::getConnection();$connection->startTracker(true); // true - собирать стек вызовов
// исследуемый код$items = ItemTable::getList(['filter' => ['=ACTIVE' => true]])->fetchAll();
$tracker = $connection->getTracker();
echo 'Запросов: ' . $tracker->getCounter();echo 'Время: ' . $tracker->getTime();
foreach ($tracker->getQueries() as $query) { echo $query->getSql(); echo $query->getTime(); echo $query->getTrace();}
$connection->stopTracker();Это точечная альтернатива глобальному журналу: вы измеряете конкретный участок и сразу видите, сколько запросов он породил. Классический сценарий - проверить, что переписанный код действительно перестал делать запросы в цикле.
Трекер умеет писать и в файл - через startFileLog().
2. Порядок поиска медленных запросов
- Включить в настройках модуля запись SQL-запросов и задать порог «медленного» запроса (по умолчанию 0,1 секунды). 2. Собирать статистику достаточно долго: для панели производительности хотя бы час, а для поиска медленных запросов желательно сутки. 3. Открыть анализ индексов и изучить детальный разбор конкретного медленного запроса. 4. Создать индекс прямо из детального анализа: монитор предлагает готовое выражение. 5. Проверить эффективность повторным анализом: время запроса должно заметно упасть.
Важно не увлечься: индекс под каждый запрос увеличивает нагрузку на базу при записи. Иногда правильный ответ - не индекс, а исправление кода компонента, который делает слишком много запросов.
При выборе индекса учитывают продолжительность запроса, число повторений, селективность поля и размер таблицы. Большие таблицы индексируют в периоды низкой нагрузки - операция блокирующая.
Справочник
| Инструмент | Назначение | Особенности |
|---|---|---|
| Настройки модуля | что журналировать | включать только на время диагностики |
| Панель производительности | интегральный балл | сравнивать только с самим собой |
| Конфигурация | сверка с эталоном | подсвечивает типичные проблемы окружения |
| Масштабируемость | нагрузочный тест | хиты в секунду, ошибки, время генерации |
| Разработка | двадцать нагружающих страниц | разбор по компонентам и кешированию |
| SQL-запросы | журнал запросов | план исполнения, стек вызовов |
| Анализ индексов | подбор индексов | детальный разбор конкретного запроса |
| Кнопка отладки | замер на публичной странице | время, запросы, кеш |
Connection::startTracker() | программная отладка | аргумент включает сбор стека |
Diag\SqlTracker | результат трекинга | getQueries, getCounter, getTime, startFileLog |
Частые ошибки
Отчёты пустые. Не включён монитор или не включены нужные журналы. Для стека вызовов есть отдельная опция.
Не удаётся очистить собранные данные. Очистка доступна только при деактивированном мониторе.
Балл панели сравнивают между проектами. Значение зависит от редакции продукта: на одинаковом железе более старшая редакция покажет меньший балл. Это метрика для сравнения с собой до и после изменений.
Мало данных для выводов. На малопосещаемом сайте статистика за десять минут не показательна. Панели нужен хотя бы час, поиску медленных запросов - сутки.
Индекс на каждый медленный запрос. Индексы ускоряют чтение и замедляют запись, поэтому иногда дешевле починить сам код.
Высокое время пролога в замерах. Типичная причина - тяжёлый код в файле инициализации, который выполняется на каждой странице.
Частые вопросы
С какого отчёта начинать диагностику?
С вкладки разработки: там сразу видны двадцать самых нагружающих страниц, а по клику - разбор по компонентам с числом запросов и типом кеширования. В большинстве проектов проблема находится там же: один-два некешированных компонента дают основную часть нагрузки. Панель производительности полезна как общий индикатор, а конфигурация - чтобы отсеять проблемы окружения.
Можно ли держать монитор включённым постоянно?
Не стоит. Журналирование запросов и особенно стека вызовов само создаёт нагрузку и растит таблицы в базе. Правильный режим - включить на период диагностики, собрать достаточную статистику (час для панели, сутки для медленных запросов), выключить и работать с собранными данными.
Как измерить количество запросов в конкретном куске кода?
Через трекер запросов: включить его у соединения, выполнить исследуемый код и посмотреть счётчик, суммарное время и список запросов - при включённом сборе стека видно и то, откуда каждый запрос пришёл. Это удобнее глобального журнала, когда нужно проверить конкретную функцию до и после правки.
Индексы решают проблему медленных запросов?
Часто, но не всегда, и у них есть цена: каждый индекс замедляет вставку и обновление и занимает место. Прежде чем добавлять индекс, посмотрите на причину: запрос в цикле индексом не лечится, выборка всех полей вместо нужных - тоже. Индекс уместен, когда запрос осмысленный, повторяется часто и упирается в перебор большой таблицы.
Связанные темы
- Производительность - правила оптимизации запросов
- Кеширование - что и чем кешировать
- База данных - бэкенды и масштабирование
- Раздел Производительность