Mysql
 sql >> Base de données >  >> RDS >> Mysql

Quelles sont les limites de connexion pour Google Cloud SQL à partir d'App Engine et comment réutiliser au mieux les connexions à la base de données ?

Réponse courte :vos requêtes sont probablement trop lentes et le serveur mysql n'a pas assez de threads pour traiter toutes les requêtes que vous essayez de lui envoyer.

Réponse longue :

En arrière-plan, Cloud SQL a deux limites pertinentes ici :

  • Connexions :elles correspondent à l'objet 'conn' dans votre code. Il existe une structure de données correspondante sur le serveur. Une fois que vous avez trop de ces objets (actuellement configurés à 1000), le moins récemment utilisé sera automatiquement fermé. Lorsqu'une connexion se ferme sous vous, vous obtiendrez une erreur de connexion inconnue (ApplicationError :1007) la prochaine fois que vous essaierez d'utiliser cette connexion.
  • Requêtes simultanées :il s'agit de requêtes qui s'exécutent sur le serveur. Chaque requête en cours d'exécution bloque un thread sur le serveur, il y a donc une limite de 100. Lorsqu'il y a trop de requêtes simultanées, les requêtes suivantes seront rejetées avec l'erreur que vous obtenez (ApplicationError :1033)

Il ne semble pas que la limite de connexion vous affecte, mais je voulais le mentionner au cas où.

En ce qui concerne les demandes simultanées, augmenter la limite peut aider, mais cela aggrave généralement le problème. Il y a deux cas que nous avons vus dans le passé :

  • Interblocage :une requête de longue durée verrouille une ligne critique de la base de données. Toutes les requêtes suivantes se bloquent sur ce verrou. L'application expire sur ces requêtes, mais elles continuent de s'exécuter sur le serveur, bloquant ces threads jusqu'à ce que le délai de blocage déclencheurs.
  • Requêtes lentes :chaque requête est vraiment très lente. Cela se produit généralement lorsque la requête nécessite un tri de fichier temporaire. L'application expire et relance la requête alors que la première tentative de requête est toujours en cours d'exécution et compte dans la limite des demandes simultanées. Si vous pouvez trouver votre temps de requête moyen, vous pouvez obtenir une estimation du nombre de QPS que votre instance mysql peut prendre en charge (par exemple, 5 ms par requête signifie 200 QPS pour chaque thread. Puisqu'il y a 100 threads, vous pouvez faire 20 000 QPS. 50 ms par requête signifie 2 000 RPS.)

Vous devez utiliser EXPLAIN et AFFICHER LE STATUT INNODB DU MOTEUR pour voir lequel des deux problèmes est en cours.

Bien sûr, il est également possible que vous ne génériez qu'une tonne de trafic sur votre instance et qu'il n'y ait tout simplement pas assez de threads. Dans ce cas, vous maximiserez probablement le processeur pour l'instance de toute façon, donc ajouter plus de threads n'aidera pas.