Welche Verbindungsbeschränkungen gelten für Google Cloud SQL von App Engine und wie werden DB-Verbindungen am besten wiederverwendet?

8

Ich habe eine Google App Engine-App, die eine Google Cloud SQL-Instanz zum Speichern von Daten verwendet. Ich brauche meine Instanz in der Lage, Hunderte von Clients gleichzeitig zu bedienen, über erholsame Aufrufe, die jeweils zu einer oder einer Handvoll DB-Abfragen führen. Ich habe die Methoden, die DB-Zugriff benötigen, umbrochen und das Handle auf der DB-Verbindung in os.environ gespeichert. Siehe diese SO Frage / Antwort für im Grunde, wie ich es mache.

Sobald jedoch einige hundert Clients eine Verbindung zu meiner App herstellen und Datenbankanrufe auslösen, erhalte ich diese Fehler in den Fehlerprotokollen von Google App Engine (und meine App gibt natürlich 500 zurück):

%Vor%

Irgendwelche Tipps von erfahrenen Nutzern von Google App Engine und Google Cloud SQL? Vielen Dank im Voraus.

Hier ist der Code für den Decorator, den ich für Methoden verwende, die eine DB-Verbindung benötigen:

%Vor%     
JJC 03.05.2012, 02:46
quelle

2 Antworten

14

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

Lange Antwort:

Als Hintergrund hat Cloud SQL zwei Grenzen, 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 (derzeit auf 1000 konfiguriert) haben, wird das zuletzt verwendete automatisch geschlossen. Wenn eine Verbindung unter Ihnen geschlossen wird, erhalten Sie beim nächsten Versuch, diese Verbindung zu verwenden, einen unbekannten Verbindungsfehler (ApplicationError: 1007).
  • Concurrent Requests: Dies sind Abfragen, die auf dem Server ausgeführt werden. Jede ausführende Abfrage bindet einen Thread auf dem Server, daher gibt es eine Grenze von 100. Wenn zu viele gleichzeitige Anfragen vorhanden sind, werden nachfolgende Anfragen mit dem Fehler abgelehnt, den Sie erhalten (ApplicationError: 1033)

Es klingt nicht so, als ob das Verbindungslimit Sie betrifft, aber ich wollte es nur für den Fall erwähnen.

Wenn es zu Concurrent Requests kommt, kann das Erhöhen des Limits helfen, aber normalerweise wird das Problem dadurch noch verschlimmert. 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 Zeitüberschreitung der Anwendung wird bei diesen Abfragen überschritten, sie werden jedoch weiterhin auf dem Server ausgeführt, wobei diese Threads solange gebunden werden, bis Deadlock-Timeout löst aus.
  • Langsame Abfragen: Jede Abfrage ist wirklich 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 zählt gegen das Limit für gleichzeitige Anforderungen. Wenn Sie Ihre durchschnittliche Abfragezeit ermitteln können, erhalten Sie eine Schätzung, wie viele QPS Ihre mysql-Instanz unterstützen kann (z. B. 5 ms pro Abfrage bedeutet 200 QPS für jeden Thread. Da es 100 Threads gibt, könnten Sie 20.000 QPS pro Abfrage bedeutet 2000 QPS.)

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

Natürlich ist es auch möglich, dass Sie nur eine Tonne Verkehr in Ihrer Instanz fahren und es nicht genug Threads gibt. In diesem Fall wirst du wahrscheinlich sowieso die CPU für die Instanz ausschöpfen, also wird das Hinzufügen von mehr Threads nicht helfen.

    
Ken Ashcraft 03.05.2012, 17:09
quelle
4

Ich habe aus der Dokumentation gelesen und festgestellt, dass es ein Limit für 12 Verbindungen / Instanzen gibt:

Suchen Sie nach "Jede App Engine-Instanz darf nicht mehr als 12 gleichzeitige Verbindungen zu einer Google Cloud SQL-Instanz haben." in Ссылка

    
Lawrence Mok 01.09.2014 04:02
quelle