PHP-FPM criando muitos processos e consumindo toda a CPU

PHP-FPM criando muitos processos e consumindo toda a CPU

Esta é uma questão urgente. Minha instância AWS com 4 GB de RAM e 2 vCPU está ficando esgotada por muitos processos php-fpm.

PHP-FPM começa a criar muitos processos que não fazia antes. Isso resulta em carregamento lento do site. Não consigo entender por que isso está acontecendo.

Minha configuração do php.ini:

html errors = off
precision = 14
output_buffering = 4096
serialize_precision = 17
max_execution_time = 300
max_input_time = 60
max_input_vars = 5000
log_errors_max_len = 1024
post_max_size = 27M 
upload_max_filesize = 27M 
max_file_uploads = 20
default_socket_timeout = 60
pdo_mysql.cache_size = 2000
memory_limit = 256M

www.conf:

pm = dynamic
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

captura de tela do comando superior: saída do comando superior

Responder1

Respondendo sua pergunta

Em www.conf mude isso (35 processos)

pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000

para isso (8 processos) - ou qualquer número que você quiser

pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000

Você também pode querer corrigir este erro de digitação

max_file_uploads = 20 = 20

Respondendo a pergunta nos comentários

Como pano de fundo, pm.max_children é quantos threads PHP estão disponíveis para solicitações de serviço. Se nenhum thread estiver disponível, uma solicitação será enfileirada, até o tempo limite do servidor web, até que um trabalho esteja disponível.

PHP consome muita memória e bastante CPU. Se você tiver RAM suficiente (digamos) 10 threads PHP, mas alocar 30, seu servidor será trocado e o desempenho será terrível. Se você alocar CPU demais, ela ficará mais lenta, mas não será tão ruim quanto RAM insuficiente.

Em geral, você deve calcular quantos trabalhadores PHP podem ser executados sem esgotar a RAM do servidor. Digamos que seu servidor esteja usando 2 GB de RAM com o PHP desligado e cada thread use 100 MB de RAM, você pode ter cerca de 20 trabalhadores PHP. Você deve tentar evitar a saturação da RAM, pois ela é usada como cache de disco, portanto deixe um pouco de RAM livre.

Você precisa encontrar um equilíbrio entre threads PHP lentos e filas. Ninguém pode fazer isso por você, será uma experimentação até que seu servidor esteja totalmente utilizado, mas sem problemas. Mas, para começar, digamos no máximo 10 threads e partir daí. Use "top" para monitorar a memória livre, mas para memória você pode precisar usar a coluna "res" (residente na memória, presumo) em vez de "virt" para estimar o uso de RAM do PHP.

Opcache

Eu suspeito (mas não tenho certeza) que o conselho para habilitar o opcache está desatualizado, já que o PHP7 está bastante otimizado e provavelmente habilitado por padrão.

Cache

A chave para um bom desempenho com PHP é o cache. Usuários anônimos que acessam uma página que não é personalizada muitas vezes podem ser armazenados em cache, mesmo que seja apenas por 1/5/60 segundos, pode ser uma grande ajuda em um servidor altamente carregado. Certifique-se de que seus cabeçalhos de cache descrevam corretamente a expiração da página e, em seguida, configure o Nginx/Apache para armazenar em cache adequadamente - se você estiver usando um servidor web.

Você também pode armazenar recursos estáticos em cache em um CDN, como CloudFront/CloudFlare (observe que CloudFlare tem um nível gratuito e funciona bem com AWS). Não consumirá muita CPU ou RAM, mas economizará largura de banda. Cada bit ajuda em um servidor carregado.

Responder2

Gostaria de verificar que tipo de CPU você tem. Se você estiver usando Graviton Cpus, eles são 1 para 1 em CPU versus Threads.

ou seja. a contagem da CPU é o que você deve ter como número pm.max_children. Se você tem medo de vazamentos de memória ou de que seja um problema recorrente, você sempre pode usar o pm.max_requestsrecurso e configurá-lo com um valor apropriado.

Esse valor é baseado na rapidez com que o vazamento está crescendo. Muito pequeno e você poderá enfrentar gateways ruins de vez em quando.

informação relacionada