Как определить, если у Apache недостаточно ресурсов или ограничено количество входящих подключений?

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

У меня есть некоторые проблемы с LAMP веб-сервером, некоторые клиенты испытывают тайм-аут вызова в часы пик.

Я проверил историческое использование ресурсов ВМ с помощью sar, загрузка процессора менее 30%, а использование памяти менее 60/70% без свопа.

Я не нашел ничего действительно полезного в логах приложения, я проверил журналы systemctl, ядро, syslog, логи apache и т. д.

Мне интересно, как я могу определить, закончилось ли у Apache количество рабочих процессов или памяти? Он что-то логирует в такой ситуации?

Я планирую переключить php модуль с prefork mod_php на fpm, но это вслепую, у меня нет понятия, достиг ли я максимального количества соединений, и более того, я не знаю, совместим ли симптом тайм-аута клиента с насыщением соединений (или я ожидал бы немедленного завершения TCP обмена Apache).

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

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

Теория

Apache — это мощный и гибкий веб-сервер, возможности которого могут быть лимитированы как настройками конфигурации, так и доступностью ресурсов аппаратной платформы. Среди возможных причин таймаутов соединений могут быть следующие:

  1. Лимит рабочих процессов и потоков: Apache использует модули, такие как Prefork или Worker, которые управляют количеством одновременно активных рабочих процессов и потоков. Если запросов больше, чем рабочих процессов, новые соединения будут ожидать своей очереди или будут отклонены.

  2. Конфигурация модулей и ограничение ресурсов: Модуль Prefork более затратен с точки зрения использования памяти, так как создает отдельный процесс для каждого соединения, тогда как Worker или Event модули используют многопоточность, что позволяет более эффективно использовать ресурсы системы.

  3. Ограничения конфигурации операционной системы. Конфигурация сетевого стека или лимиты на уровень ядра системы, такие как максимальное количество открытых файловых дескрипторов (ulimit), также могут быть причиной проблем со соединением.

  4. Ограничения на уровне приложения: PHP-сценарии или базы данных могут не справляться с нагрузкой, что тоже может вызывать задержки.

Пример

Предположим ситуацию, что ваш Apache-сервер использует Prefork модуль. При этом конфигурация сервера выглядит следующим образом:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers          10
    MaxRequestWorkers        150
    MaxConnectionsPerChild   1000
</IfModule>

В данном примере MaxRequestWorkers равен 150, что означает, что одновременно сервер может обработать не более 150 запросов. Если количество одновременно подключенных клиентов превышает это значение, новые клиенты будут сталкиваться с задержкой или отклонением соединения.

Применение

Следующие шаги помогут диагностировать и исправить данную проблему:

  1. Проверка лимитов рабочих процессов

    • Проверьте текущую конфигурацию Apache. Вы можете сделать это с помощью командной строки, выполнив:
      apachectl -M # чтобы увидеть активированные модули
    • Убедитесь, что значения директив, таких как MaxRequestWorkers, соответствуют предполагаемым нагрузочным сценариям.
  2. Анализ логов

    • Включите детализированное логирование, чтобы отслеживать ошибки и предупреждения. Опросите error.log и access.log для поиска сообщений, связанных с server reached MaxRequestWorkers setting, что указывает на достижение лимита рабочих процессов.
  3. Мониторинг использования памяти и CPU

    • Используйте системные утилиты и мониторинг, чтобы наблюдать за пиками использования ресурсов.
    • При использовании sar, проверьте очереди дисков I/O и системные задержки, которые могут провоцировать замедление работы.
  4. Оптимизация конфигурации

    • Рассмотрите переход с Prefork на Worker или Event модули, если это возможно. Это будет особенно полезно в случае установки PHP-FPM, так как он лучше интегрируется с многопоточным управлением.
  5. Проверка сетевых лимитов

    • Используя утилиты, такие как netstat, проверьте установленные соединения и убедитесь в отсутствии заблокированных соединений.
  6. Оптимизация PHP

    • При переходе на PHP-FPM, настроить пул процессов так, чтобы максимально разгрузить веб-сервер и оптимизировать взаимодействие с базой данных.

Таким образом, анализ и тестирование различных аспектов конфигурации и производительности ваших серверов поможет не только диагностировать проблемы таймаутов, но и оптимизировать использование ресурсов, что в конечном итоге улучшит обслуживание пользователей.

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

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