Apache PHP - Lidar com pedido simultâneo 1000

1

Pergunta movida do Stackoverflow

Eu tenho um script PHP que lida com o pedido do cliente. Eu deveria estar em uma situação para lidar com 1000 solicitações simultâneas (usando o benchmark do Apache). Quando eu atualmente executo o benchmark do apache com 300 solicitações simultâneas, eu sou capaz de lidar com todas as requisições.Mas quando eu exceder a marca de 300, o apache não é capaz de lidar com isso. (Sai com apr_socket_recv: Conexão redefinida pelo peer (104))

E este é o log de erros do 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

Esta é a configuração do mpm prefork -

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

Da configuração acima, eu consegui lidar com 256 * 4 > 1000 solicitações simultaneamente. Atualmente, estou usando uma máquina de 8 núcleos com 16 GB de RAM.

É possível para o meu servidor apache lidar com 1000 solicitações simultâneas?

Mais detalhes sobre o que meu código PHP faz

Ao receber a solicitação do cliente, meu script php, por sua vez, inicia um script python. Este script python, tele em 50 máquinas diferentes em paralelo usando o multiprocessamento python. Em média, leva 0,5 segundos para concluir uma solicitação.

EDITAR

De acordo com a sugestão de shodanshok.Eu mudei o arquivo conf do trabalhador mpm para isso: -

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

Mas o benchmarking ainda não é concluído, sai muito cedo. E é isso que eu encontrei nos logs do 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'
    
por user3398752 29.10.2015 / 19:52

1 resposta

2

Você entendeu mal o que MaxRequestWorkers e MaxConnectionsPerChild fazem. Na página de manual :

The MaxRequestWorkers directive sets the limit on the number of simultaneous requests that will be served. Any connection attempts over the MaxRequestWorkers limit will normally be queued, up to a number based on the ListenBacklog directive. Once a child process is freed at the end of a different request, the connection will then be serviced.

For non-threaded servers (i.e., prefork), MaxRequestWorkers translates into the maximum number of child processes that will be launched to serve requests. The default value is 256; to increase it, you must also raise ServerLimit.

For threaded and hybrid servers (e.g. event or worker) MaxRequestWorkers restricts the total number of threads that will be available to serve clients. For hybrid MPMs the default value is 16 (ServerLimit) multiplied by the value of 25 (ThreadsPerChild). Therefore, to increase MaxRequestWorkers to a value that requires more than 16 processes, you must also raise ServerLimit.

e

The MaxConnectionsPerChild directive sets the limit on the number of connections that an individual child server process will handle. After MaxConnectionsPerChild connections, the child process will die. If MaxConnectionsPerChild is 0, then the process will never expire.

Em suma, no modo prefork, MaxRequestWorkers é o número total de conexão simultânea permitida. MaxConnectionsPerChild está aqui apenas para dizer à criança para morrer depois de tantas conexões.

Em outras palavras: aumentar sua configuração MaxRequestWorkers resolverá seu problema.

    
por 29.10.2015 / 19:59