Блог Горошко Андрея 1C-Битрикс Отладка производительности в Битрикс: Монитор производительности и отладка SQL

Отладка производительности в Битрикс: Монитор производительности и отладка SQL

Средний рейтинг
Еще нет оценок

Медленная работа сайта — частая проблема, и её решение начинается с правильной диагностики.

В Битрикс есть мощные встроенные инструменты, которые помогают найти причину низкой производительности, от «тяжелых» SQL-запросов до некэшированных компонентов.

Инструмент 1: Панель отладки SQL-запросов (Локальная отладка)

Это первый и самый важный инструмент для поиска «тяжелых» запросов на конкретной странице. Он позволяет увидеть каждый SQL-запрос, который был выполнен во время генерации страницы.

Как включить?

Существует два способа, оба требуют прав на редактирование файлов ядра.

1. Современный способ (через .settings.php, рекомендуется)
Откройте файл /bitrix/.settings.php и включите режим отладки для ядра и для соединения с БД.

// /bitrix/.settings.php
return [
    // ...
    'exception_handling' => [
        'value' => [
            'debug' => true, // Включаем режим отладки ядра
        ],
        // ...
    ],
    'connections' => [
        'value' => [
            'default' => [
                // ...
                'debug' => true, // Включаем отладку для соединения с БД
            ],
        ],
        // ...
    ],
];

2. Классический способ (через dbconn.php)
Откройте файл /bitrix/php_interface/dbconn.php и добавьте строку:

// /bitrix/php_interface/dbconn.php
// ...
$DBDebug = true; // Можно также использовать $DB->ShowSqlStat = true;

После включения внизу каждой страницы появится серая панель отладки. Перейдите на вкладку «SQL Запросы».

Что анализировать в панели отладки?

  1. Общее время выполнения страницы: Вкладка «Время». Если оно стабильно превышает 0.5-1 секунду, это явный признак проблем.
  2. Общее время SQL-запросов: Вкладка «SQL Запросы», строка «Время выполнения запросов». Если оно составляет значительную часть от общего времени страницы (> 30-50%), проблема точно в базе данных.
  3. Количество запросов: Если их больше 100-150, это почти всегда говорит об отсутствии кэширования или о «проблеме N+1» (выборка данных в цикле).
  4. Самые медленные запросы: Найдите запросы, время выполнения которых > 0.01 сек. Это ваши главные «подозреваемые».
  5. Дублирующиеся запросы: Если один и тот же запрос повторяется много раз, это 100% признак отсутствия кэширования.

Глубокий анализ с EXPLAIN

Напротив каждого запроса есть ссылка «Explain». Это команда MySQL, которая показывает план выполнения запроса. Это самый важный инструмент для оптимизации.

Ключ EXPLAINЧто означаетХорошо/Плохо
typeТип доступа к данным.Плохо: ALL (полный перебор таблицы). Приемлемо: index (сканирование индекса). Хорошо: range, ref. Отлично: eq_ref, const, system.
possible_keysВозможные индексы, которые MySQL мог использовать.
keyРеально использованный индекс.Если NULL при наличии possible_keys, это проблема.
rowsКритически важный параметр! Примерное количество строк, которые MySQL пришлось просканировать.Чем меньше, тем лучше. Если здесь тысячи, а LIMIT 1, это очень плохо.
ExtraДополнительная информация.Очень плохо: Using filesort (сортировка на диске), Using temporary (создание временной таблицы). Нормально: Using where, Using index.

Что делать? Если вы видите type: ALL или Using filesort для запроса, который фильтрует или сортирует по определенным полям, значит, на эти поля необходимо добавить индекс в базе данных.


Инструмент 2: Монитор производительности (Глобальная отладка)

Этот модуль (perfmon) дает общую картину производительности всего сайта за период времени, а не одной страницы.
Путь в админке: Настройки -> Производительность -> Панель производительности.

Как использовать?

  1. Измерьте индекс производительности: На главной странице модуля. Он тестирует CPU, файловую систему и БД. «Эталонное» значение — около 30. Если у вас сильно меньше, возможно, проблемы в конфигурации сервера.
  2. Включите монитор: Нажмите «Включить монитор» и дайте ему поработать под реальной нагрузкой (от нескольких часов до суток).
  3. Анализируйте вкладки:
    • SQL: Здесь собран ТОП самых медленных и частых запросов со всего сайта. Это позволяет найти глобальные проблемы, которые влияют на все разделы.
    • Компоненты: Показывает, какие компоненты работают медленнее всего и вызываются чаще всего. Высокое «Среднее время выполнения» и большое «Кол-во вызовов» — явный признак компонента без кэширования.
    • Кэширование: Показывает эффективность кэша. Ищите низкий «Коэф. кеширования» (отношение чтений к записям) и большие объемы записи (write size). Это может указывать на неэффективное или слишком часто сбрасываемое кэширование.

