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

PHP Apache - Обработка 1000 одновременных запросов

Вопрос перемещен из Stackoverflow

У меня есть PHP-скрипт, который обрабатывает запросы от клиента. Я должен быть в ситуации, чтобы обработать 1000 одновременных запросов (используя тест apache). Когда я сейчас запускаю тест apache с 300 одновременными запросами, я могу обрабатывать все запросы, но когда я превышаю отметку 300, apache не может справиться с этим. (Он завершается с apr_socket_recv: сброс соединения одноранговым узлом (104))

А это журнал ошибок apache.

[Thu Oct 29 11:20:34.984542 2015] [mpm_prefork:notice] [pid 6244] AH00163: Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.13 configured -- resuming normal operations
[Thu Oct 29 11:20:34.984581 2015] [core:notice] [pid 6244] AH00094: Command line: '/usr/sbin/apache2'
[Thu Oct 29 11:21:38.638943 2015] [mpm_prefork:error] [pid 6244] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

Это конфигурация prefork mpm -

<IfModule mpm_prefork_module>
    StartServers              8
    MinSpareServers           5
    MaxSpareServers          20
    MaxRequestWorkers        256
    MaxConnectionsPerChild   4
</IfModule>

Из приведенной выше конфигурации я мог обрабатывать 256 * 4> 1000 запросов одновременно. В настоящее время я использую 8-ядерный компьютер с 16 ГБ оперативной памяти.

Может ли мой сервер Apache обрабатывать 1000 одновременных запросов?

Подробнее о том, что делает мой PHP-код

При получении клиентского запроса мой php-скрипт, в свою очередь, запускает python-скрипт. Этот скрипт Python подключается к 50 различным машинам параллельно с использованием многопроцессорной обработки Python. В среднем на выполнение одного запроса уходит 0,5 секунды.

РЕДАКТИРОВАТЬ

По предложению shodanshok.Я изменил файл conf mpm worker на это: -

   <IfModule mpm_prefork_module>
        ServerLimit              300
        StartServers              50
        MinSpareServers           5
        MaxSpareServers          10
        MaxRequestWorkers        300
        MaxConnectionsPerChild   0 
   </IfModule>

Но бенчмаркинг все еще не завершен, он завершается очень рано. И это то, что я нашел в журналах apache.

[Thu Oct 29 12:14:42.372184 2015] [mpm_prefork:notice] [pid 29261] AH00169: caught SIGTERM, shutting down
[Thu Oct 29 12:14:42.913499 2015] [mpm_prefork:notice] [pid 1397] AH00163: Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.13 configured -- resuming normal operations
[Thu Oct 29 12:14:42.913539 2015] [core:notice] [pid 1397] AH00094: Command line: '/usr/sbin/apache2'

Вы не понимаете, что MaxRequestWorkers и MaxConnectionsPerChild делать. Из страница руководства:

Директива MaxRequestWorkers устанавливает ограничение на количество одновременных запросов, которые будут обслуживаться. Любые попытки подключения сверх лимита MaxRequestWorkers обычно ставятся в очередь до числа, зависящего от директивы ListenBacklog. Как только дочерний процесс будет освобожден в конце другого запроса, соединение будет обслуживаться.

Для серверов без потоков (например, prefork) MaxRequestWorkers преобразуется в максимальное количество дочерних процессов, которые будут запущены для обслуживания запросов. Значение по умолчанию - 256; чтобы увеличить его, необходимо также увеличить ServerLimit.

Для многопоточных и гибридных серверов (например, событийных или рабочих) MaxRequestWorkers ограничивает общее количество потоков, которые будут доступны для обслуживания клиентов. Для гибридных MPM значение по умолчанию - 16 (ServerLimit), умноженное на значение 25 (ThreadsPerChild). Следовательно, чтобы увеличить MaxRequestWorkers до значения, требующего более 16 процессов, необходимо также увеличить ServerLimit.

и

Директива MaxConnectionsPerChild устанавливает ограничение на количество подключений, которые будет обрабатывать отдельный дочерний серверный процесс. После подключений MaxConnectionsPerChild дочерний процесс умрет. Если MaxConnectionsPerChild равен 0, то процесс никогда не истечет.

Короче говоря, в режиме prefork, MaxRequestWorkers это общее количество допустимое количество одновременных подключений. MaxConnectionsPerChild здесь только для того, чтобы сказать ребенку, что он умер после стольких связей.

Другими словами: поднимите свой MaxRequestWorkers настройка решит вашу проблему.