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

mysql TIME_WAIT; problema di troppe connessioni

Se un client si connette a un server MySQL, di solito apre una porta locale, ad esempio:

 localhost:12345 -> mysqlserver:3306

Se il client chiude la connessione, il client ottiene un TIME_WAIT. A causa dell'instradamento TCP, un pacchetto potrebbe arrivare in ritardo sulla porta temporanea. Una connessione in TIME_WAIT scarta semplicemente questi pacchetti. Senza TIME_WAIT, la porta locale potrebbe essere riutilizzata per un'altra connessione e potrebbe ricevere pacchetti da una precedente connessione.

Su un'applicazione molto frequente sul web che apre una connessione mysql per richiesta, è prevedibile un'elevata quantità di connessioni TIME_WAIT. Non c'è niente di sbagliato in questo.

Possono verificarsi problemi se l'intervallo di porte locali è troppo basso, quindi non è più possibile aprire le connessioni in uscita. Il normale timeout è impostato su 60 secondi. Quindi un problema può già verificarsi su più di 400 richieste al secondo su intervalli bassi.

Verifica:

Per verificare la quantità di TIME_WAIT, puoi utilizzare il seguente comando:

$ cat /proc/net/sockstat
sockets: used 341
TCP: inuse 12 orphan 0 tw 33365 alloc 23 mem 16
UDP: inuse 9 mem 2
UDPLITE: inuse 0
RAW: inuse 0
FRAG: inuse 0 memory 0

Il valore dopo "tw", in questo caso 33365, mostra l'importo di TIME_WAIT.

Soluzioni:

un. Ottimizzazione TIME_WAIT (esempi di sistemi operativi basati su Linux):

Riduci il timeout per TIME_WAIT:

# small values are ok, if your mysql server is in the same local network
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout

Aumenta l'intervallo di porte per le porte locali:

# check, what you highest listening ports are, before setting this
echo 15000 65000 > /proc/sys/net/ipv4/ip_local_port_range

Le impostazioni /proc/sys/net/ipv4/tcp_tw_recycle e /proc/sys/net/ipv4/tcp_tw_reuse potrebbe essere anche interessante. (Ma abbiamo riscontrato strani effetti collaterali con queste impostazioni, quindi è meglio evitarli. Maggiori informazioni in questo risposta )

b. Connessioni persistenti

Alcuni linguaggi di programmazione e librerie supportano connessioni persistenti. Un'altra soluzione potrebbe essere l'utilizzo di un proxy installato localmente come "ProxySQL". Ciò riduce la quantità di connessioni nuove e chiuse.