O tempo limite das páginas de administração do WordPress, ou demora 30 segundos para carregar no Elastic Beanstalk, PHP 5.6, Apache, RDS e CloudFlare

1

Eu migrei recentemente um site WordPress que eu herdei para a AWS da Rackspace e estou apresentando grandes reduções de desempenho. Eu sou muito novo em toda a coisa do DevOps, então não tenho certeza de onde começar a procurar.

O problema:

Depois que eu aponto o DNS (Cloudflare) do nosso servidor antigo para o novo, o WordPress (especificamente na seção admin) é encontrado por alguns instantes. Mas depois de uma hora ou mais, a página de administração carrega o tempo limite ou leva até 30 segundos para ser carregado. Ainda não testei todas as páginas, mas isso parece acontecer em páginas com editores, por isso, "nova postagem" ou edição de uma página. Quando a página expira, vejo uma mensagem de tempo limite do Cloudflare.

Devo observar que estou fazendo essa mudança por volta das 23h da noite, ninguém além de mim deve estar logado e o tráfego da Web é de cerca de 150 usuários.

Também notei que nossa instância do RDS começa a atingir 100% de uso da CPU, e as conexões com o banco de dados disparam até cerca de 1.000 conexões.

Como o RDS ultrapassou o limite max_connections, o WordPress não pode mais se conectar ao banco de dados e agora o front-end do site mostra a mensagem "não é possível estabelecer conexão com o banco de dados".

Neste ponto, eu pude reiniciar minhas instâncias do ECV2, mas o banco de dados do RDS ainda está classificando as 1000 conexões.

Também notei que parece que o Elastic Load Balancer (clássico) interrompe a distribuição uniforme de tráfego entre as duas instâncias.

Eu vou ter outra chance neste fim de semana, mas o que eu deveria estar procurando nos logs? Antes de as instâncias do EC2 fecharem, eu atendi os logs e tudo que vi foi:

pid 17186:tid 139743773734656] (70007)The timeout specified has expired: [client 127.0.0.1:58604] AH01075: Error dispatching request to : (polling), referer: http://m.facebook.com

Visão geral das especificações:

Servidor - Na AWS, estamos usando de 2 a 6 servidores m3.large EC2 com balanceamento / escalonamento automático, gerenciados pelo Elastic Beanstalk (para a integração com o Github) e um balanceador de carga clássico, o Cloudflare é usado para a terminação de DNS e SSL.

Estamos usando o Apache 2.4 com PHP 5.6 e o PHP-FPM em uma AMI de 64 bits do Amazon Linux / 2.7.1

RDS - R3.Large executando Aurora e parte de um cluster com uma réplica de leitura em execução. Eu tentei usar um R3 Large alguns dias atrás, e as cargas da página de administração foram de 15 a 30 segundos ... Ainda muito lento.

Eu também devo mencionar que o RDS foi instalado, fora do Elastic Beanstalk. Eu não acho que isso deva importar. No entanto, existem dois outros bancos de dados nesse servidor, para alguns sites menores que basicamente não recebem tráfego e serão descomissionados em breve.

Eu habilitei o cache de objetos via W3TC, e adicionei algumas regras do Cloudflare para desabilitar desempenho e aplicativos para / wp-admin * como recomendado aqui

Algumas coisas que li na internet

  • Talvez o limite de tempo limite do ELB seja menor que o limite do Apache e isso está causando problemas
  • Este artigo sugere alterar meu MPM de evento para prefork ou worker
por rugbert 21.09.2018 / 15:49

2 respostas

2

Parece que você tem dois problemas separados:
1) Conexões levam 30s para concluir.
2) Exceder o limite de 1000 conexões para a instância do RDS aurora do db.r3.large, após o qual novas conexões terão seu tempo limite, já que o php não pode mais estabelecer novas sessões no RDS.

O primeiro se parece muito com o problema de resolução de nomes de DNS. Verifique como as conexões do seu banco de dados estão configuradas (IP versus FQDN). Se é FQDN - verifique seu /etc/nsswitch.conf e verifique seu cloudflare. Você quer certificar-se de que a resolução de nomes direta e reversa funcione como deveria e esse atraso de 30 segundos não é causado por isso. Você também pode fazer tcpdump porta 53 para verificar o que está acontecendo com a resolução de nomes.

Para o segundo, você precisa descobrir por que o número de conexões excede 1.000.
Se você não estiver usando o RDS Aurora, qual é o seu número "normal" de conexões? Dependendo de qual DB é usado, haverá diferentes consultas para verificar isso. Se ele normalmente consome mais de 1.000 conexões, você teria que ajustar a instância do RDS de acordo (ou reprojetar o aplicativo, talvez você esteja usando o plug-in Word Press que aumenta esse número de conexões). Se no banco de dados não RDS o número de conexões é significativamente menor que 1000 - então você teria que solucionar o que está causando essas conexões extras.
Poucos links para começar:

por 07.10.2018 / 21:09
2

OK, encontrei a resposta. Fui apresentado à ferramenta MyTop, que é basicamente Top para consultas MYSQL. Graças a essa ferramenta, pude ver que havia uma única consulta em execução milhares e milhares de vezes e acabei sufocando tudo.

Depois que eu identifiquei a consulta, eu pulei para a nova relíquia e usando o rastreio da pilha do banco de dados consegui descobrir qual arquivo php estava executando o código que fez a requisição e lá descobri um loop while que estava fora de controle. Não sei por que esse loop não foi um problema no servidor antigo, mas comentei esse código e agora a AWS é executada como um sonho.

    
por 09.10.2018 / 17:45