Назад | Перейти на главную страницу

Как настроить «рабочих» Apache для максимального параллелизма

Надеюсь, это хороший вопрос, который может быть полезен любому, кто попал в подобную ситуацию. Недавно я сменил очень старшего администратора Linux в своей компании, и впервые мне пришлось настроить новый сервер для обслуживания нашего контента для наших клиентов. Мой предшественник оставил ограниченную документацию по этому вопросу, поскольку на момент его отъезда другие вопросы были более приоритетными. Я подробно ссылался на имеющуюся у меня документацию, а также на конфигурации с предыдущих серверов и много читал в Интернете, чтобы все настроить.

«Стек» сервера, который я создаю, выглядит следующим образом: CentOS 7, Apache 2.4.6, MariaDB 5.X, Tomcat 7, обслуживающий JSP / сервлеты. Предыдущие установки для производства использовали CentOS 5, более старые версии Apache и MySQL и Tomcat 5.X.

Apache - это внешний интерфейс, он использует AJP для подключения к серверу Tomcat. Большая часть трафика будет HTTPS.

Я думаю, что это сервер HP Gen 9, он имеет 32 ГБ ОЗУ и твердотельные накопители в массиве RAID 1. После того, как он заработал, я теперь заинтересован в максимальном увеличении его способности обслуживать пользователей одновременно. Я ожидаю, что всплеск нескольких сотен пользователей не будет чем-то необычным. С этой целью я старался предотвратить узкие места в любой точке стека: начиная с Tomcat и MariaDB и принимая меры, специфичные для тех, меры, которыми я удовлетворен. Однако, переходя к Apache, мне труднее понять, что я должен делать.

Есть 3 разных типа «рабочих», и у меня есть 3 основные проблемы с их оптимизацией:
1. Есть три варианта: prefork, mpm_worker и mpm_event. Я действительно не понимаю, как их настраивать, хотя у меня есть общее представление о том, для чего они используются.
2. В отличие от Apache на предыдущих серверах, параметры StartServers, ServerLimit, MaxRequestsPerChild и т. Д. Не указаны в /etc/httpd/conf/httpd.conf. Могут ли быть настройки по умолчанию, которые мне нужно изменить вручную? Есть ли какая-либо причина, кроме «они были добавлены вручную в прошлый раз», что настройки будут найдены в более старом httpd.conf, но не в новом?

Я говорю об этом, в старом httpd.conf я не вижу ничего похожего нигде в новых файлах конфигурации, только спецификацию:

// предварительная вилка MPM
// StartServers: количество запускаемых серверных процессов
// MinSpareServers: минимальное количество серверных процессов, которые остаются резервными
// MaxSpareServers: максимальное количество серверных процессов, которые остаются резервными
// ServerLimit: максимальное значение для MaxClients за время жизни сервера
// MaxClients: максимальное количество серверных процессов, разрешенных для запуска
// MaxRequestsPerChild: максимальное количество запросов, обслуживаемых серверным процессом

StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

// рабочий MPM
// StartServers: начальное количество серверных процессов для запуска
// MaxClients: максимальное количество одновременных клиентских подключений
// MinSpareThreads: минимальное количество рабочих потоков, которые остаются резервными
// MaxSpareThreads: максимальное количество рабочих потоков, которые остаются резервными
// ThreadsPerChild: постоянное количество рабочих потоков в каждом серверном процессе
// MaxRequestsPerChild: максимальное количество запросов, обслуживаемых серверным процессом

StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
Темы для ребенка 25
MaxRequestsPerChild 0

Обратите внимание, что я заменил знаки решетки на // для обозначения комментариев в httpd.conf, потому что знак решетки заставляет текст отображаться как заголовок.

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

  1. После небольшой настройки я могу запустить сервер с mpm_worker, если захочу (сначала нужно отключить файл php.conf), но я не уверен, что модули, управляющие всем, безопасны для потоков (модули для виртуальных хостов, openssl, mod_proxy_ajp). mod_proxy_ajp - единственное, что я использую, что было бы необычно в каком-то смысле.

Сервер еще не находится в производстве, поэтому у меня нет возможности получить среднее использование памяти для большого количества текущих клиентов, чтобы помочь определить «идеальное» количество максимальных клиентов, кроме того, я не беспокоюсь о получении идеальный номер, просто адекватный.

Если я хочу убедиться, что примерно ~ 400 человек, возможно, немного больше могут использовать сервер в данный момент, и никто не увидит ошибок типа http 500, какие настройки мне следует использовать для Apache?

Заранее спасибо, надеюсь, это не слишком глупо.

Кажется, здесь много возможных вопросов, немного неструктурированных для «ответа». Позвольте мне помочь ответить на некоторые вопросы.

  • Определите, какие модули многопроцессорной обработки (MPM) используются.

    Самый простой способ - сбросить все запущенные в данный момент модули и выбрать mpm те, чтобы увидеть, что работает. Вот два метода:

    # apachectl -M | grep mpm
    mpm_worker_module (shared)
    # httpd -V | grep MPM
    Server MPM:     worker
    
  • Изменить используемый MPM

    В CentOS7 это теперь контролируется в файле конфигурации с именем /etc/httpd/conf.modules.d/00-mpm.conf. Это небольшой файл, и только один LoadModule следует раскомментировать в любое время.

    LoadModule mpm_worker_module modules/mod_mpm_worker.so

    После изменения требуется перезапуск службы, чтобы активировать желаемый MPM.

  • Установите желаемые значения конфигурации

    Многие директивы конфигурации модуля имеют значения по умолчанию, если они не указаны. StartServers с помощью worker по умолчанию будет 3, при использовании prefork = 5. Подробнее см. Здесь: https://httpd.apache.org/docs/current/mod/mpm_common.html#startservers . Я бы рекомендовал создать новый файл, содержащий ваши переопределения, вместо редактирования существующего.

    Что-то вроде /etc/httpd/conf.modules.d/10-worker.conf:

    <IfModule mpm_worker_module>
        ServerLimit             250
        StartServers             10
        MinSpareThreads          75
        MaxSpareThreads         250
        ThreadLimit              64
        ThreadsPerChild          32
        MaxClients             8000
        MaxRequestsPerChild   10000
    </IfModule>
    

Как и во всем остальном, настройка точных чисел предоставляется вам, чтобы протестировать свои рабочие нагрузки и приложения - такие инструменты, как ab и siege может помочь.