php5-fpm: servidor atingido pm.max_children

41

Eu tenho Nginx + php5-fpm . Várias vezes por hora, meu site é armazenado e, no arquivo de log, vejo o seguinte:

AVISO: o servidor [pool www] atingiu a configuração pm.max_children (5), considere criá-lo.

O arquivo /etc/php5/fpm/pool.d/www.conf contém a seguinte configuração:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Servidor: AMD Opteron ™ 3280, Octo-Core, 8x 2,4 GHz, 16 GB DIMM (DDR3).

Não tenho idéia de quais números devo colocar no arquivo www.conf para este servidor. Posso ajudar alguém? obrigado

user1821484
fonte

Respostas:

40

Existem muitas razões possíveis pelas quais seu PHP-FPM alcançaria o max_children. Os mais comuns são:

  • Muitas solicitações paralelas de seus clientes
  • Execução lenta dos scripts PHP
  • Configuração muito baixa do max_children

Observando as especificações de sua máquina, supondo que não exista nada além de PHP + Nginx em execução, acho que você pode configurá-la muito maior que 5. Você diz que possui 8 núcleos, geralmente o Nginx precisa de muito menos CPU que PHP, portanto, com 5 filhos você provavelmente nunca poderá usar todos eles. Normalmente, eu o defino como algo como o número de núcleos x 2 ou o número de núcleos x 4 , dependendo do consumo de memória dos scripts PHP.

repetição
fonte
É um site de namoro com php chat e os usuários enviam milhões de mensagens instantâneas. Ontem à noite, quando eu tinha ~ 300 usuários online, o comando netstat -an | grep 80 | wc - resultado foi quase 400. #
user1821484
1
Na verdade, tenho um site de namoro semelhante. Eu acho que você definitivamente precisa de mais filhos PHP. Minha configuração é a seguinte: 20k usuários online simultâneos, 12 máquinas PHP com 8 núcleos cada, 32 trabalhadores em cada uma das máquinas PHP. Isso funciona muito bem. Você também deve verificar quanta memória livre você possui, eu suspeito que você tenha alguma, a menos que seu PHP seja enorme. Se você tem memória livre, por que não usá-la para mais trabalhadores?
replay
@ user1821484 Isso está correto; pm.max_childrené muito baixo . Um valor de 10 é razoável para um servidor VPS pequeno com 1 GB de RAM; você tem um servidor muito maior. Aumente esse valor até parar de receber os erros e, em seguida, aumente-o novamente caso ocorra um pico de tráfego.
Michael Hampton
Obrigado pelas respostas. Aumentei a configuração de pm.max_children para 10 e agora comecei a receber este erro: AVISO: [pool www] parece ocupado (talvez você precise aumentar pm.start_servers ou pm.min / max_spare_servers), gerando 16 filhos, existem 0 ocioso e 8 filhos no total. Alguém pode me sugerir o que eu preciso aumentar? Obrigado.
user1821484
núcleos x 2 ou núcleos x 4 parece muito baixo para mim. Eu tenho uma máquina com 8 núcleos e 8 GB de RAM com pm.max_children = 48 e ainda recebemos o servidor atingido avisos de pm.max_children . Esta máquina não está nem perto de seus limites de CPU ou memória. Uma abordagem melhor, penso, seria otimizar essa configuração em conjunto com as configurações correspondentes do nginx (ou apache) e escolher um valor após determinar a quantidade de memória que cada processo PHP consome.
S. Imp
19

Descobri que, definindo o valor pm.max_requests (que é comentado por padrão), ajudou a corrigir esses erros. Essa configuração força solicitações filho a reaparecer após a execução de um certo número de solicitações e pode ser útil se houver vazamento de memória em algum lugar do seu código ou de bibliotecas de terceiros.

Em /etc/php-fpm.d/www.conf :

pm.max_requests = 500
Tom Jowitt
fonte
13

Esse link pode ser útil - explica como calcular o número de processos filhos com base na quantidade de memória no sistema:

HTF
fonte
7
Essa resposta será inútil assim que o link desaparecer.
miken32
2
Basicamente, o link diz ... valor apropriado para pm.max_children pode ser calculado como: pm.max_children = Total de RAM dedicada ao servidor web / Max tamanho processo filho
jaywhy13