Ускоряем бэкенд Drupal с помощью $settings['state_cache']
На большом сайте Gov Drupal, над которым я работаю, страницы /admin/reports/status
и /admin/config
работали медленно. После включения $settings['state_cache'] страницы стали загружаться намного быстрее. Редакторы сразу это заметили.
Если ваша область администрирования работает медленно, это может помочь. Drupal выполняет множество мелких чтений из State API при каждом запросе, а их кэширование сокращает обращения к базе данных. В Drupal 10.3 вы можете включить его с помощью $settings['state_cache'] = TRUE
в settings.php
. В Drupal 11 кэширование состояния включено по умолчанию, и настройка была удалена. Если ваш сайт хранит большое количество крупных элементов в State, сначала проверьте это, прежде чем включать его в 10.3.
Что хранит State API
Drupal хранит небольшие, специфичные для сайта значения в коллекции ключ-значение под названием state
. Примеры: время последнего запуска cron, флаги обслуживания, вспомогательные переключатели, используемые ядром и модулями. Без кэширования каждое чтение может обращаться к базе данных.
Почему state_cache
помогает
Экраны администрирования выполняют множество мелких проверок. Кэширование этих значений устраняет множество обращений к базе данных. Результат — более быстрые страницы и меньшая нагрузка на базу данных. Простое изменение, явная выгода.
Доступность
- Drupal 10.3+: включите с помощью
$settings['state_cache']
. - Drupal 11+: включено по умолчанию; настройка была удалена.
Как это работает
Drupal загружает значение один раз, сохраняет его в кэше и повторно использует при последующих запросах. Когда значение изменяется, Drupal обновляет хранилище и инвалидирует запись в кэше. Чтения остаются быстрыми, а данные — корректными.
Включение в Drupal 10.3+
Добавьте это в settings.php
:
$settings['state_cache'] = TRUE;
Затем очистите кэши.
Быстрая проверка перед включением
Если ваш сайт хранит слишком много или слишком большие значения в state
, их кэширование может привести к излишнему потреблению памяти. Выполните этот запрос:
SELECT COUNT(*) AS num_items,
SUM(LENGTH(value)) AS total_bytes
FROM key_value
WHERE collection = 'state';
Вы можете выполнить то же самое с помощью Drush:
drush sql:query "SELECT COUNT(*) AS num_items, SUM(LENGTH(value)) AS total_bytes FROM key_value WHERE collection = 'state';"
PostgreSQL:
drush sql:query "SELECT COUNT(*) AS num_items, SUM(OCTET_LENGTH(value)) AS total_bytes FROM key_value WHERE collection = 'state';"
Приблизительные правила:
- num_items до примерно 100 и total_bytes около 100 КБ обычно в порядке.
- Если вы видите большие блоки данных, переместите их в другое место (в кэш-корзину, конфигурацию или пользовательскую таблицу) перед включением.
Проблемы, которые это может облегчить
- Медленные страницы администрирования после входа.
- Высокая нагрузка на базу данных во время редакционной работы, пакетных операций или интенсивного использования cron.
- Всплески задержки на общих серверах баз данных.
Если ваш бэкенд кэширования — база данных
Да, это все равно помогает. Вы будете выполнять меньше чтений из key_value
. Страницы администрирования могут загружаться быстрее. Но чтения по-прежнему будут обращаться к базе данных, поэтому выгода будет меньше, чем при использовании Redis или Memcached. Это безопасно включить сейчас и планировать переход на кэш в памяти позже.
Хорошие сочетания
- Redis или Memcached для хранения кэша, чтобы обращения к состоянию находились в памяти. Проверьте ваш бэкенд кэширования в
settings.php
и следите за коэффициентом попаданий. - Держите состояние небольшим. Используйте его для флагов и легковесных значений, а не для больших блоков данных.
- Измеряйте до и после. Локально попробуйте Webprofiler или Devel, чтобы сравнить количество запросов. В продакшене используйте ваш APM.
Предостережения
- Очень большие значения состояния могут раздуть кэш. Сначала исправьте данные, затем включите.
- Очистка кэша не удаляет значения состояния; она только инвалидирует кэшированные копии.
- В Drupal 11 настраивать нечего. Вы уже получаете выгоду.
Краткий контрольный список
- Выполните SQL-проверку выше.
- Удалите любые слишком большие значения из
state
. - В Drupal 10.3 — 10.x добавьте
$settings['state_cache'] = TRUE;
и очистите кэши. - Убедитесь в уменьшении количества запросов на страницах администрирования и наблюдайте за снижением нагрузки на базу данных.
Итог
Небольшое изменение. Заметное улучшение для редакторов. Включите, протестируйте и наслаждайтесь более отзывчивыми страницами администрирования.