Положим, ваш сайт или корпоративный портал работает на , оценка производительности нормальная. Конфигурация сервера правильная (хорошо, если это наша виртуальная машина или rpm). Но какая-то страница или сайт в целом работает неудовлетворительно. Куда двигаться в такой ситуации?
[spoiler]
Сначала включаем режим отладки:

После обновления страницы увидим суммарную отладочную информацию внизу страницы:

И вот здесь наступает очень важный момент: мы сравниваем время создания страницы со временем исполнения запросов и понимаем, база тормозит или php. В зависимости от этого будут совершенно разные пути оптимизации. Если для вас это не очевидно, рекомендую ознакомиться с .
В большинстве случаев тормозит база данных, и, говоря про оптимизацию производительности, мы обычно подразумеваем долгие SQL запросы и большое их количество (а связи с этим - отсутствие или неправильная настройка кеширования). Эта ситуация была уже много раз разжевана, сейчас не буду останавливаться на этом, пример решения можно посмотреть .
По клику на "Время создания страницы" получим детальную раскладку:

Что делать, если основное торможение создает php код?
(как на моём примере выше)
Тогда поможет профилирование. Здесь я снова оговорюсь, что мы говорим о ситуации, когда система настроена хорошо.
Вот скриншот с этой же тестовой установки:

Если у вас на там есть что оптимизировать, говорить о профилировании рано.
Теперь нам потребуется модуль xdebug, который уже установлен на нашей виртуальной машине. Как включить этот модуль, написано .
Модуль xdebug умеет работать в режиме профилировщика, но для bitrix.xdebug нужен именно трейс!
Для работы с файлами профилировщика нужно их выгрузить на локальный компьютер, а потом обработать . Предлагаемый мной инструмент не пытается конкурировать с ними по функциональным возможностям, он может быть хорошим дополнением для быстрого решения конкретных проблем, когда вся работа идет на стороне сервера. |
Все это делается в несколько кликов мышкой, весь процесс зафиксировал на скриншотах.
После установки модуля надо разрешить сбор трейса по куке (по умолчанию это выключено чтобы случайный прохожий не нагенерил кучу трейсов):

Потом включаем сбор трейсов, обновляем страницу, нажимаем Stop.

Получаем результат:

К слову сказать, для получения трейсов совсем не обязательно использовать . Это можно сделать вручную вставив перед проблемным кодом или в самом начале проблемой страницы вызов:
xdebug_start_trace(); |
Далее выбираем режим профилирования:

При этом при первом открытии профилировщика файл будет индексироваться в базу данных, большие файлы обрабатываются по шагам:

У меня, например, не было проблем с обработкой файла 800 Мб.
Кстати, индексированные данные занимают сильно меньше, чем оригинальный файл. Например, данные из файла 24 Мб уместились в 1,4 Мб в БД. При этом происходит автоматическая очистка таблицы при удалении файла трейса через веб интерфейс модуля.
В результате получаем такую картину:

Каждая строчка завязана на вызов какой-то функции в конкретном месте кода. Если функция вызывалась в разных местах, это будут отдельные строки.
Однако, в фильтре можно включить группировку по имени функции, тогда место вызова функции учитываться не будет:

Здесь собственное время - это время работы самой функции, а интегральное время - это сумма времени выполнения всех вложенных функций.
Если функция вызывалась несколько раз, то обе цифры отражают суммарное время.
В общем случае, первая цифра подходит для анализа работы системных php функций, а вторая - собственных (для системных функций собственное и интегральное время будет одинаковое).
В моём примере сортировка по собственному времени сразу показывает, что основное время занимает работа функции fgets:

Когда группировка по имени функции не включена, можно нажать на имя функции и перейти в режиме отладки к позиции, где был наиболее долгий вызов.

И уже тут путем несложных умозаключений можно понять, что идет запрос к облаку 1С-Битрикс для получения информации о резервной копии.

И моя проблема решилась установкой лицензионного ключа (до этого стояло DEMO).

Понимая, как работает инструмент, можно решить практически любую задачу, когда торможение происходит на стороне php.
Это проще, чем кажется и может помочь избежать много часов отладки. Используйте, не стесняйтесь задавать вопросы!
Некоторые наблюдения:
1) В режиме инкогнито на почти пустой странице сайта-магазина (нет ни корзины ни фильтра конкретно на данной странице, на других есть) больше всего времени уходит на base64_decode и ___834589951 в include модуля sale (оказывается он обфусцирован, а мужики то не знают!).
2) В режиме админа на той же странице лидеры is_array который проверяет что-то связанное с горячими клавишами в /bitrix/modules/main/classes/general/hot_keys.php:27 а также preg_match в методе PhpToJSObject
2. Подтвердилось, передал в разработку.
Спасибо за наблюдения!