Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Quais são os limites de conexão do Google Cloud SQL do App Engine e como reutilizar melhor as conexões de banco de dados?


Resposta curta:Suas consultas provavelmente são muito lentas e o servidor mysql não possui threads suficientes para processar todas as solicitações que você está tentando enviar.

Resposta longa:

Como pano de fundo, o Cloud SQL tem dois limites que são relevantes aqui:
  • Conexões:correspondem ao objeto 'conn' em seu código. Existe uma estrutura de dados correspondente no servidor. Quando você tiver muitos desses objetos (atualmente configurados para 1000), o menos usado recentemente será fechado automaticamente. Quando uma conexão for fechada abaixo de você, você receberá um erro de conexão desconhecido (ApplicationError:1007) na próxima vez que tentar usar essa conexão.
  • Solicitações simultâneas:são consultas que estão sendo executadas no servidor. Cada consulta em execução vincula um encadeamento no servidor, portanto, há um limite de 100. Quando houver muitas solicitações simultâneas, as solicitações subsequentes serão rejeitadas com o erro que você está recebendo (ApplicationError:1033)

Não parece que o limite de conexão esteja afetando você, mas eu queria mencioná-lo apenas por precaução.

Quando se trata de solicitações simultâneas, aumentar o limite pode ajudar, mas geralmente piora o problema. Há dois casos que vimos no passado:
  • Deadlock:uma consulta de longa duração está bloqueando uma linha crítica do banco de dados. Todas as consultas subsequentes são bloqueadas nesse bloqueio. O aplicativo expira nessas consultas, mas elas continuam sendo executadas no servidor, amarrando esses encadeamentos até que o tempo limite de impasse acionadores.
  • Consultas lentas:cada consulta é muito, muito lenta. Isso geralmente acontece quando a consulta requer uma classificação de arquivo temporária. O aplicativo atinge o tempo limite e tenta novamente a consulta enquanto a primeira tentativa da consulta ainda está em execução e contando com o limite de solicitações simultâneas. Se você puder encontrar seu tempo médio de consulta, poderá obter uma estimativa de quantos QPS sua instância do mysql pode suportar (por exemplo, 5 ms por consulta significa 200 QPS para cada encadeamento. Como existem 100 encadeamentos, você pode fazer 20.000 QPS. 50 ms por consulta significa 2.000 QPS.)

Você deve usar EXPLAIN e MOSTRAR STATUS DO ENGINE INNODB para ver qual dos dois problemas está acontecendo.

Claro, também é possível que você esteja apenas direcionando uma tonelada de tráfego em sua instância e simplesmente não haja threads suficientes. Nesse caso, você provavelmente estará maximizando a CPU para a instância de qualquer maneira, portanto, adicionar mais threads não ajudará.