sql >> Database >  >> RDS >> Mysql

Wat zijn de verbindingslimieten voor Google Cloud SQL van App Engine en hoe kun je DB-verbindingen het beste hergebruiken?

Kort antwoord:uw zoekopdrachten zijn waarschijnlijk te traag en de mysql-server heeft niet genoeg threads om alle verzoeken te verwerken die u probeert te verzenden.

Lang antwoord:

Als achtergrond heeft Cloud SQL twee limieten die hier relevant zijn:

  • Verbindingen:deze komen overeen met het 'conn'-object in uw code. Er is een bijbehorende datastructuur op de server. Zodra u te veel van deze objecten heeft (momenteel geconfigureerd op 1000), wordt de minst recent gebruikte automatisch gesloten. Wanneer een verbinding onder je wordt verbroken, krijg je een onbekende verbindingsfout (ApplicationError:1007) de volgende keer dat je die verbinding probeert te gebruiken.
  • Gelijktijdige verzoeken:dit zijn zoekopdrachten die op de server worden uitgevoerd. Elke uitvoerende query verbindt een thread in de server, dus er is een limiet van 100. Als er te veel gelijktijdige verzoeken zijn, worden volgende verzoeken afgewezen met de foutmelding die u krijgt (ApplicationError:1033)

Het klinkt alsof de verbindingslimiet u niet beïnvloedt, maar ik wilde het toch even vermelden voor het geval dat.

Als het gaat om gelijktijdige verzoeken, kan het helpen om de limiet te verhogen, maar meestal wordt het probleem erger. Er zijn twee gevallen die we in het verleden hebben gezien:

  • Deadlock:een langlopende query vergrendelt een kritieke rij van de database. Alle volgende zoekopdrachten blokkeren dat slot. De app geeft een time-out bij die vragen, maar ze blijven draaien op de server, en binden die threads tot de time-out voor deadlock triggers.
  • Langzame zoekopdrachten:elke zoekopdracht is echt, erg traag. Dit gebeurt meestal wanneer de query een tijdelijke bestandssortering vereist. De toepassing loopt een time-out en probeert de query opnieuw terwijl de eerste poging van de query nog steeds wordt uitgevoerd en wordt meegeteld voor de limiet voor gelijktijdige aanvragen. Als u uw gemiddelde querytijd kunt vinden, kunt u een schatting krijgen van hoeveel QPS uw mysql-instantie kan ondersteunen (bijv. 5 ms per query betekent 200 QPS voor elke thread. Aangezien er 100 threads zijn, kunt u 20.000 QPS doen. 50 ms per zoekopdracht betekent 2000 QPS.)

Gebruik EXPLAIN en TOON DE MOTOR INNODB STATUS om te zien welke van de twee problemen er aan de hand is.

Het is natuurlijk ook mogelijk dat u alleen maar een hoop verkeer op uw instantie genereert en dat er gewoon niet genoeg threads zijn. In dat geval maximaliseert u waarschijnlijk toch de cpu voor de instantie, dus het toevoegen van meer threads zal niet helpen.



  1. Moet 100000 rijen in mysql invoegen met slaapstand in minder dan 5 seconden

  2. java.sql.SQLException:ORA-03115:niet-ondersteund datatype of representatie van het netwerk

  3. PostgreSQL-training voor MySQLers

  4. MySQL - woorden vinden die het gezochte trefwoord omringen