sql >> Database teknologi >  >> RDS >> Mysql

Hvad er forbindelsesgrænserne for Google Cloud SQL fra App Engine, og hvordan genbruger man bedst DB-forbindelser?

Kort svar:Dine forespørgsler er sandsynligvis for langsomme, og mysql-serveren har ikke nok tråde til at behandle alle de anmodninger, du forsøger at sende den.

Langt svar:

Som baggrund har Cloud SQL to grænser, der er relevante her:

  • Forbindelser:Disse svarer til 'conn'-objektet i din kode. Der er en tilsvarende datastruktur på serveren. Når du har for mange af disse objekter (aktuelt konfigureret til 1000), lukkes det mindst nyligt brugte automatisk. Når en forbindelse lukkes under dig, får du en ukendt forbindelsesfejl (ApplicationError:1007), næste gang du forsøger at bruge forbindelsen.
  • Samtidige anmodninger:Disse er forespørgsler, der udføres på serveren. Hver eksekverende forespørgsel binder en tråd i serveren, så der er en grænse på 100. Når der er for mange samtidige anmodninger, vil efterfølgende anmodninger blive afvist med den fejl, du får (ApplicationError:1033)

Det lyder ikke som om, at forbindelsesgrænsen påvirker dig, men jeg ville gerne nævne det for en sikkerheds skyld.

Når det kommer til samtidige anmodninger, kan det hjælpe at øge grænsen, men det gør normalt problemet værre. Der er to tilfælde, vi har set tidligere:

  • Deadlock:En lang kørende forespørgsel låser en kritisk række i databasen. Alle efterfølgende forespørgsler blokerer på den lås. Appen får timeout på disse forespørgsler, men de bliver ved med at køre på serveren og binder disse tråde indtil deadlock timeout udløsere.
  • Langsomme forespørgsler:Hver forespørgsel er virkelig, virkelig langsom. Dette sker normalt, når forespørgslen kræver en midlertidig filsortering. Programmet timeout og forsøger forespørgslen igen, mens det første forsøg med forespørgslen stadig kører og tæller mod grænsen for samtidig anmodning. Hvis du kan finde din gennemsnitlige forespørgselstid, kan du få et estimat over, hvor mange QPS din mysql-instans kan understøtte (f.eks. betyder 5 ms pr. forespørgsel 200 QPS for hver tråd. Da der er 100 tråde, kan du lave 20.000 QPS. 50 ms pr. forespørgsel betyder 2000 QPS.)

Du bør bruge EXPLAIN og VIS MOTOR INNODB STATUS for at se, hvilket af de to problemer, der foregår.

Det er selvfølgelig også muligt, at du bare kører et væld af trafik på din instans, og at der bare ikke er nok tråde. I så fald vil du sandsynligvis maxe cpu'en for instansen alligevel, så det hjælper ikke at tilføje flere tråde.



  1. Får de sidste 5 tegn i streng med mysql-forespørgsel

  2. Mysql join-tabeller

  3. Ændringer til en skrivbar partition kan mislykkes uventet

  4. MySQL-funktion til at finde antallet af arbejdsdage mellem to datoer