Как устранить неисправность Drupal-сайта, загрузка которого занимает 5 секунд

Read this article in:

Сайт Drupal, постоянно занимающий около 5 секунд для создания страницы, почти всегда ждет одного из них:

  1. База данных
  2. PHP выполнение
  3. Внешние HTTP запросы
  4. Кэш отключен / неправильно настроен
  5. Медленный пользовательский код

Во-первых, давайте определим, транспортный ли это слой или бэкэнд. С сервера:

curl -o /dev/null -s -w \
'connect: %{time_connect}\nstarttransfer: %{time_starttransfer}\ntotal: %{time_total}\n' \
https://example.com

Если time_starttransfer Это около 5 секунд, бэкэнд медленный.

Действительно ли кэш Drupal работает?
drush status

Проверьте:

  • кэш Рендера
  • Динамический кэш страницы
  • Кэш страницы

Затем проверьте:

drush cget system.performance

Если вы вошли в систему, кэш страницы не поможет, но должен отображать и динамический кэш страницы.

Включить запись базы данных

Если MySQL/MariaDB:

SHOW FULL PROCESSLIST;

При загрузке страницы.

Или включить медленный журнал запросов:

SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=0.2;

Затем проверьте:

/var/lib/mysql/*-slow.log

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

Профиль Drupal

Установите модули Devel и Profiler:

composer require drupal/webprofiler

WebProfiler покажет

  • маршрутизация
  • ветка
  • SQL
  • услуги
  • крючки
  • время

Обычно вы сразу видите виновника.

Проверьте HTTP-запросы

Один забытый звонок может стоить 5 секунд.

Поиск:

grep -R "http" web/modules/custom
grep -R "curl" web/modules/custom
grep -R "Guzzle" web/modules/custom
grep -R "file_get_contents(" web/modules/custom

Все, что связывается с другим сервером во время генерации страницы, подозрительно.

Проверьте backend кэш

При использовании кэша базы данных:

drush ev "print_r(\Drupal::service('cache.default'));"

Redis значительно быстрее на загруженных сайтах.

Не забудьте отключить Twig debug

Настройки разработки легко добавляют секунды. Проверьте:

development.services.yml

Ищите

twig.config:
  debug: true
  auto_reload: true
  cache: false

Производство должно быть

debug: false
auto_reload: false
cache: true
OPcache

Проверьте:

php -i | grep opcache.enable
php -i | grep opcache.validate_timestamps

Производство обычно использует

opcache.enable=1
opcache.validate_timestamps=0
Xbug

Проверьте:

php -m | grep xdebug

или

php -i | grep xdebug.mode

Если включено, отключите его.

Измерение SQL

Включить запись запросов:

$settings['container_yamls'][] = DRUPAL_ROOT . '/sites/development.services.yml';

Используйте WebProfiler.

Обычная кэшированная страница часто:

  • 20–80 SQL-запросов

Несколько сотен запросов указывают на проблему.

Идентификация дорогих крючков

Поиск пользовательских модулей для

hook_page_attachments()
hook_preprocess_page()
hook_preprocess_node()
hook_entity_view()
hook_views_pre_render()
hook_views_query_alter()

Они часто приводят к задержкам.

Проверить просмотры

Большой просмотр может занять целых 5 секунд.

Включите предварительный просмотр SQL в View и запустите:

EXPLAIN

Ищите

  • Использование временного
  • Использование FileSort
  • Полное сканирование стола
Измерить PHP

Установите XHProf, Tideways или Blackfire.

График пламени сразу определяет, где проводится время исполнения.

Проверьте бревна
drush watchdog:show

или

tail -f web/sites/default/files/php.log

Повторные предупреждения могут значительно замедлить генерацию страниц.

Марка без Drupal

Создайте простой файл PHP:

<?php
echo "hello";

Сравните:

time curl https://example.com/test.php
time curl https://example.com/

Если test.php Drupal работает быстро, а Drupal медленно, проблема в Drupal, а не в PHP, веб-сервере или TLS.

Please login to post comments: