Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Was sind die Verbindungslimits für Google Cloud SQL von App Engine und wie lassen sich DB-Verbindungen am besten wiederverwenden?

Kurze Antwort:Ihre Abfragen sind wahrscheinlich zu langsam und der MySQL-Server hat nicht genug Threads, um alle Anfragen zu verarbeiten, die Sie ihm zu senden versuchen.

Lange Antwort:

Als Hintergrund hat Cloud SQL zwei Limits, die hier relevant sind:

  • Verbindungen:Diese entsprechen dem 'conn'-Objekt in Ihrem Code. Auf dem Server befindet sich eine entsprechende Datenstruktur. Sobald Sie zu viele dieser Objekte haben (derzeit auf 1000 konfiguriert), werden die am wenigsten verwendeten automatisch geschlossen. Wenn eine Verbindung unter Ihnen geschlossen wird, erhalten Sie einen unbekannten Verbindungsfehler (ApplicationError:1007), wenn Sie das nächste Mal versuchen, diese Verbindung zu verwenden.
  • Concurrent Requests:Dies sind Abfragen, die auf dem Server ausgeführt werden. Jede ausgeführte Abfrage bindet einen Thread auf dem Server, daher gibt es ein Limit von 100. Wenn es zu viele gleichzeitige Anfragen gibt, werden nachfolgende Anfragen mit dem Fehler abgelehnt, den Sie erhalten (ApplicationError:1033)

Es hört sich nicht so an, als würde Sie das Verbindungslimit betreffen, aber ich wollte es nur für den Fall erwähnen.

Wenn es um gleichzeitige Anfragen geht, kann eine Erhöhung des Limits hilfreich sein, aber es verschlimmert das Problem normalerweise. Es gibt zwei Fälle, die wir in der Vergangenheit gesehen haben:

  • Deadlock:Eine lange laufende Abfrage sperrt eine kritische Zeile der Datenbank. Alle nachfolgenden Abfragen blockieren diese Sperre. Die App läuft bei diesen Abfragen ab, aber sie laufen auf dem Server weiter und binden diese Threads bis zum Deadlock-Timeout Auslöser.
  • Langsame Abfragen:Jede Abfrage ist sehr, sehr langsam. Dies geschieht normalerweise, wenn die Abfrage eine temporäre Dateisortierung erfordert. Die Anwendung überschreitet das Zeitlimit und versucht die Abfrage erneut, während der erste Versuch der Abfrage noch ausgeführt wird und auf das Limit für gleichzeitige Anforderungen angerechnet wird. Wenn Sie Ihre durchschnittliche Abfragezeit finden, können Sie abschätzen, wie viele QPS Ihre MySQL-Instanz unterstützen kann (z. B. 5 ms pro Abfrage bedeuten 200 QPS für jeden Thread. Da es 100 Threads gibt, könnten Sie 20.000 QPS ausführen. 50 ms pro Abfrage bedeutet 2000 QPS.)

Sie sollten EXPLAIN verwenden und ENGINE INNODB STATUS ANZEIGEN um zu sehen, welches der beiden Probleme vorliegt.

Natürlich ist es auch möglich, dass Sie nur eine Menge Traffic auf Ihre Instanz treiben und es einfach nicht genug Threads gibt. In diesem Fall werden Sie wahrscheinlich ohnehin die CPU für die Instanz ausschöpfen, sodass das Hinzufügen weiterer Threads nicht hilft.