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

Connessione persa al server MySQL durante la query su query semplici casuali

La connessione a MySQL può essere interrotta in diversi modi, ma consiglierei di rivisitare la risposta di Mario Carrion poiché è una risposta molto saggia.

È probabile che la connessione sia interrotta perché condivisa con gli altri processi, causando errori del protocollo di comunicazione...

...questo potrebbe facilmente accadere se il pool di connessioni è legato al processo, cosa che credo sia, in ActiveRecord, il che significa che la stessa connessione potrebbe essere "estratta" più volte contemporaneamente in processi diversi.

La soluzione è che le connessioni al database devono essere stabilite solo DOPO il fork istruzione nel server delle applicazioni.

Non sono sicuro di quale server stai usando, ma se stai usando un warmup caratteristica - non farlo.

Se stai eseguendo chiamate al database prima della prima richiesta di rete, non farlo.

Una di queste azioni potrebbe potenzialmente inizializzare il pool di connessioni prima di fork ing si verifica, causando la condivisione del pool di connessioni MySQL tra i processi mentre il sistema di blocco non lo è.

Non sto dicendo che questa sia l'unica ragione possibile per il problema, come affermato da @sloth-jr, ci sono altre opzioni... ma la maggior parte di esse sembra meno probabile secondo la tua descrizione.

Nota a margine:

Ogni processo può contenere un certo numero di connessioni. Nel tuo caso, potresti avere fino a 500X36 connessioni . (vedi modifica)

In generale, il numero di connessioni nel pool può spesso essere uguale al numero di thread in ciascun processo (non dovrebbe essere inferiore al numero di thread, altrimenti la contesa rallenterà). A volte è bene aggiungerne altri a seconda dell'applicazione.

MODIFICA:

Mi scuso per aver ignorato il fatto che il conteggio dei processi faceva riferimento ai dati MySQL e non ai dati dell'applicazione.

Il conteggio dei processi che hai mostrato sono i dati del server MySQL, che sembra utilizzare un thread per schema IO di connessione . I dati di "Processo" contano effettivamente le connessioni attive e non processi o thread effettivi (sebbene dovrebbe tradursi anche nel numero di thread).

Ciò significa che su 500 connessioni possibili per processo di applicazione (ovvero, se stai utilizzando 8 processi per la tua applicazione, sarebbero 8X500=4.000 connessioni consentite) la tua applicazione ha aperto finora solo 36 connessioni.