Algumas coisas a serem consideradas (desculpas antecipadas se você já considerou isso): Primeiro de tudo, certifique-se de otimizar a configuração do nginx e invocar o php-fpm somente quando for absolutamente necessário. A última coisa que você quer fazer é deixar o php manejar coisas como páginas HTML estáticas (o que fará felizmente).
Em segundo lugar, como você está usando o php-fpm, sugiro ser mais agressivo com o tempo que os filhos do php-fpm podem viver. Você precisa encontrar o ponto ideal entre os fios / filhos pouco vividos e a estabilidade. Os padrões php-fpm são muito generosos para qualquer sistema de produção, IMHO. Quanto mais tempo um funcionário tiver permissão para atender a solicitações, mais instável ele ficará. Há também um risco maior de vazamentos de memória, e se essa estrutura a que você se refere tem erros como loops infinitos, o que pode estar causando dor com carga da CPU, isso não deve doer.
Eu reduziria o número de pm.max_requests
para seus pools de produção. Eu acho que o padrão é 200. Eu começaria de 50 e veria onde isso leva você.
Em caso de falha / complementar a isso, você também pode tentar essas opções globais (AFAIK, todas elas estão desativadas por padrão):
emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s
O que isso significa? Se 3 processos-filhos do PHP-FPM saírem com SIGSEGV ou SIGBUS (ou seja, travar) dentro de 1 minuto, o PHP-FPM deve reiniciar automaticamente. Os processos filhos aguardam 5s por uma reação nos sinais do mestre.
Aqui está uma boa visão geral de todas as opções de configuração que mencionei aqui, além de outras: link
Espero que essas dicas o ajudem! Lembre-se de ajustar e observar, infelizmente não parece haver uma regra para tudo isso, como você observou, existem muitas variáveis que afetam o comportamento e a estabilidade do PHP.
Finalmente, o recurso de limitação de CPU que você perguntou é documentado aqui , mas eu só usaria para isso, se você esgotar todas as outras opções. Se você escolher esse caminho, eu definitivamente ficaria atento a possíveis interações entre ajustes do PHP-FPM e sua configuração de limits.conf. Nesse ponto, o etckeeper pode ser um salva-vidas! :)
Boa sorte!
Rouben