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.