Вопрос или проблема
Я пытаюсь решить проблемы с производительностью в Apache.
Загрузка веб-страницы происходит быстро, пока она не защищена авторизацией через базу данных. См. эту картинку для сравнения между статическими/динамическими страницами и публичными/защищенными страницами.
Если я вызываю тот же запрос, используя PHP mysqli, выборка происходит очень быстро… Это говорит мне о том, что проблема не в самом запросе или в подключении к базе данных, а в Apache или его модуле/драйвере DBD.
Хост-машина: экземпляр Amazon EC2
Операционная система: Amazon Linux 2023
База данных: MariaDB - локально или с использованием Amazon RDS, такие же проблемы
На сервере в продакшене используется аутентификация через форму вместе с другими конфигурациями, но для тестирования я использую машину с стандартной конфигурацией Apache, за исключением следующего, чтобы воспроизвести проблему в более простом контексте:
LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
<IfModule dbd_module>
DBDriver mysql
DBDParams host=[localhost/127.0.0.1/AWS_RDS-DNS],port=[port],dbname=[dbname],user=[username],pass=[password]
</IfModule>
<Directory "/var/www/html/static_private">
AuthType Basic
AuthBasicProvider dbd
AuthName "Restricted area"
AuthDBDUserPWQuery [любой запрос приводит к той же проблеме с производительностью]
Require valid-user
</Directory>
Я установил драйвер mysql для DBD, используя sudo dnf install apr-util-mysql
Многократное обновление частных страниц вызывает резкий скачок нагрузки на ЦП до 100%, в то время как для публичных страниц ЦП стабильна около 0-1%.
Спасибо!
Ответ или решение
Замедленная авторизация DBD в Apache – это распространенная проблема, с которой сталкиваются многие администраторы серверов веб-приложений. В данном случае вы описываете ситуацию, когда загрузка страницы происходит быстро, пока она не защищена с помощью авторизации на основе базы данных. Анализ ситуации показывает, что проблема, скорее всего, кроется не в самом запросе или подключении к базе данных, поскольку при вызове того же запроса с помощью PHP mysqli данные извлекаются молниеносно. Это указывает на то, что основная проблема, вероятно, находится в области Apache или его модуле/драйвере DBD.
Теория
Для начала важно понимать, как работает модуль DBD и почему он может быть причиной замедления. Apache модуль DBD (Database Driver) используется для взаимодействия с базой данных и предоставляет интерфейс для выполнения SQL-запросов. Когда используется авторизация на основе DBD, движок выполняет данные SQL-запросы для аутентификации пользователя. Этот процесс включает в себя как соединение с базой данных, так и выполнение самого запроса.
Потенциальные факторы, вызывающие замедление:
-
Переподключение к базе данных: Каждый запрос на авторизацию может порождать новое соединение с базой данных, особенно, если не используется пул соединений.
-
Отсутствие кэширования: Запросы к базе данных могут быть не оптимизированы для кэширования результатов. Если повторные запросы идентичны, а система не кэширует результаты прошлых запросов, то это неизбежно приведет к дополнительному времени на выполнение.
-
Проблемы конфигурации: Использование неправильных параметров конфигурации, таких как неправильно указанный драйвер или параметры подключения, может вызвать дополнительные накладные расходы.
Пример
В представленной вами ситуации, для простоты, использовалась стандартная конфигурация Apache с некоторыми дополнительными изменениями для репликации проблемы. Проблема проявляется в том, что при обновлении защищенных страниц процессор резко увеличивает свою загрузку до 100%, в то время как публичные страницы остаются относительно ненагруженными. Это типично для ситуаций, когда каждое действие пользователя требует нового соединения и выполнения запроса, и если такие операции не оптимизированы, это может оказать значительное воздействие на производительность.
Применение
На практике необходимо предпринять ряд шагов для устранения проблемы замедления:
-
Использование пул соединений: Включите и настройте пул соединений, чтобы повторно использовать существующие подключения к базе данных, вместо создания новых для каждого запроса авторизации. Это позволит существенно снизить нагрузку на CPU и упростить взаимодействие с базой данных.
-
Оптимизация конфигурации Apache:
- Проверьте параметры
DBDParams
, чтобы убедиться, что используется правильный хост, порт, имя пользователя и пароль. - Определите, поддерживает ли подключаемый драйвер pooling, и если да, включите его.
- Проверьте параметры
-
Кэширование результатов запросов: Внедрите кэширование для частых запросов аутентификации. Это может быть реализовано как на стороне Apache, так и на стороне базы данных.
-
Профилирование и диагностика: Используйте инструменты профилирования для диагностики скорости выполнения каждого этапа процесса аутентификации. Это поможет выявить конкретные узлы, замедляющие работу.
-
Обновление программного обеспечения: Убедитесь, что все установленные модули и сервер являются последними стабильными версиями. Обновления могут содержать важные улучшения производительности и исправления ошибок.
Применение вышеупомянутых действий поможет значительно улучшить производительность вашего сервера при авторизации через DBD в Apache. Однако, следует помнить, что каждая среда уникальна, и может потребоваться адаптация решений под специфические условия и архитектуру вашего приложения и сервера.