sql >> Databáze >  >> RDS >> Mysql

Jaké jsou limity připojení pro Google Cloud SQL z App Engine a jak nejlépe znovu použít připojení DB?

Krátká odpověď:Vaše dotazy jsou pravděpodobně příliš pomalé a mysql server nemá dostatek vláken ke zpracování všech požadavků, které se mu pokoušíte odeslat.

Dlouhá odpověď:

Jako pozadí má Cloud SQL dva limity, které jsou zde relevantní:

  • Spojení:Odpovídají objektu 'conn' ve vašem kódu. Na serveru je odpovídající datová struktura. Jakmile budete mít příliš mnoho těchto objektů (aktuálně nakonfigurováno na 1000), automaticky se zavře ten, který byl naposledy použit. Když se připojení pod vámi uzavře, při příštím pokusu o použití tohoto připojení se zobrazí neznámá chyba připojení (ApplicationError:1007).
  • Souběžné požadavky:Jedná se o dotazy, které se spouštějí na serveru. Každý provádějící dotaz spojuje vlákno na serveru, takže je zde limit 100. Pokud existuje příliš mnoho souběžných požadavků, následující požadavky budou odmítnuty s chybou, kterou dostáváte (ApplicationError:1033)

Nezdá se, že by vás limit připojení ovlivňoval, ale chtěl jsem to pro jistotu zmínit.

Pokud jde o souběžné požadavky, zvýšení limitu může pomoci, ale obvykle to problém zhorší. V minulosti jsme viděli dva případy:

  • Zablokování:Dlouho běžící dotaz zamyká kritický řádek databáze. Všechny následující dotazy blokují tento zámek. U těchto dotazů vyprší časový limit aplikace, ale běží na serveru a spojují tato vlákna, dokud vypršel časový limit uváznutí spouštěče.
  • Pomalé dotazy:Každý dotaz je opravdu, ale opravdu pomalý. K tomu obvykle dochází, když dotaz vyžaduje dočasné řazení souborů. Aplikace vyprší časový limit a zopakuje dotaz, zatímco první pokus dotazu stále běží a počítá se do limitu souběžných požadavků. Pokud můžete zjistit průměrnou dobu dotazu, můžete získat odhad, kolik QPS může vaše instance mysql podporovat (např. 5 ms na dotaz znamená 200 QPS pro každé vlákno. Protože existuje 100 vláken, mohli byste udělat 20 000 QPS. 50 ms na dotaz znamená 2000 QPS.)

Měli byste použít EXPLAIN a ZOBRAZIT STAV MOTORU INNODB abyste viděli, který z těchto dvou problémů se děje.

Samozřejmě je také možné, že ve své instanci právě řídíte tuny provozu a prostě není dostatek vláken. V takovém případě pravděpodobně stejně budete maximalizovat CPU pro instanci, takže přidání dalších vláken nepomůže.



  1. Pokud nebude nalezen jeden řádek, vrátí výchozí hodnotu

  2. MySQL - SELECT * DO OUTFILE LOCAL ?

  3. SQL dotaz na více tabulek, s více spojeními a sloupcovým polem se seznamem odděleným čárkami

  4. Funkce MIN() v PostgreSQL