Apache mpm_worker + php: processos que não terminam

1

Estou vendo um problema estranho em nossos servidores da web, onde os processos do Apache parecem permanecer no limbo com 1 ou 2 threads. Isso é desconcertante para mim já que eu estava pensando que queria impor um ServerLimit mais restrito para que eu pudesse aumentar com mais segurança meu php memory_limit.

Alguém saberia de uma boa maneira de solucionar isso? Descobrir o que diabos esses processos estão fazendo? Em que estado eles estão?

Eu não tenho certeza, mas eu diria que isso é causado pelo fato de que nós nunca reiniciávamos o serviço Apache, e executamos 2-3 recarregamentos por dia por várias razões.

Como exemplo, um dos Servidores Web está entediado enquanto o outro é taxado:

  PID        PPID       RES        THREADS   
  *15608     1          29 MB      1         
  8880       1          2 MB       3         
  14989      1          0 MB       1         
  25029      1          0 MB       1         
  2115       15608      3 MB       2         
  13058      15608      361 MB     2         
  14556      15608      157 MB     27        
  19962      15608      23 MB      1         
  21219      15608      387 MB     3         
  21600      15608      3 MB       3         
  21828      15608      3 MB       2         
  30152      15608      3 MB       2     

Neste exemplo, há 3 processos que estou assumindo como o processo de controle (pré-recarga), que ainda estão sendo executados por qualquer motivo. E dos processos anexados ao novo processo de controle, um grupo ainda está com 2-3 segmentos cada.

A partir de 11 horas, muitos desses mesmos PIDs ainda estão por aí com 1 thread. Você pensaria que se MaxRequests tivesse sido atingido, a maldita coisa teria desistido.

memory usage report for apache2
  pid count                     : 11                  
  thread count                  : 46                  
  shared mem usage              : 670 MB              
  total resident size           : 691 MB              
  total cpu usage               : 79 %                
  total memory usage            : 7 %                 
  average mem / pid             : 62 MB               

process breakdown
  PID        PPID       RES        THREADS   
  *15608     1          29 MB      1         
  8880       1          2 MB       3         
  14989      1          0 MB       1         
  25029      1          0 MB       1         
  2115       15608      3 MB       2         
  19962      15608      23 MB      1         
  21219      15608      387 MB     3         
  21600      15608      3 MB       3         
  21828      15608      3 MB       2         
  29239      15608      238 MB     27        
  30152      15608      3 MB       2         

process tree
     |-apache2-+-3*[apache2---{apache2}]
     |         |-apache2
     |         |-2*[apache2---2*[{apache2}]]
     |         '-apache2---26*[{apache2}]
     |-apache2---2*[{apache2}]
     |-2*[apache2]
    
por jonathanserafini 08.09.2010 / 02:45

2 respostas

2

A primeira coisa a verificar é se isso gerou algum processo adicional (você tem o pstree disponível?). As funções exec do PHP estão ativadas?

Outras coisas para ver se você tem keepalives ativados e se maxRequests está configurado para um valor sensato. Os threads estão ociosos ou processando coisas?

O PHP está falando com um backend de banco de dados? Uma vez que o encadeamento de execução entra no cliente do banco de dados, as restrições do PHP com relação ao uso de memória e limites de tempo não são mais aplicadas até que o encadeamento retorne ao PHP. Você está vendo consultas lentas no seu banco de dados?

Outras coisas que valem a pena verificar são se o MTA está configurado corretamente - por exemplo, se você estiver usando o sendmail com um relé inteligente e o endereço que você configurou estiver errado, então a função mail () do php pode bloquear por longos períodos.

A resposta de Rob Olmos a respeito do comentário de Rasmus Lerdorf foi feita 6 anos atrás enquanto ainda pode haver alguma verdade na declaração, não é provável que se aplique às extensões mainstream.

Você não disse qual SO você está usando - IMHO os benefícios do threading no Linux em comparação com o pré-forking são dificilmente detectáveis.

Certamente, se você esgotou os outros caminhos e não tem uma razão convincente para ficar com o apache encadeado, vale a pena experimentar o pré-fork - mas primeiro procure em outro lugar.

    
por 08.09.2010 / 13:11
0

O PHP está sendo executado via mod_php? Os documentos de instalação do PHP dão isto:

Warning We do not recommend using a threaded MPM in production with Apache 2. Use the prefork MPM, which is the default MPM with Apache 2.0 and 2.2. For information on why, read the related FAQ entry on using Apache2 with a threaded MPM

link

Então, eu suspeito que é onde está o problema.

    
por 08.09.2010 / 05:18