Сайт тормозит - разбор причин по убыванию частоты
Страницы открываются медленно, а причина не очевидна. Разбираем в порядке убывания частоты - начиная с того, что измеряется за минуту.
С чего начать
Разделяем время ответа на ожидание и выполнение:
# время ответа в журнале веб-сервера: сюда входит и очередь, и работа PHPtail -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;-- смотреть нужно в момент нагрузки: после неё список пуст-- один и тот же запрос в нескольких строках означает очередь к таблице-- найденный текст запроса дальше разбирают планом выполненияДолгие запросы видно в момент нагрузки, а не после неё. Один тяжёлый отчёт, запускаемый менеджером в час пик, способен замедлить весь сайт, и в журналах он выглядит как общее «тормозит всё».
Причины
-
Кэш компонентов выключен или сбрасывается слишком часто примерно 30% случаев
ПризнакСотни запросов к базе на обычной странице каталога.
ПроверкаСмотрим число запросов в панели отладки и настройки кэширования компонентов.
Что делатьВключаем кэш компонентов и управляемый кэш; сброс по событию заменяем на разумное время жизни.
-
Не хватает процессов PHP под нагрузкой примерно 25% случаев
ПризнакНочью сайт быстрый, днём медленный, время ожидания больше времени работы кода.
ПроверкаСравниваем время ответа веб-сервера с временем выполнения PHP и смотрим число процессов в пуле.
Что делатьУвеличиваем число процессов до предела памяти и включаем кэш, чтобы часть запросов не доходила до PHP.
-
Тяжёлые запросы к базе примерно 20% случаев
ПризнакОтдельные страницы стабильно медленные независимо от нагрузки.
ПроверкаСмотрим список активных запросов в момент открытия страницы и журнал медленных запросов базы.
Что делатьПравим выборку: перечисляем нужные поля, добавляем индексы, убираем дочитывание в цикле.
-
Синхронный вызов внешней системы в коде страницы примерно 15% случаев
ПризнакСтраница ждёт несколько секунд, база при этом свободна.
ПроверкаИщем в коде обращения к внешним адресам, выполняемые при отрисовке страницы.
Что делатьУводим такие вызовы в фон - в агент или в асинхронный запрос из браузера - и кэшируем ответ.
-
Тяжёлые картинки и статика примерно 10% случаев
ПризнакСервер отвечает быстро, а страница в браузере собирается долго.
ПроверкаСмотрим вес картинок в карточке товара и число подключаемых файлов.
Что делатьОтдаём уменьшенные копии картинок вместо исходников и объединяем ресурсы штатными средствами.
Частые вопросы
Помогает ли композитный сайт при тормозах?
Он убирает сборку страницы для повторных посетителей, но не лечит медленный код в персональных блоках. Сначала разбирают причину, потом включают композит.
Почему после включения кэша ничего не изменилось?
Кэшируется только то, что внутри области кэширования компонента. Медленный запрос в коде страницы или в шаблоне сайта остаётся вне неё.
Что делать с медленной админкой?
Она почти не кэшируется, и её скорость упирается в базу. Смотрят размер журналов, таблицу поиска и статистику: их чистка обычно и есть решение.
Нужен ли профилировщик?
На большинстве сайтов хватает панели отладки платформы и журналов. Профилировщик берут, когда время теряется внутри своего кода, а не в запросах.
Смежное
-
Медленный сайт - оглавление подтемы
-
Монитор производительности: замер, отчёты, поиск узких мест - замер вместо догадок
-
Нагрузочное тестирование: сценарий, расчёт, чтение результатов - проверка нагрузкой до наплыва посетителей
-
Кэш не срабатывает: страница собирается заново каждый раз - разбор одной частой причины подробнее
-
Быстрые картинки на витрине: размеры, ленивая загрузка, WebP - вторая по частоте причина после запросов
-
Кеширование - уровни кэша и их сброс
-
nginx и PHP-FPM: статика, пулы, медленные ответы - откуда берётся ожидание
-
Производительность - устройство скорости целиком
-
Мониторинг сервера: что смотреть до того, как сайт упадёт - чтобы не разбирать по факту
-
Подборки товаров: новинки, хиты и акции на витрине - частая причина медленной главной
-
Картинки товара: загрузка, размеры и вывод галереи - вес картинок в карточке
-
Правка не видна на сайте: какой кэш сбросить - обратная сторона кэша
-
Отладка на боевом сайте: журналы, режим ошибок, поиск виновника - панель отладки и журналы
-
Стили и скрипты в шаблоне: подключение, порядок, кэш - число файлов и вес страницы
-
Проверка сайта перед акцией: нагрузка, узкие места, план дня - проверка до наплыва, а не после
-
Медленный запрос к базе: поиск, план, индекс - разбор найденного запроса
-
Ускорение карточки товара: состав блоков, отложенная загрузка - разбор самой посещаемой страницы магазина
-
Акселератор PHP: размер кэша, сброс при выкладке - когда время уходит на перекомпиляцию кода