Ускоряем бэкенд 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;и очистите кэши.
- Убедитесь в уменьшении количества запросов на страницах администрирования и наблюдайте за снижением нагрузки на базу данных.
Итог
Небольшое изменение. Заметное улучшение для редакторов. Включите, протестируйте и наслаждайтесь более отзывчивыми страницами администрирования.