Risposta breve:le tue query sono probabilmente troppo lente e il server mysql non ha abbastanza thread per elaborare tutte le richieste che stai tentando di inviarlo.
Risposta lunga:
Come sfondo, Cloud SQL ha due limiti che sono rilevanti qui:
- Connessioni:corrispondono all'oggetto 'conn' nel tuo codice. Esiste una struttura dati corrispondente sul server. Una volta che hai troppi di questi oggetti (attualmente configurati su 1000), quello utilizzato meno di recente verrà automaticamente chiuso. Quando una connessione viene chiusa sotto di te, riceverai un errore di connessione sconosciuto (ApplicationError:1007) la prossima volta che proverai a utilizzare quella connessione.
- Richieste simultanee:si tratta di query in esecuzione sul server. Ogni query in esecuzione lega un thread nel server, quindi c'è un limite di 100. Quando ci sono troppe richieste simultanee, le richieste successive verranno rifiutate con l'errore che stai ricevendo (ApplicationError:1033)
Non sembra che il limite di connessione ti stia interessando, ma volevo menzionarlo per ogni evenienza.
Quando si tratta di richieste simultanee, aumentare il limite potrebbe essere d'aiuto, ma di solito peggiora il problema. Ci sono due casi che abbiamo visto in passato:
- Deadlock:una query con esecuzione prolungata blocca una riga critica del database. Tutte le query successive si bloccano su quel blocco. L'app scade per quelle query, ma continuano a essere eseguite sul server, bloccando quei thread fino a timeout deadlock trigger.
- Query lente:ogni query è molto, molto lenta. Questo di solito accade quando la query richiede un ordinamento di file temporaneo. L'applicazione scade e riprova la query mentre il primo tentativo della query è ancora in esecuzione e viene conteggiato rispetto al limite di richieste simultanee. Se riesci a trovare il tempo medio di query, puoi ottenere una stima di quanti QPS può supportare la tua istanza mysql (ad es. 5 ms per query significa 200 QPS per ogni thread. Poiché ci sono 100 thread, potresti fare 20.000 QPS. 50 ms per query significa 2000 QPS.)
Dovresti usare EXPLAIN e MOSTRA LO STATO INNODB DEL MOTORE per vedere quale dei due problemi sta succedendo.
Ovviamente, è anche possibile che tu stia semplicemente guidando un sacco di traffico sulla tua istanza e che non ci siano abbastanza thread. In tal caso, probabilmente esaurirai comunque la CPU per l'istanza, quindi l'aggiunta di più thread non sarà di aiuto.