Перейти к содержимому

Сайт тормозит - разбор причин по убыванию частоты

Страницы открываются медленно, а причина не очевидна. Разбираем в порядке убывания частоты - начиная с того, что измеряется за минуту.

С чего начать

Разделяем время ответа на ожидание и выполнение:

Окно терминала
# время ответа в журнале веб-сервера: сюда входит и очередь, и работа PHP
tail -50 /var/log/nginx/access.log | awk '{print $NF, $7}' | sort -rn | head -10
# журнал медленных запросов PHP показывает уже только выполнение
tail -30 /var/log/php-fpm/bx0-slow.log 2>/dev/null
# пустой журнал медленных запросов означает, что порог записи не настроен
# пустой журнал медленных запросов означает упор не в PHP

Большая разница между этими величинами означает очередь к процессам PHP, а не медленный код. Это первое разветвление разбора, и без него любые правки шаблонов делаются наугад.

Смотрим, включён ли кэш и что он покрывает:

// панель отладки платформы показывает число запросов и время на странице
define('BX_SHOW_STAT', true); // на тестовом сайте
echo COption::GetOptionString('main', 'component_cache_on', 'Y'), "\n";
echo COption::GetOptionString('main', 'composite_mode', 'N'), "\n";

Число запросов к базе на странице - самый быстрый индикатор. Витрина каталога с сотнями запросов означает, что кэш выключен или каждый элемент дочитывается отдельно.

Ищем тяжёлые запросы в базе:

SHOW FULL PROCESSLIST; -- что выполняется прямо сейчас
SELECT * FROM information_schema.processlist WHERE time > 5 ORDER BY time DESC;
-- смотреть нужно в момент нагрузки: после неё список пуст
-- один и тот же запрос в нескольких строках означает очередь к таблице
-- найденный текст запроса дальше разбирают планом выполнения

Долгие запросы видно в момент нагрузки, а не после неё. Один тяжёлый отчёт, запускаемый менеджером в час пик, способен замедлить весь сайт, и в журналах он выглядит как общее «тормозит всё».

Причины

  1. Кэш компонентов выключен или сбрасывается слишком часто примерно 30% случаев

    ПризнакСотни запросов к базе на обычной странице каталога.

    ПроверкаСмотрим число запросов в панели отладки и настройки кэширования компонентов.

    Что делатьВключаем кэш компонентов и управляемый кэш; сброс по событию заменяем на разумное время жизни.

  2. Не хватает процессов PHP под нагрузкой примерно 25% случаев

    ПризнакНочью сайт быстрый, днём медленный, время ожидания больше времени работы кода.

    ПроверкаСравниваем время ответа веб-сервера с временем выполнения PHP и смотрим число процессов в пуле.

    Что делатьУвеличиваем число процессов до предела памяти и включаем кэш, чтобы часть запросов не доходила до PHP.

  3. Тяжёлые запросы к базе примерно 20% случаев

    ПризнакОтдельные страницы стабильно медленные независимо от нагрузки.

    ПроверкаСмотрим список активных запросов в момент открытия страницы и журнал медленных запросов базы.

    Что делатьПравим выборку: перечисляем нужные поля, добавляем индексы, убираем дочитывание в цикле.

  4. Синхронный вызов внешней системы в коде страницы примерно 15% случаев

    ПризнакСтраница ждёт несколько секунд, база при этом свободна.

    ПроверкаИщем в коде обращения к внешним адресам, выполняемые при отрисовке страницы.

    Что делатьУводим такие вызовы в фон - в агент или в асинхронный запрос из браузера - и кэшируем ответ.

  5. Тяжёлые картинки и статика примерно 10% случаев

    ПризнакСервер отвечает быстро, а страница в браузере собирается долго.

    ПроверкаСмотрим вес картинок в карточке товара и число подключаемых файлов.

    Что делатьОтдаём уменьшенные копии картинок вместо исходников и объединяем ресурсы штатными средствами.

Частые вопросы

Помогает ли композитный сайт при тормозах?

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

Почему после включения кэша ничего не изменилось?

Кэшируется только то, что внутри области кэширования компонента. Медленный запрос в коде страницы или в шаблоне сайта остаётся вне неё.

Что делать с медленной админкой?

Она почти не кэшируется, и её скорость упирается в базу. Смотрят размер журналов, таблицу поиска и статистику: их чистка обычно и есть решение.

Нужен ли профилировщик?

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

Смежное

Первоисточник