Constantemente tem que recarregar o PHP-FPM

27

Temos um servidor bastante carregado executando o nginx e o PHP-FPM. Temos 6 sites neste servidor, executando PHP-FPM e nginx. O software é todo vBulletin 3.8 e WordPress. Os bancos de dados estão em um servidor separado.

Agora, como esses sites são muito populares, normalmente temos de 7 a 8.000 visitantes on-line ao mesmo tempo, com cada página atingindo o banco de dados em sua maior parte. Eu acredito que esta é a causa dos nossos problemas.

Como temos muitos bancos de dados grandes no servidor MySQL e como as consultas podem, honestamente, ser muito melhores no software, acho que o MySQL ocasionalmente falha em retornar resultados ao PHP em tempo hábil, criando um efeito em cascata que eventualmente faz com que tudo pare até recarregarmos o PHP-FPM. Depois disso, as coisas começam a funcionar bem novamente.

A razão pela qual estou tendo problemas para solucionar isso é porque realmente não consigo discernir nada dos logs. No log de consultas lentas do MySQL, não vejo nada de interessante quando ocorre o tempo de inatividade. Nos logs do nginx, vejo milhares de entradas dizendo que a solicitação de leitura atingiu o tempo limite ou a conexão atingiu o tempo limite (para PHP-FPM). E nos logs do PHP-FPM, vejo muitas linhas que dizem "tempo de execução esgotado (31 seg), terminando

Então, neste ponto, eu simplesmente não sei onde procurar o problema. Obviamente, tudo o que está acontecendo está acontecendo porque esses scripts não são executados com rapidez suficiente às vezes (normalmente eles carregam em menos de um segundo, mas algo acontece que faz com que o tempo de carregamento suba rapidamente). Isso acontece muitas vezes ao dia e se tornou um problema para nós.

Por enquanto, eu simplesmente tenho um crontab para reparar o php5-fpm a cada 10 minutos, o que resolve o problema de falha. Obviamente, quando o PHP é recarregado, o nginx gera um erro de gateway 502, por isso não é muita solução.

O PHP está executando o cache da APC, se isso importa. Li em alguns pontos que a APC pode causar interrupção em determinadas circunstâncias.

Qualquer ponteiro seria útil. Eu realmente gostaria de não ter que me preocupar com essa máquina o tempo todo.

Mais informações podem ser fornecidas, é claro. Deixe-me saber o que você precisa.

Atualização: eu apenas copiei o apc.php em uma raiz da web e o acessei para ver nossas estatísticas. As coisas pareciam boas. Em seguida, cliquei no link para acessar Estatísticas do usuário e BOOM, o servidor travou instantaneamente. Eu recarreguei o php-fpm e, em seguida, recarreguei a página de estatísticas do usuário e ela passou bem. Esperou um minuto, recarregou novamente, o servidor desligou novamente.

Então isso definitivamente parece estar relacionado à APC. A questão é - como podemos corrigi-lo?

Configuração da APC:

[apc]
apc.enabled="1"
apc.stat = "1"
apc.max_file_size = "2M"
apc.localcache = "1"
apc.localcache.size = "256"
apc.shm_segments = "1"
apc.ttl = "3600"
apc.user_ttl = "7200"
apc.gc_ttl = "3600"
apc.cache_by_default = "1"
apc.filters = ""
apc.write_lock = "1"
apc.num_files_hint= "10000"
apc.user_entries_hint="10000"
apc.shm_size = "1G"
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.include_once_override = "0"
apc.file_update_protection="2"
apc.canonicalize = "1"
apc.report_autofilter="0"
apc.stat_ctime="0"

Atualização 2: fizemos alguns progressos aqui. Acontece que o plug-in de cache do WordPress (W3 Total Cache) é o que estava causando as falhas. Ainda não sabemos o porquê, mas, com ele desativado, rodamos o PHP há quase 4 horas, sem recarregamentos, lentidão ou travamentos. Ainda estamos usando a APC nos fóruns do vBulletin e não há problemas. Existe alguma maneira de determinar POR QUE a APC está travando? Adoraria usá-lo em nossas instalações do WordPress, mas não à custa de um sistema frágil.

Kevin
fonte
Você pode publicar quaisquer configurações relacionadas à APC que possui?
Kyle
Sim, boa ideia. Feito.
Kevin
Quanto ram e swap você possui nesta máquina? Quanto é usado quando começa a morrer?
Kyle
2
A APC é um pesadelo horrível e foi a única fonte de falhas como essa em um dos meus sites por anos . Eu finalmente me livrei completamente disso; e o PHP agora é sólido. Se você deseja armazenar em cache, tente o Zend Opcache, que também é o cache padrão do PHP 5.5.
Michael Hampton
11
Sim, acabou sendo a APC que estava travando o PHP. Quando desativamos o APC, paramos de reiniciar o PHP constantemente.
Kevin em

Respostas:

27

Você está usando php-fpm, então sugiro que seja mais agressivo com quanto tempo as crianças do php-fpm têm permissão para viver. Você precisa encontrar o ponto ideal entre threads / filhos em breve e estabilidade. Os padrões php-fpm são muito generosos para qualquer sistema de produção, o IMHO.

Reduziria o número de pm.max_requests para seus conjuntos de produção. Eu acho que o padrão é 200. Eu começaria a partir de 50 e veria onde isso leva você.

Falhando / complementar a isso, você também pode tentar estas 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 isto 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 esperam 5s por uma reação aos sinais do mestre.

Isso deve manter seu pool de threads de trabalho PHP agradável, fresco e limpo. Quanto mais tempo um trabalhador puder fornecer solicitações, mais instável ficará. Há também um risco maior de vazamento de memória.

Aqui está uma boa visão geral de todas as opções de configuração que mencionei aqui, além de outras: http://myjeeva.com/php-fpm-configuration-101.html

Espero que essas dicas ajudem você! Lembre-se de ajustar e observar, infelizmente não parece haver uma regra geral para tudo isso, existem muitas variáveis ​​que afetam o comportamento e a estabilidade do PHP.

Rouben
fonte
11
Qual sua opinião sobre o uso do cron para reiniciar o php5-fpm a cada hora?
CMCDragonkai
2
Essa é uma maneira bastante irregular de fazê-lo, e pode não funcionar. O PHP-FPM possui vários ajustes embutidos, por isso é melhor usar esse ajuste.
Rouben
11
Esta resposta me apontou na direção certa. Eu mesmo vi um problema semelhante, a solução para mim foi mudar pmde dynamicpara ondemande tudo parece estar funcionando muito bem agora com todos os outros valores padrão.
Llanato
(em php-fpm.conf) deve ser '=' em vez de '' separando a chave e o valor. emergency_restart_threshold = 3 emergency_restart_interval = 1m process_control_timeout = 5s
justyy
Estou ficandoERROR: [/etc/php/7.0/fpm/pool.d/www.conf:135] unknown entry 'emergency_restart_threshold'
deweydb