Необычно высокий запрос пользовательских метаданных

Вопрос или проблема

У нас есть установка WordPress с установленным множеством плагинов. Сайт не сильно загружен (может быть 10-20 пользователей одновременно). Я знаю, что количество плагинов сказывается на производительности. Однако утечка производительности была настолько великой, что мы начали исследовать проблему и добавили в базу данных журналирование запросов на некоторое время, поскольку поток базы данных постоянно превышал 100% системных ресурсов в наших мониторах, что не должно происходить при 8 ядрах, 16 ГБ ОЗУ, 100 ГБ SSD и т.д.

После 5 минут журналирования мы получили более 220 тыс. запросов. Более 90% из них были практически одинаковыми запросами (исключая изменение идентификатора пользователя) в следующем виде:

SELECT user_id, meta_key, meta_value FROM usermeta WHERE user_id IN (1548) ORDER BY umeta_id ASC

Это явно неверно и объясняет проблему узкого места, с которой мы сейчас сталкиваемся с нашим DB-сервером. Мы пытаемся найти виновника этого, но не знаем, как выяснить, что вызывает такое количество запросов user_meta.

С помощью плагинов WordPress DebugBar и Query Monitor мне удалось изолировать плагины, вызывающие проблему.

Это material-wp (выборки из usermeta) и, в какой-то степени, advanced-custom-fields-pro (выборки из postmeta).
https://i.sstatic.net/JP0u0.png (usermeta)
https://i.sstatic.net/gzrLc.png (postmeta)

Основная проблема заключается в функции get_metadata и, в частности, в функции update_meta_cache.

После обращения к автору плагина material-wp он предоставил быстрый патч, который, похоже, решил проблему с огромным количеством запросов usermeta.

Тем не менее, я все еще хотел бы улучшить производительность базы данных.

Любая помощь будет высоко оценена.
(Есть ли способ отключить функцию update_meta_cache глобально?)

Я уверен, что есть более сложные способы отладки запросов, но я не в курсе. Поэтому, когда мне нужно отлаживать запросы WP, я использую либо Query Monitor, либо Debug Bar (с дополнением Slow Actions), которые можно найти в репозитории плагинов wordpress.org. Эти плагины помогают отследить, какие функции / плагины замедляют сайт. Для меня эти плагины оказали большую помощь.

Я не связан ни с одним из этих плагинов, и прошу прощения за то, что дал только рекомендацию по плагинам.

Ответ или решение

Неправомерно большое количество запросов метаданных пользователей: Причины и пути оптимизации

Введение

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

Анализ проблемы

Вы приводите конкретные SQL-запросы к таблице usermeta, которые генерируются плагинами, включая Material WP и Advanced Custom Fields Pro. Как показали ваши результаты, основная нагрузка возникает из-за функции get_metadata и, в частности, из-за ее вспомогательной функции update_meta_cache. Важной деталью является то, что более 90% из 220,000 запросов были схожими по структуре, отличаясь только идентификатором пользователя. Это явно указывает на избыточное множество обращений к одной и той же информации.

Устранение последствий

Первая мера, которая была предпринята, — это работа с разработчиком плагина Material WP, что уже принесло плоды. Поскольку проблема решена частично, необходимо рассмотреть дальнейшие шаги по улучшению производительности.

Пути оптимизации

  1. Кеширование запросов: Рассмотрите возможность использования кеширования результатов запросов. Плагины кеширования, такие как WP Super Cache или W3 Total Cache, могут значительно снизить нагрузку на базу данных, сохраняя результаты часто выполняемых запросов в памяти.

  2. Индексация таблиц: Проверьте, как проиндексированы ваши таблицы базы данных. Неправильная индексация может привести к медленной работе операций выборки. Убедитесь, что столбцы, которые часто запрашиваются, такие как user_id, имеют соответствующие индексы.

  3. Ограничение количества вызовов update_meta_cache: Вы можете отключить кэширование метаданных, используя параметр update_meta_cache в вашем коде. Однако будьте осторожны, так как это может негативно повлиять на производительность, если изменится количество обращений к метаданным. Следующий код можно использовать в вашем файле functions.php:

    add_filter('get_metadata', function($null, $object_id, $meta_key, $single) {
       return get_metadata('user', $object_id, $meta_key, $single, false);
    }, 10, 4);
  4. Анализ других плагинов: Выявление и удаление дополнительных плагинов, которые могут вызывать лишние запросы к базе данных, также может решить проблему. Рассмотрите возможность поэтапного отключения плагинов, чтобы выяснить их влияние на производительность сервера.

  5. Оптимизация запросов к базе данных: Если вы разрабатываете собственные решения или используете свои коды для выборки метаданных, проверяйте и оптимизируйте SQL-запросы, чтобы минимизировать их количество и временные затраты на выполнение.

  6. Мониторинг и отладка: Продолжайте использовать такие инструменты, как Query Monitor и Debug Bar для периодического анализа нагрузки на базу данных. Это поможет вам своевременно обнаружить новые проблемы, возникающие при изменении конфигурации сайта.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...