Вопрос или проблема
У нас есть установка 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, что уже принесло плоды. Поскольку проблема решена частично, необходимо рассмотреть дальнейшие шаги по улучшению производительности.
Пути оптимизации
-
Кеширование запросов: Рассмотрите возможность использования кеширования результатов запросов. Плагины кеширования, такие как WP Super Cache или W3 Total Cache, могут значительно снизить нагрузку на базу данных, сохраняя результаты часто выполняемых запросов в памяти.
-
Индексация таблиц: Проверьте, как проиндексированы ваши таблицы базы данных. Неправильная индексация может привести к медленной работе операций выборки. Убедитесь, что столбцы, которые часто запрашиваются, такие как
user_id
, имеют соответствующие индексы. -
Ограничение количества вызовов
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);
-
Анализ других плагинов: Выявление и удаление дополнительных плагинов, которые могут вызывать лишние запросы к базе данных, также может решить проблему. Рассмотрите возможность поэтапного отключения плагинов, чтобы выяснить их влияние на производительность сервера.
-
Оптимизация запросов к базе данных: Если вы разрабатываете собственные решения или используете свои коды для выборки метаданных, проверяйте и оптимизируйте SQL-запросы, чтобы минимизировать их количество и временные затраты на выполнение.
-
Мониторинг и отладка: Продолжайте использовать такие инструменты, как Query Monitor и Debug Bar для периодического анализа нагрузки на базу данных. Это поможет вам своевременно обнаружить новые проблемы, возникающие при изменении конфигурации сайта.
Заключение
Обновленная работа с плагином уже улучшила ситуацию, но остаются возможности для дальнейшей оптимизации, которые могут привести к значительному снижению нагрузки на вашу базу данных. Как следствие, сайт станет быстрее и отзывчивее. Следуйте процедурам проверки и оптимизации, чтобы обеспечить долгосрочную стабильность и производительность вашего WordPress-сайта.