sql >> Databasteknik >  >> RDS >> Mysql

Vilka är anslutningsgränserna för Google Cloud SQL från App Engine, och hur återanvänder man DB-anslutningar på bästa sätt?

Kort svar:Dina frågor är förmodligen för långsamma och mysql-servern har inte tillräckligt med trådar för att behandla alla förfrågningar du försöker skicka den.

Långt svar:

Som bakgrund har Cloud SQL två gränser som är relevanta här:

  • Anslutningar:Dessa motsvarar 'conn'-objektet i din kod. Det finns en motsvarande datastruktur på servern. När du har för många av dessa objekt (för närvarande konfigurerade till 1000), stängs det senast använda objektet automatiskt. När en anslutning stängs under dig får du ett okänt anslutningsfel (ApplicationError:1007) nästa gång du försöker använda den anslutningen.
  • Samtidiga förfrågningar:Dessa är frågor som körs på servern. Varje exekverande fråga binder upp en tråd i servern, så det finns en gräns på 100. När det finns för många samtidiga förfrågningar, kommer efterföljande förfrågningar att avvisas med felet du får (ApplicationError:1033)

Det låter inte som att anslutningsgränsen påverkar dig, men jag ville nämna det för säkerhets skull.

När det gäller samtidiga förfrågningar kan det hjälpa att öka gränsen, men det förvärrar vanligtvis problemet. Det finns två fall vi har sett tidigare:

  • Deadlock:En lång pågående fråga låser en kritisk rad i databasen. Alla efterföljande frågor blockerar det låset. Appen tar tidsgräns för dessa frågor, men de fortsätter att köras på servern och binder samman dessa trådar tills timeout för dödläge utlösare.
  • Långsamma frågor:Varje fråga är riktigt, riktigt långsam. Detta händer vanligtvis när frågan kräver en tillfällig filsortering. Programmet tar en timeout och försöker igen frågan medan det första försöket med frågan fortfarande körs och räknas mot gränsen för samtidig begäran. Om du kan hitta din genomsnittliga frågetid kan du få en uppskattning av hur många QPS din mysql-instans kan stödja (t.ex. 5 ms per fråga betyder 200 QPS för varje tråd. Eftersom det finns 100 trådar kan du göra 20 000 QPS. 50 ms per fråga betyder 2000 QPS.)

Du bör använda EXPLAIN och VISA MOTORENS INNODB-STATUS för att se vilket av de två problemen som pågår.

Naturligtvis är det också möjligt att du bara kör massor av trafik på din instans och att det helt enkelt inte finns tillräckligt med trådar. I så fall kommer du förmodligen att maxa processorn för instansen ändå, så att lägga till fler trådar hjälper inte.



  1. mysql WHERE IN array sträng / användarnamn

  2. Använda markörer för personsökning i PostgreSQL

  3. mysql lagrad procedur:ut parameter

  4. 4 sätt att räkna rader i SQL Server-tabell med för- och nackdelar