Инструмент 3: Программный трекер SQL (SqlTracker)

Иногда нужно отладить SQL-запросы не на публичной странице, а в агенте, REST-методе или cron-скрипте. Для этого в D7 есть программный трекер.

use Bitrix\Main\Application;

// 1. Получаем соединение и запускаем трекер
$connection = Application::getConnection();
$tracker = $connection->startTracker();

// 2. Выполняем код, который генерирует запросы
// ...
\Bitrix\Iblock\ElementTable::getList(['filter' => ['IBLOCK_ID' => 5, 'ACTIVE' => 'Y']]);
// ...

// 3. Останавливаем трекер
$connection->stopTracker();

// 4. Анализируем собранные запросы
foreach ($tracker->getQueries() as $query) {
    // $query - объект \Bitrix\Main\Diag\SqlTrackerQuery
    echo "SQL: " . $query->getSql() . "<br>";
    echo "Время: " . round($query->getTime(), 5) . " сек.<br>";
    // print_r($query->getTrace()); // Можно получить полный стек вызовов
    echo "<hr>";
}

Этот способ дает полный контроль и позволяет логировать запросы из любого места вашего кода.

Частые проблемы и их решение

  • Проблема N+1: Самый частый убийца производительности.
    • Плохо:codePHP$rsItems = CIBlockElement::GetList(...); // 1 запрос while($arItem = $rsItems->Fetch()) { // В цикле для каждого элемента делается еще один запрос! $prop = CIBlockElement::GetProperty(..., $arItem['ID'], ...)->Fetch(); // N запросов }
    • Хорошо: Получить все данные за один-два запроса. Либо выбрать свойства прямо в GetList, либо сначала собрать все ID, а потом одним запросом GetProperty получить свойства для всех ID.
  • Отсутствие кэширования: Любая выборка, которая не меняется каждую секунду, должна быть обернута в Bitrix\Main\Data\Cache или CPHPCache.
  • Отсутствие индексов БД: Если EXPLAIN показывает type: ALL, создайте индекс для полей из WHERE и ORDER BY.
  • select => [‘*’] в ORM: Никогда не используйте «звездочку», если вам не нужны все поля. Это особенно критично для полей типа TEXT, которые могут быть очень большими.

Вывод:
Отладка производительности — это системная работа. Начните с панели отладки SQL для конкретных медленных страниц.

Используйте EXPLAIN для глубокого анализа проблемных запросов.

Затем переходите к Монитору производительности для выявления глобальных проблем на всем сайте.

И не забывайте про кэширование — это 90% успеха в оптимизации сайта на Битрикс.

производительность Битрикс, монитор производительности, отладка SQL, медленные запросы, Explain, индекс, cache_joins, perfmon, SqlTracker, оптимизация Битрикс.

Мой рейтинг:

Добавить комментарий

Related Post

Обмен данными между 1С и Битрикс: детальное руководствоОбмен данными между 1С и Битрикс: детальное руководство

Средний рейтинг Еще нет оценок Эта статья подробно описывает процесс обмена данными между 1С и сайтом на базе 1С-Битрикс, используя компонент catalog.import.1c (импорт каталога товаров из 1С на сайт). Мы

Управление разделами инфоблоков в Битрикс: CIBlockSection::GetList, Add, UpdateУправление разделами инфоблоков в Битрикс: CIBlockSection::GetList, Add, Update

Средний рейтинг Еще нет оценок Разделы инфоблоков — это основа для построения каталогов, иерархических списков и любой другой вложенной структуры на сайте. Для работы с ними в старом API Битрикс

Продвинутое кэширование в Битрикс: Managed Cache и Tagged CacheПродвинутое кэширование в Битрикс: Managed Cache и Tagged Cache

Средний рейтинг Еще нет оценок Обычное кэширование по времени (CPHPCache, Bitrix\Main\Data\Cache) отлично работает, но у него есть недостаток: если данные изменились, кэш обновится только по истечении своего TTL (времени жизни). Пользователи будут видеть