Вопрос или проблема
У меня есть некоторые проблемы с LAMP веб-сервером, некоторые клиенты испытывают тайм-аут вызова в часы пик.
Я проверил историческое использование ресурсов ВМ с помощью sar, загрузка процессора менее 30%, а использование памяти менее 60/70% без свопа.
Я не нашел ничего действительно полезного в логах приложения, я проверил журналы systemctl, ядро, syslog, логи apache и т. д.
Мне интересно, как я могу определить, закончилось ли у Apache количество рабочих процессов или памяти? Он что-то логирует в такой ситуации?
Я планирую переключить php модуль с prefork mod_php на fpm, но это вслепую, у меня нет понятия, достиг ли я максимального количества соединений, и более того, я не знаю, совместим ли симптом тайм-аута клиента с насыщением соединений (или я ожидал бы немедленного завершения TCP обмена Apache).
Ответ или решение
Для того чтобы диагностировать проблемы с вашими LAMP-серверами, и в частности с Apache, в ситуациях, когда клиенты сталкиваются с таймаутом вызова в часы пик, важно всесторонне оценить используемые ресурсы и конфигурацию сервера. Основные аспекты, которые надо рассмотреть, включают в себя анализ производительности Apache, возможное достижение лимитов соединений, конфигурацию рабочих процессов и регистрацию возможных ошибок в логах.
Теория
Apache — это мощный и гибкий веб-сервер, возможности которого могут быть лимитированы как настройками конфигурации, так и доступностью ресурсов аппаратной платформы. Среди возможных причин таймаутов соединений могут быть следующие:
-
Лимит рабочих процессов и потоков: Apache использует модули, такие как
Prefork
илиWorker
, которые управляют количеством одновременно активных рабочих процессов и потоков. Если запросов больше, чем рабочих процессов, новые соединения будут ожидать своей очереди или будут отклонены. -
Конфигурация модулей и ограничение ресурсов: Модуль
Prefork
более затратен с точки зрения использования памяти, так как создает отдельный процесс для каждого соединения, тогда какWorker
илиEvent
модули используют многопоточность, что позволяет более эффективно использовать ресурсы системы. -
Ограничения конфигурации операционной системы. Конфигурация сетевого стека или лимиты на уровень ядра системы, такие как максимальное количество открытых файловых дескрипторов (
ulimit
), также могут быть причиной проблем со соединением. -
Ограничения на уровне приложения: PHP-сценарии или базы данных могут не справляться с нагрузкой, что тоже может вызывать задержки.
Пример
Предположим ситуацию, что ваш Apache-сервер использует Prefork
модуль. При этом конфигурация сервера выглядит следующим образом:
<IfModule mpm_prefork_module>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxRequestWorkers 150
MaxConnectionsPerChild 1000
</IfModule>
В данном примере MaxRequestWorkers
равен 150, что означает, что одновременно сервер может обработать не более 150 запросов. Если количество одновременно подключенных клиентов превышает это значение, новые клиенты будут сталкиваться с задержкой или отклонением соединения.
Применение
Следующие шаги помогут диагностировать и исправить данную проблему:
-
Проверка лимитов рабочих процессов
- Проверьте текущую конфигурацию Apache. Вы можете сделать это с помощью командной строки, выполнив:
apachectl -M # чтобы увидеть активированные модули
- Убедитесь, что значения директив, таких как
MaxRequestWorkers
, соответствуют предполагаемым нагрузочным сценариям.
- Проверьте текущую конфигурацию Apache. Вы можете сделать это с помощью командной строки, выполнив:
-
Анализ логов
- Включите детализированное логирование, чтобы отслеживать ошибки и предупреждения. Опросите
error.log
иaccess.log
для поиска сообщений, связанных сserver reached MaxRequestWorkers setting
, что указывает на достижение лимита рабочих процессов.
- Включите детализированное логирование, чтобы отслеживать ошибки и предупреждения. Опросите
-
Мониторинг использования памяти и CPU
- Используйте системные утилиты и мониторинг, чтобы наблюдать за пиками использования ресурсов.
- При использовании
sar
, проверьте очереди дисков I/O и системные задержки, которые могут провоцировать замедление работы.
-
Оптимизация конфигурации
- Рассмотрите переход с
Prefork
наWorker
илиEvent
модули, если это возможно. Это будет особенно полезно в случае установки PHP-FPM, так как он лучше интегрируется с многопоточным управлением.
- Рассмотрите переход с
-
Проверка сетевых лимитов
- Используя утилиты, такие как
netstat
, проверьте установленные соединения и убедитесь в отсутствии заблокированных соединений.
- Используя утилиты, такие как
-
Оптимизация PHP
- При переходе на PHP-FPM, настроить пул процессов так, чтобы максимально разгрузить веб-сервер и оптимизировать взаимодействие с базой данных.
Таким образом, анализ и тестирование различных аспектов конфигурации и производительности ваших серверов поможет не только диагностировать проблемы таймаутов, но и оптимизировать использование ресурсов, что в конечном итоге улучшит обслуживание пользователей.