Por que há tantos processos PHP abertos no meu servidor?

Por que há tantos processos PHP abertos no meu servidor?

Hoje vi que um site meu não está funcionando, então fiz ssh no servidor e executei ps -eF. Vejo cerca de 200 processos PHP em execução por 4 horas.

Apache é construído com evento mpm e mod fcgid.

Eu matei todos os processos do PHP e agora está funcionando bem, por que isso acontece? esse é o comportamento esperado?

Eu realmente não entendo como o Apache processa o número de processos PHP e seus IDs de processo, então seria bom se alguém também pudesse fornecer alguma referência quando eu puder ler sobre isso.

Além disso, usei o comando "ab" (Apache Benchmark) para ver se isso acontece o tempo todo, então executei cerca de 4 a 5 vezes seguidas com 30 solicitações simultâneas e novamente há cerca de 150 processos PHP em execução, quando eu continue executando "ab" agora ele não gera mais processos e o site ainda está funcionando. Para deixar claro, as 4-5 vezes que executei "ab" não foram ao mesmo tempo, assim que um processo "ab" terminou executei outro, mas cada vez que executei "ab" fiz 30 solicitações simultâneas.

Por favor, esclareça isso! Obrigado :)

Responder1

Sim, este é o comportamento esperado. Parece que você tinha 5 cópias do ab em execução ao mesmo tempo. Isso resultou em 150 processos PHP para lidar com as 30 solicitações de cada um dos seus 5 processos ab.

O Apache funciona melhor quando todos os seus threads podem ser executados na memória. Haverá uma carga na qual os threads precisarão ser trocados para o disco. O tempo de resposta diminuirá rapidamente quando isso ocorrer. Eliminar processos como você fez melhorará o desempenho. O desempenho do servidor pode ficar ruim neste caso. Se o máximo de threads estiver configurado muito alto é relativamente fácil realizar um DOS (Denial Of Service) utilizando este comportamento.

Outro motivo pelo qual você pode acabar tendo problemas é se dois processos travarem em dois recursos. Se os outros processos precisarem de algum desses recursos, eles poderão não responder. O Apache limitará o número de processos criados neste caso. Eliminar qualquer um dos processos em impasse deve resolver o problema. Dependendo da ordem normal de bloqueio, pode ser necessário que um processo específico seja eliminado para evitar outro impasse. Isto terá pouco ou nenhum impacto no desempenho do servidor.

Erros de programação também podem fazer com que os threads travem. Isso pode fazer com que as cabeças fiquem presas como você viu. Descobrir o que aconteceu é difícil depois do fato, mas o conteúdo dos logs do seu servidor Apache pode ajudar. Verifique se há problemas no log de erros. O log de acesso pode ter entradas para as solicitações que ficaram suspensas no momento em que você encerrou os processos.

O Apache deve eliminar alguns dos processos se eles não forem usados ​​por um período de tempo. Isso é controlado pelo MaxSpareThreadsparâmetro. Verifique seu arquivo de controle que deve conter alguns comentários sobre os parâmetros de Threads, Servidores e Clientes. Os valores padrão geralmente são bons.

Se houver problemas com o código, definir MaxRequestsPerChildalgo entre 5.000 e 100 geralmente ajuda. Quanto menor o número, mais frequentemente novos threads precisam ser criados e mais difícil o servidor Apache precisa trabalhar.

EDIT: O Apache abrirá vários threads na inicialização. Isto depende da interação de vários parâmetros. Veja oDocumentação de configuração do MPMpara obter detalhes sobre os parâmetros. Isso é independente de qualquer carregamento do servidor e normalmente é o número mínimo de threads que um servidor em execução continuará executando.

informação relacionada