Estamos executando um contêiner php-fpm no Kubernetes. Esta é uma configuração de teste, portanto, para preservar recursos, o php-fpm (8.1) está configurado com:
pm = ondemand
pm.max_children = 5
pm.max_requests = 1000
A aplicação não está em uso (por exemplo, nenhuma solicitação à aplicação, nada no log de acesso). Ainda assim, há sempre um processo de trabalho em execução neste pool.
Pergunta: Como posso descobrir o que está fazendo com que o php-fpm gere esse trabalhador?
Coisas que olhei:
- netstat: php-fpm: processo mestre escutando na porta 9000 e conectado a dois soquetes unix (que seriam stdout e stderr), nada mais
- logs de acesso: vazio
- config: pm.min_spare_servers está definido como 1 (que é o padrão), mas o arquivo de configuração indica que isso é usado apenas com o agendador 'dinâmico'
- ao executar o php-fpm com configuração idêntica fora do Kubernetes, nenhum filho é gerado (ou todos eles saem) quando o site está ocioso
Você está correto em sua análise. A razão pela qual você vê um processo de trabalho em execução em seu contêiner php-fpm com o gerenciador de processos ondemand e pm.min_spare_servers não definido como 1 é provavelmente devido ao comportamento padrão do modo ondemand.
No modo ondemand, o processo de trabalho só começa em resposta às solicitações. No entanto, mantém a existência de um processo de trabalho indefinidamente para lidar com possíveis aumentos no tráfego ou na solicitação inicial. Isso evita que cada solicitação comece do zero.
pm.min_spare_servers Como você mencionou, as configurações se aplicam apenas a gerenciadores de processos dinâmicos, que pré-bifurcam um certo número de processos de trabalho para ficarem prontos. Isso não influencia o comportamento sob demanda.
Embora possa não haver uma causa externa gerando esse trabalhador em seu cenário atual. Em seu ambiente de teste, manter um processo de trabalho ativo com o modo sob demanda é uma abordagem razoável para equilibrar a conservação de recursos com o tratamento de possíveis aumentos de tráfego.
Considere o modo estático para produção. Se você mover esta configuração para produção e conhecer o padrão de tráfego esperado, considere usar o gerenciador de processos estáticos. Este modo inicia um número fixo de processos de trabalho com base em sua configuração. ( por exemplo; pm.max_children )
Considere usar uma estratégia de gerenciador de processos php-fpm que melhor se adapte à sua configuração do Kubernetes.
Consulte esta configuração do manual do PHP para obter mais informações.
EDITAR 1
O modo ondemand no php-fpm só deve gerar processos de trabalho quando as solicitações chegam. Depois que uma solicitação é atendida, os processos de trabalho devem terminar por padrão.
Em um ambiente não Kubernetes, a execução do php-fpm no modo ondemand e nenhuma solicitação recebida deve resultar na ativação apenas do processo mestre, exatamente como você está enfrentando.
Algumas implantações do Kubernetes utilizam sondagens de atividade e prontidão para monitorar a integridade dos pods. Essas investigações podem acionar periodicamente a geração de trabalhadores, mesmo sem solicitações recebidas.